在Paramiko中,如何确定是通过SSH密钥还是通过密码成功建立了连接?

时间:2019-01-21 18:55:08

标签: python ssh paramiko

如果私有ssh密钥 OR 密码正确(它将首先尝试密钥),则此代码摘录正确连接。成功建立连接后,如何确定使用了哪一个?如果不首先尝试仅与密钥连接(没有密码),是否有可能?我在Paramiko documention中找不到这个。

self.client = paramiko.SSHClient()
hostkey = self.ssh_hostkey.split(' ')
self.client.get_host_keys().add(self.ip, hostkey[0], paramiko.RSAKey(data=base64.b64decode(hostkey[1])))
privkey_file = io.StringIO()
privkey_file.write(self.ssh_privkey)
privkey_file.seek(0)
privkey = paramiko.RSAKey.from_private_key(privkey_file)
try:
    self.client.connect(
        hostname=self.ip,
        username='root',
        pkey=privkey,
        password=self.router_password, # will try private key first, then password
        allow_agent=False,
        look_for_keys=False,
    )
    self.last_connect = time.strftime("%Y-%m-%d_%H:%M:%S", time.gmtime())
    print_msg(1, "Connected to {}".format(self.nickname))
except paramiko.ssh_exception.AuthenticationException:
    self.client = None

1 个答案:

答案 0 :(得分:0)

我认为SSHClient不会为您提供该信息(除了解析日志文件之外)。

您将不得不求助于低级Transport class

有了它,您可以执行Transport.auth_publickey并回退到Transport.auth_password,而不必重新打开会话。

transport = paramiko.Transport(host)
transport.connect(hostkey)

try:
    print("Trying key")
    transport.auth_publickey(username, key)
except:
    print("Trying password")
    transport.auth_password(username, password)

print("Authenticated")