2011-12-07 86 views
2

我需要在ssh登錄到服務器,執行「su username」(無密碼)以執行某些命令(沒有用ssh直接登錄)。在paramiko ssh連接上執行su用戶(無密碼)

從終端會是這樣的:

[email protected]:~# su foo 
[email protected]:/root$ cd 
[email protected]:~$ ls 

我已經試過的paramiko(蟒蛇)要做到這一點:

import paramiko 
ssh = paramiko.SSHClient() 

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

ssh.connect('host', username='root', password='mypassword', key_filename='<filename>') 

stdin, stdout, stderr = ssh.exec_command('su foo') 
print stdout.readlines() 
stdin, stdout, stderr = ssh.exec_command('cd') 
print stdout.readlines() 
stdin, stdout, stderr = ssh.exec_command('pwd') 
print stdout.readlines() 
ssh.close() 

但劇本還沒有結束。

日誌是這些:

... 
DEB [20111207-16:22:25.538] thr=1 paramiko.transport: userauth is OK 
INF [20111207-16:22:25.921] thr=1 paramiko.transport: Authentication (publickey) successful! 
DEB [20111207-16:22:25.923] thr=2 paramiko.transport: [chan 1] Max packet in: 34816 bytes 
DEB [20111207-16:22:26.088] thr=1 paramiko.transport: [chan 1] Max packet out: 32768 bytes 
INF [20111207-16:22:26.088] thr=1 paramiko.transport: Secsh channel 1 opened. 
DEB [20111207-16:22:26.151] thr=1 paramiko.transport: [chan 1] Sesch channel 1 request ok 

如果我只有這個嘗試:

stdin, stdout, stderr = ssh.exec_command('su foo') 
#without print 
stdin, stdout, stderr = ssh.exec_command('pwd') 
print stdout.readlines() 

它執行PWD爲根,而不是FOO。

怎麼了?

回答

6

每個exec_command()調用發生在一個新的shell中,所以沒有狀態從以前的命令中繼承。如果命令依靠先前的命令執行,則必須以單個語句或腳本形式發送它們。如果你想要一個交互式shell,有invoke_shell命令,但是你需要解析shell輸出來模擬交互式使用(這裏可以使用pexpect庫)。

您可以使用sudo命令或su -c執行該命令。但是,我會建議配置所需用戶的安全登錄,並以該用戶的身份直接連接。

+0

thx。我的目標是打電話給su用戶,然後cd(去他的家),然後svn在那個目錄。有辦法連接這個,或者在paramiko中維護狀態嗎? – apelliciari

+1

'su foo -c「svn up/home/foo」'是一種可能性。首先在命令行中進行編寫,因爲這與paramiko無關。這並不是說你無法在paramiko中「維護狀態」,而是你正在執行兩個獨立的shell。 – JimB