2011-07-24 154 views
1

正在使用Pexpect的ssh來寫下一個腳本編譯命令選項,ssh的自動化看起來像這樣,Pexpect的SSH無法處理

enter code here 
child = ssh_expect('root', server2, cmd) 
child.expect(pexpect.EOF) 
print child.before 

其中cmd是這樣的:

cmd = "./configure CFLAGS=\"-g -O0 -DDEBUG\"" 

的問題發生在於它說,

configure: error: unrecognized option: -O0 

而如果使用commands.getoutput運行相同的命令,則它會正確執行。

問題這種錯誤正在產生的問題是什麼,我該如何根除這一錯誤?

在此先感謝:)

+0

ssh_expect函數是否是您自己創建的?它到底做了什麼? –

+0

yes Erik,ssh_expect是由我創建的只是使用pexpect,它的工作方式如下,ssh_expect(user,hostname,cmd): ssh_newkey ='你確定要繼續連接' child = pexpect.spawn('ssh- l%s%s%s'%(user,hostname,cmd),timeout = 3600) child.sendline('yes') child.expect('password:') – OpenFile

回答

0

它的工作,如果你正在做commands.getoutput的原因是,所有的命令有雖然shell中運行,這將解析您的命令行和理解,雙引號之間有什麼後CFLAGS是部分相同的參數。

當您通過pexpect運行cmds時,不涉及shell。而且,當你在ssh命令行上提供命令時,ssh連接的另一端沒有涉及shell,因此沒有任何內容將CFLAGS解析爲一個參數。因此,取代配置腳本獲取一個參數(CFLAGS = \「 - g -O0 -DDEBUG \」),它會得到三個參數('CFLAGS = -g','-O0','-DDEBUG')。

如果可能,請避免發送參數以空格分隔的命令。看起來好像可以取而代之的是一個參數列表。工作代碼示例:

#/usr/bin/env python 

import pexpect 

def ssh_expect(user, hostname, cmd): 
    child = pexpect.spawn("ssh", ["%[email protected]%s" % (user, hostname)] + cmd, timeout=3600) 

    return child 

child = ssh_expect("root", "server.example.com", ["./configure", "CFLAGS=\"-g -O0 -DDEBUG\""]) 
child.expect(pexpect.EOF) 
print child.before 
+0

感謝Eric的解答, – OpenFile