В Paramiko, как я могу определить, было ли успешное соединение через ключ SSH или пароль? - PullRequest
0 голосов
/ 21 января 2019

Этот фрагмент кода подключается правильно, если закрытый ключ ssh ИЛИ пароль правильный (сначала он пытается ввести ключ). После успешного подключения, как я могу узнать, какой из них был использован? Возможно ли это даже без предварительной попытки подключения только с помощью ключа (без пароля)? Я не могу найти это в документации Paramiko .

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 голосов
/ 22 января 2019

Я не думаю, что SSHClient дает вам эту информацию (кроме анализа файла журнала).

Вам придется прибегнуть к низкоуровневому Transport классу .

С его помощью вы можете сделать 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...