2013-07-23 66 views
0

我試圖執行下面的代碼,它向我提供每一個ssh命令的密碼,儘管我在代碼中提供了我的密碼。任何人都可以告訴我我犯了什麼錯誤。在此先感謝對於每一個ssh命令都要求輸入密碼,Python

import signal 
from subprocess import call, PIPE, Popen 
from time import sleep 
import os, pty 
class SshCmd: 

    socket = '' 
    pid = 0 
    password = None 

    def __init__(self, password = None): 
     if password: 
      SshCmd.password = password 

      # start agent 
      devnull = open(os.devnull, 'w') 
      call(['killall', 'ssh-agent'], stderr=devnull) 
      process = Popen('/usr/bin/ssh-agent', stdout=PIPE, stderr=devnull) 
      stdout, stderr = process.communicate() 
      lines = stdout.splitlines() 
      SshCmd.socket = lines[0].decode().split(';')[0].split('=')[1] 
      SshCmd.pid = lines[1].decode().split(';')[0].split('=')[1] 
      devnull.close() 

      # unlock key 
      pid, fd = pty.fork() 
      if 0 == pid: 
       # child adds key 
       os.execve('/usr/bin/ssh-add', ['/usr/bin/ssh-add'], \ 
        {'SSH_AUTH_SOCK': SshCmd.socket, 'SSH_AGENT_PID': SshCmd.pid}) 
      else: 
       # parent send credentials 
       cmsg = os.read(fd, 1024) 
       os.write(fd, SshCmd.password.encode()) 
       os.write(fd, os.linesep.encode()) 
       cmsg = os.read(fd, 1024) 
       if len(cmsg) <= 2: 
        os.waitpid(pid, 0) 
       else: 
        os.kill(pid, signal.SIGTERM) 

    def execve(self, path, args, env = {}): 
     if not SshCmd.password: 
      return 
     pid = os.fork() 
     if 0 == pid: 
      env['SSH_AUTH_SOCK'] = SshCmd.socket 
      env['SSH_AGENT_PID'] = SshCmd.pid 
      os.execve(path, args, env) 
     else: 
      os.waitpid(pid, 0) 

    def ssh(self, user, host, cmd, args = []): 
     cmdLine = cmd 
     for arg in args: 
      cmdLine += ' ' 
      cmdLine += arg 
     self.execve('/usr/bin/ssh', 
       ['/usr/bin/ssh', 
       '-o', 
       'UserKnownHostsFile=/dev/null', 
       '-o', 
       'StrictHostKeyChecking=false', 
       '%(user)[email protected]%(host)s' % {'user': user, 'host': host}, 
       cmdLine]) 

if '__main__' == __name__: 
    other = SshCmd('passowrd') 
    other.ssh('root', 'host', '/sbin/ifconfig') 
    other.ssh('root', 'host', 'ping', ['-c', '5', 'localhost']) 

回答

0

你是不是犯了一個錯誤。爲了跳過密碼步驟,您需要預先驗證您的請求,您可以先使用命令ssh-copy-id執行此操作。它將存儲憑證並允許通過密鑰進行連接。首先需要一個密鑰,您可以使用ssh-keygen

創建注意:這些命令可能會根據linux分配而變化。

+0

這就是做這件事的方法。另外請注意:永遠不要以純文本存儲密碼! – tamasgal

相關問題