2014-03-06 79 views
3

我想學習一點關於pexpect:特別是我試圖從我的筆記本電腦複製文件到遠程服務器。 我遇到一個奇怪的行爲:或多或少相同的代碼工作,如果我一行一行寫,但它不會如果我作爲腳本運行它。 這是我寫的行由行:scp到遠程服務器使用pexpect

child = pexpect.spawn('scp pathdir/file.ext [email protected]:pathdir') 
r=child.expect ('assword:') 
r 

返回0,我完成這項工作與密碼

child.sendline ('password') 

當我做ssh來,我發現我的文件中有服務器。所以我收集了一個腳本中的所有步驟;它退出沒有錯誤,但它沒有被複制的文件...爲什麼?但更重要的是,我該如何解決這個問題?

下面是腳本:

child = pexpect.spawn('scp pathdir/file.ext [email protected]:pathdir') 
r=child.expect ('assword:') 
print r 
if r==0: 
    child.sendline ('password') 
child.close() 

我不知道Pexpect的是如何工作的,所以我印記R,以確保它是0。它是。

+0

你是否從'file.ext'所在的文件夾開始腳本? – njzk2

+0

是:腳本和file.ext位於同一目錄中。然而,這個問題需要編輯:file.ext以其完整路徑給出。 – user2988577

+0

遇到同樣的問題。你現在解決了嗎? – laike9m

回答

1

我最近遇到了「相同」的問題。這是我做到的。我希望這一定會幫助你。

你的問題: I'm not sure how pexpect works so I print r to be sure it is 0. And it is.

是的,它是零。

嘗試下面的代碼:

try: 
     var_password = "<YOUR PASSWORD>" Give your password here 
     var_command = "scp pathdir/file.ext [email protected]:pathdir" 
     #make sure in the above command that username and hostname are according to your server 
     var_child = pexpect.spawn(var_command) 
     i = var_child.expect(["password:", pexpect.EOF]) 

     if i==0: # send password     
       var_child.sendline(var_password) 
       var_child.expect(pexpect.EOF) 
     elif i==1: 
       print "Got the key or connection timeout" 
       pass 

    except Exception as e: 
     print "Oops Something went wrong buddy" 
     print e 

child.expect可以接受多個參數。在這種情況下,你必須以列表的形式發送這些參數。在上述情況下,如果pexpect.spawn的輸出是「密碼:」,然後i將獲得0作爲輸出,如果EOF遇到代替「密碼」則i的值爲1

我希望這將清除你的疑問。如果沒有,然後讓我知道。我會盡力爲你解釋。

0

child.sendline('password') 

寫入發送密碼後:

child.expect(pexpect.EOF) 

此等待,直到文件複製完成後

0

我遇到了同樣的問題。當我將客戶端的主目錄(〜/)指定爲目的地時,發生了這種情況。這在手動鍵入scp命令時正常工作,但由於某些原因,在使用pexpect時不起作用。簡單地使用相對或絕對目標目錄路徑解決了我的問題。

相關問題