如何在Python中递归地尝试不同的SSH密码

  • 本文关键字:密码 SSH Python 递归 python
  • 更新时间 :
  • 英文 :


我们在这里为测试服务器使用了多组预定义的密码——我想尝试一个可移植的Python SSH库(就像下面的那个——spurp .py),并让它连续尝试每个密码——但是当它成功连接时显然会停止,如果它不能——请我提供密码。我想我是在用某种递归来处理异常。

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

正如Joe在评论中提到的,您可以做类似的事情:

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      

我会把它分成两个不同的函数:

def ssh_connection(user, host, password):
    """
    try to connect to user:password@host
    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 %s@%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

我上面的评论被弄乱了,所以这里是@Joe Doherty的建议与来自Ifthikan的代码一起使用-谢谢!

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 

最新更新