2011-08-24 129 views
4

我想寫一個python腳本,可以ssh到遠程服務器,並可以執行簡單的命令,如ls,cd從python客戶端。但是,在成功將ssh傳入服務器後,我無法從僞終端讀取輸出。任何人都可以在這裏幫助我,這樣我就可以在服務器上執行一些命令。使用os.forkpty()創建一個僞終端ssh到遠程服務器,並與它通信

下面是示例代碼:

#!/usr/bin/python2.6 
import os,sys,time,thread 
pid,fd = os.forkpty() 
if pid == 0: 
    os.execv('/usr/bin/ssh',['/usr/bin/ssh','[email protected]',]) 
    sys.exit(0) 
else: 
    output = os.read(fd,1024) 
    print output 
    data = output 
    os.write(fd,'password\n') 
    time.sleep(1) 
    output = os.read(fd,1024) 
    print output 
    os.write(fd,'ls\n') 
    output = os.read(fd,1024) 
    print output 

輸出示例:

[email protected]'s password: 

Last login: Wed Aug 24 03:16:57 2011 from 1x.x.x.xxxx 

-bash: ulimit: open files: cannot modify limit: Operation not permitted 
host: /home/user>ls 
+0

你試圖在這裏做什麼會更好地與公共密鑰來完成,至少密碼的一部分。 – glglgl

+0

我猜你還沒聽說過[fabric](http://docs.fabfile.org/en/1.2.1/index.html)? – zeekay

回答

2

如前所述,最好使用公共密鑰。正如我通常使用它們,我已經改變了你的程序,以便它在這裏工作。

#!/usr/bin/python2.6 
import os,sys,time,thread 
pid,fd = os.forkpty() 
if pid == 0: 
    os.execv('/usr/bin/ssh',['/usr/bin/ssh','localhost',]) 
    sys.exit(0) 
else: 
    output = os.read(fd,1024) 
    print output 
    os.write(fd,'ls\n') 
    time.sleep(1) # this is new! 
    output = os.read(fd,1024) 
    print output 

隨着加入sleep(1),我給遠程主機(或者,在我的情況下,不那麼遠程主機)的時間來處理ls命令併產生其輸出。

如果您發送ls並立即閱讀,您只能閱讀當前的內容。也許你應該閱讀一個循環左右。

,或者你應該這樣來做:

import subprocess 
sp = subprocess.Popen(("ssh", "localhost", "ls"), stdout=subprocess.PIPE) 
print sp.stdout.read() 
+1

>>如果您發送ls並立即閱讀,您只能閱讀當前的內容。也許你應該閱讀一個循環左右。 –

+0

感謝glglgl 但在一個連續的循環讀取數據時,該處理卡在os.read 片斷從代碼 輸出= os.read(FD,1) 而輸出: 輸出= os.read(FD, 1)#it似乎一直在等待 –

+0

這是另一個問題。嘗試將fd設置爲非阻塞,也許有幫助。或者使用'select()'。 – glglgl

相關問題