2012-06-26 69 views
2

需要幫助與pexpect模塊需要與pexpect模塊的一點幫助

我已經寫了一個簡單的代碼,將從服務器使用ssh克隆git存儲庫。 我正面臨着一些問題。

密碼以純文本顯示。

我不知道下載後退出程序的正確方法。它拋出了以下錯誤...

Traceback (most recent call last): 
File "ToDelete3.py", line 65, in <module> 
    # # if i == 1: 
File "ToDelete3.py", line 36, in getRepository 
    i = p.expect([ssh_key,'password:',pexpect.EOF]) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1492, in interact 
    self.__interact_copy(escape_character, input_filter, output_filter) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1520, in __interact_copy 
    data = self.__interact_read(self.child_fd) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1510, in __interact_read 
    return os.read(fd, 1000) 
OSError: [Errno 5] Input/output error 

我寫到目前爲止代碼:

command = 'git clone ssh://[email protected]/something.git' 
ssh_key = 'Are you sure you want to continue connecting' 

def gracefulExit(): 
    print 'Password Incorrect !!!' 
    os._exit(1) 

def getRepository(): 
    p = pexpect.spawn(command,maxread=10000,timeout = 100) 
    p.logfile = sys.stdout # logs out the command 
    i = p.expect([ssh_key,'password:',pexpect.EOF]) 
    if i == 0: 
     print 'Inside sshkey' 
     p.sendline('yes') 
     i = p.expect([ssh_key,'password:',pexpect.EOF]) 
    if i == 1: 
     try: 
      p.sendline('mypassword') # this mypassword is shown in clear text on the console 
      p.interact() 
      p.logfile = sys.stdout 
      p.expect(pexpect.EOF) 
     except Exception,e: 
      print str(e) 
      gracefulExit() 
    if i == 2: 
     print 'Inside EOF block' 
     if p.isalive(): 
      print '******************************************************' 
      print '   Closing the process of Download !!!   ' 
      print '******************************************************\n\n' 
      p.close() 

任何輸入的高度讚賞..

感謝。 -Vijay

回答

3

有一些錯誤的程序:

p.interact() 

,當我們想爲自動後拿回控制這是用來提供使用Pexpect的模塊的密碼。由於您將整個存儲庫自動檢出,因此不需要使用它。

在傳遞密碼後,還可以改進一些事情,設置無限超時,因爲它可能需要一段時間才能複製git存儲庫。

p.expect(pexpect.EOF, timeout=None) 

之後,你可以閱讀所有執行輸出用下面的命令

output_lines = p.before 
output_lines_list = output_lines.split('\r\n') 
for line in output_lines: print line 

你也可以用上面的記錄輸出到文件中直接寫入它

使用p.logifile = sys.stdout不好,因爲它會記錄從包括密碼傳遞在內的啓動操作。

在此之後沒有必要關閉,您沒有運行交互式程序。刪除所有這些行:

if i == 2: 
     print 'Inside EOF block' 
     if p.isalive(): 
      print '******************************************************' 
      print '   Closing the process of Download !!!   ' 
      print '******************************************************\n\n' 
      p.close() 

的問題是,一些地方,你必須存儲密碼,並p.sendline使用它。如何,你存儲密碼,這將是不安全的。您也可以在開始時輸入密碼,這樣您就不會在程序中存儲密碼,但會影響自動化。我看不到出路,但採取密碼輸入,你可以這樣做:

import getpass 
getpass.getpass("please provide your password") 
+0

感謝Pyfunc像寶石一樣工作。感謝您的詳細解釋。有助於更好地理解它..對不起,對於遲到的答覆..是的,確實工作..但一個問題,但。它在我輸入時不顯示密碼,但在此之後看起來像p.logfile = sys.stdout莫名其妙地在終端中以純文本輸出密碼。任何方式來避免這種情況.. – user596922

+0

這有幫助。謝謝 !! – user596922

0

爲了擺脫的密碼被回顯到標準輸出,使用重定向時,下面的輸出 -

p.logfile_read = sys.stdout # logs out the command 

我已經試過這個我自己,似乎工作。 Here是這個啓示的參考。