3

ここでは、テストサーバー用に事前定義されたパスワードの複数のセットを使用しています - 移植可能な Python SSH ライブラリ (以下のもの - spur.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 の世界から来て、オブジェクトが null かどうかを確認し、最後までリストを反復処理してから、パスワードを要求します。Pythonでそれを行う方法がわかりません... リスト部分で見つけた例を次に示します。

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

3 に答える 3

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      
于 2013-03-20T14:43:07.133 に答える
0

私は2つの異なる機能でそれをカットします:

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
于 2013-03-20T14:54:44.860 に答える
0

上記の私のコメントは壊れてしまったので、ここに @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 
于 2013-03-20T15:18:20.163 に答える