如果私有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
答案 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")