Вот этой функцией проверяю подходит ли логин/пароль:
def SSHCheck(target, SSHport, user, password):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
resultCode = 0
try:
ssh.connect(target, port = SSHport, username = user, password = password, timeout=5, banner_timeout = 5, auth_timeout=5)
except paramiko.AuthenticationException:
resultCode = 1
except socket.error:
resultCode = 2
except paramiko.ssh_exception.SSHException:
resultCode = 3
finally:
ssh.close()
return resultCode
Все работает, когда подключаюсь к серверу, на котором OpenSSH.
Однако, если на сервере стоит Dropbear sshd 0.51 (protocol 2.0), то resultCode равен нулю (как будто подключение удалось) независимо от логина и пароля.
Чтобы отличить ложные срабатывания я решил каждый раз пытаться выполнить команду "ls" и смотреть результат. Для этого добавил блок else
def SSHCheck(target, SSHport, user, password):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
resultCode = 0
try:
ssh.connect(target, port = SSHport, username = user, password = password, timeout=5, banner_timeout = 5, auth_timeout=5)
except paramiko.AuthenticationException:
resultCode = 1
except socket.error:
resultCode = 2
except paramiko.ssh_exception.SSHException:
resultCode = 3
else:
channel = ssh.get_transport().open_session()
channel.get_pty()
channel.settimeout(5)
channel.exec_command('ls')
print(channel.recv(1024)) #Выводим результат команды
channel.close()
finally:
ssh.close()
return resultCode
Однако при каждой неудачной попытке входа paramiko пытался выполнить "ls", а в качестве результата команды выводилось примерно следующее:
b"\r\r\nEntering character mode\r\r\nEscape character is '^]'.\r\r\n\r\r\n\r\n\rlogin as: -c\r\n\rpassword: **"