2013-12-09 195 views
0

所以我知道你可以使用Pexpect來解決這個問題,但我不想依賴額外的庫來解決除Python3提供的問題以外的其他問題。Python + SSH密碼驗證(無需外部庫或公鑰/私鑰)?

我也知道生成公共密鑰並允許它們在遠程主機上是理想的,但這就是我打算使用此腳本(在正確位置設置密鑰等)的一種方式。

這是我從SO社區獲得的一大堆幫助之後獲得的「我自己的」。 我很困難檢查分叉的子僞終端是否執行了它應該與否。這意味着我可以判斷SSH是否執行完畢,因爲只要run()函數正在運行,它就會持續運行。

(我pid_exists將返回True,只要它的run()的操作中。如果我退出run()迅速SSH會話將沒有足夠的時間去做它應該做的)

#!/usr/bin/python 

import pty, sys 
from subprocess import Popen, PIPE, STDOUT 
from time import sleep 
from os.path import expanduser, abspath 
from os import walk, setsid, fork, waitpid, execv, read, write, kill 

def pid_exists(pid): 
    """Check whether pid exists in the current process table.""" 
    if pid < 0: 
     return False 
    try: 
     kill(pid, 0) 
    except (OSError, e): 
     return e.errno == errno.EPERMRM 
    else: 
     return True 

class ssh(): 
    def __init__(self, host, execute='echo "done" > /root/testing.txt', user='root', password=b'SuperPassword'): 
     self.exec = execute 
     self.host = host 
     self.user = user 
     self.password = password 
     self.run() 

    def run(self): 
     command = [ 
       '/usr/bin/ssh', 
       self.user+'@'+self.host, 
       '-o', 'NumberOfPasswordPrompts=1', 
       self.exec, 
     ] 

     # PID = 0 for child, and the PID of the child for the parent  
     pid, child_fd = pty.fork() 

     if not pid: # Child process 
      # Replace child process with our SSH process 
      execv(command[0], command) 

     while True: 
      output = read(child_fd, 1024).strip() 
      print(output) 
      lower = output.lower() 
      # Write the password 
      if b'password:' in lower: 
       write(child_fd, self.password + b'\n') 
       break 
      elif 'are you sure you want to continue connecting' in lower: 
       # Adding key to known_hosts 
       write(child_fd, b'yes\n') 
      elif 'company privacy warning' in lower: 
       pass # This is an understood message 
      else: 
       print('Error:',output) 

     sleep(5) 
     print(pid_exists(pid)) 

ssh('10.10.10.1') 

我找不到很多(或任何)有關如何獲取Python打開並傳輸給我的僞僞終端的執行過程的信息。 我可以或應該參與子過程:https://stackoverflow.com/a/12235442/929999或有其他方法嗎?

回答