10

別のマシンに ssh するときに、自分の paramiko ssh セッションが、マシンに手動で ssh したときと同じシステム PATH を認識しないという問題に直面しています。ここに私のpythonコードがあります:

cmd = "echo $PATH"
try:
    ssh.connect(ip, username=username, password=password)
except Exception as ex:
    raise Exception("Failed to connect to %s with credentials username='%s' password='%s' %s" \
          % (ip, username, password, ex.message) )

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
output = ssh_stdout.read()

出力には /usr/bin:/bin が表示されますが、マシンに手動で ssh すると、システム PATH に他のパスがいくつかあります。助けてください。

4

2 に答える 2

15

exec_command() を使用する場合、bashrc またはプロファイル スクリプトはソースされていないと思います。たぶん、次のことを試してください:

stdin, stdout, stderr = ssh.exec_command("bash -lc 'echo $PATH'")
my_path = stdout.read().rstrip()

問題が、通常は PATH にあるコマンドを実行しようとしているが、exec_command() を使用するときにはそうではない場合、コマンドを絶対パスで呼び出す方がよいでしょう ("which [command]" を実行します)。他のマシンに通常どおりログインして、それが何であるかを確認したとき)。

于 2013-09-06T19:38:45.370 に答える
8

コマンドを実行する前に bash_profile をロードすることをお勧めします。そうしないと、「コマンドが見つかりません」という例外が発生する可能性があります。

たとえばcommand = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql',Mysql テーブルをダンプする目的でコマンドを記述します。

次に、ダンプ コマンドを入力する前に、bash_profile を手動でロードする必要があります. ~/.profile; .~/.bash_profile;

my_command  = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql;'

pre_command = """
. ~/.profile;
. ~/.bash_profile;
"""

command = pre_command + my_command

stdin, stdout, stderr = ssh.exec_command(command)
于 2014-12-31T11:19:12.873 に答える