2013-03-20 57 views
3

我们使用多组预定义的这里的密码测试服务器 - 我想尝试一种便携式的Python SSH库(类似下面 - spur.py),并得到它的每一个尝试连续 - 但显然停止时,它是成功连接或无法连接 - 请求我输入密码。我想了解异常处理后的某种递归。我如何在Python中递归地尝试不同的SSH密码?

def ssh_connection(user, host): 
    try: 
     shell = spur.SshShell(
      hostname=host, 
      port=findport(host), 
      username=user, 
      password="abc123", 
      private_key_file= expanduser("~") + "/.ssh/id_rsa", 
      missing_host_key=spur.ssh.MissingHostKey.accept 
      ) 
     shell.run(["true"]) 
     return shell 
    except spur.ssh.ConnectionError as error: 
     print error 
     raise 

来自Java世界我会检查对象是否为空,并遍历列表直到结束,然后要求输入密码。我看不出如何做到这一点在Python ......这是我发现的列表一部分的例子:

passwords = ['abc123', 'abc456', 'abc789'] 
for password in passwords:  # Second Example 
    print 'trying password :', password 
+1

在函数的except部分,只返回'None'而不是'print'和'raise',然后遍历它检查值是否为'None'。 – 2013-03-20 14:12:48

+0

你为什么同时使用sshkeys和密码? – 2013-03-20 14:46:42

+0

@JonathanVanasco脚本的其余部分将SSH密钥部署到服务器,所以这就是为什么我尝试使用多重密码 - 以获得无密码登录。 – dueyfinster 2013-03-20 14:58:52

回答

2

乔在评论中提到的,你可以做同样的事情:

def ssh_connection(user, host, passwords): 
    err = None 
    for password in passwords: 
     try: 
      shell = spur.SshShell(
       hostname=host, 
       port=findport(host), 
       username=user, 
       password=password, 
       private_key_file= expanduser("~") + "/.ssh/id_rsa", 
       missing_host_key=spur.ssh.MissingHostKey.accept 
      ) 
      shell.run(["true"]) 
      return shell 
     except spur.ssh.ConnectionError as error: 
      err = error 
    if err: 
     raise error  
+0

工作时,我把它包什么 - 感谢@Joe Doherty和自己Ifthikan - 我为其他人发布了完整的代码。 – dueyfinster 2013-03-20 15:15:08

0

我将削减它在2层不同的功能:以上

def ssh_connection(user, host, password): 
    """ 
    try to connect to user:[email protected] 
    return None if failed 
    """ 

    try: 
     shell = spur.SshShell(
      hostname=host, 
      port=findport(host), 
      username=user, 
      password=password, 
      private_key_file=expanduser("~") + "/.ssh/id_rsa", 
      missing_host_key=spur.ssh.MissingHostKey.accept 
      ) 
     shell.run(["true"]) 
     return shell 
    except spur.ssh.ConnectionError as error: 
     print error 
     return 



def try_connection(user, host, passwords): 
    """ 
    try all password in passwords to connect to host 
    if all failed, ask for password via stdin 
    """ 
    for password in passwords: 
     conn = ssh_connection(user, host, password) 
     if not conn is None: 
      break 
    else: 
     # we never hit the break: ask for passwd 
     password = "" 
     while conn is None: 
      print "please insert password for %[email protected]%s (empty for exit)" % (user,host) 
      password = raw_input("passwd:") # todo : insert Term seq for hide passwd and then restor 
      if password == "": 
       sys.exit(1) 
      conn = ssh_connection(user, host, password) 
    return conn 
0

我的意见得到了错位,所以这里是从Ifthikan与代码中使用@Joe多赫蒂建议 - 谢谢!

def loop_ssh_connection(user, host): 
     shell = None 
     passw = ['abc123', 'abc456', 'abc789'] 
     while shell is None: 
      shell = ssh_connection(user, host, passw) 
     result = shell.run(["ls", "-l"]) 
     print result.output # prints ouput 

def ssh_connection(user, host, passw): 
    err = None 
    for password in passw: 
     try: 
      shell = spur.SshShell(
       hostname=host, 
       port=findport(host), 
       username=user, 
       password=password, 
       private_key_file= expanduser("~") + "/.ssh/id_rsa", 
       missing_host_key=spur.ssh.MissingHostKey.accept 
      ) 
      shell.run(["true"]) 
      return shell 
     except spur.ssh.ConnectionError as error: 
      err = error 
    if err: 
     raise error 
相关问题