2013-07-24 72 views
2

我使用以下代碼來在遠程計算機上執行命令的ifconfig輸出,無法看到使用的paramiko

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。

任何想法如何解決這個問題? 在此先感謝...

+0

'print stderr.read()'說什麼? – falsetru

+0

'print stderr.read()'不顯示任何消息。 – neo

回答

4

您的服務器有可能區分交互式SSH會話和非交互式SSH會話,併爲不同的會話運行不同的啓動腳本。嘗試在遠程主機上運行echo $PATH,通過paramiko SSH會話和一個常規交互式的會話並比較輸出。

對於解決方法,您可以在交互式會話中在遠程服務器上執行which ifconfig以獲取絕對路徑並在paramiko命令中使用該路徑。

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

注意 在我的一臺主機的echo $PATH從的paramiko SSH客戶端的結果是/usr/bin:/bin,而在交互式會話是/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin,並ifconfig確實是位於/usr/sbin,即路徑之外paramiko會議。

+0

謝謝Henrik的幫助。 – neo

1

爲了讓輸出的某些應用程序二進制文件,你必須使用標誌: get_pty =真

我仍然在尋找它發生了一些命令的原因,這對我來說還未知。但是我發現來解決此問題的方法在下面的例子所示:

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,總是輸入要運行的應用程序的完整路徑,例如:/ usr/bin/my_binary或在你的情況/ sbin/ifconfig

我希望這可以幫助你解決問題。 祝你好運!