4

以下のコードを使用して、リモート マシンでコマンドを実行しています。

import paramiko
import os
dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect('192.168.1.5', username='root', password='asdfghhh')

import os

stdin, stdout, stderr = dssh.exec_command('ls')
print stdout.read()
stdin, stdout, stderr = dssh.exec_command('ifconfig')
print stdout.read()
stdin, stdout, stderr = dssh.exec_command('ps')
print stdout.read()
dssh.close()

プログラムを実行すると、ls と ps およびその他のコマンド出力を表示できます。ただし、ifconfig o/p は観察されません。

この問題を解決する方法はありますか?前もって感謝します...

4

2 に答える 2

6

サーバーがインタラクティブな SSH セッションと非インタラクティブな SSH セッションを区別し、セッションごとに異なる起動スクリプトを実行している可能性があります。echo $PATHparamiko SSH セッションと通常のインタラクティブ セッションを介してリモート ホストで実行し、出力を比較します。

回避策which ifconfigとして、インタラクティブ セッションでリモート サーバー上で a を実行して絶対パスを取得し、それを paramiko コマンドで使用できます。

stdin, stdout, stderr = dssh.exec_command('/abs/path/to/ifconfig')

私のホストの 1 つでecho $PATH、paramiko SSH クライアントからの結果は でし/usr/bin:/binたが、対話型セッションでは/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/binであり、ifconfig実際には/usr/sbin、paramiko セッションのパスの外にありました。

于 2013-07-24T07:41:59.983 に答える
1

特定のアプリケーション バイナリの出力を取得するには、次のフラグを使用する必要があります: get_pty=True

一部のコマンドで発生する理由をまだ探していますが、まだ不明です。ただし、この問題を回避するために私が見つけた方法を以下の例に示します。

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('10.2.0.230', username='ibmsys1', password='passw0rd', timeout=5)
stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig', timeout=3, get_pty=True)

print stdout.read()

通常、私は実行します: #stdin, stdout, stderr = ssh.exec_command('/sbin/ifconfig')

私の例では、2 つの新しいフラグを追加しただけでtimeout=3get_pty=True これで問題が解決しました。タイムアウト フラグは関係ありませんが、私は常に良い習慣として使用しています。ここでのポイントは、get_pty=True PS の使用です。システム $PATH を信頼しないことをお勧めします。実行するアプリケーションのフル パスを常に入力してください。

これが問題の回避に役立つことを願っています。幸運を!

于 2013-08-27T17:37:31.050 に答える