Files

51 lines
2.7 KiB
Python
Raw Permalink Normal View History

2026-04-07 02:04:22 +05:30
import io
import paramiko
def test_ssh_config(host, port, username, password, pkey, pkey_passwd, timeout: int = 10) -> str:
try:
ssh = paramiko.SSHClient()
pkey_obj = None
if pkey:
pky_io = io.StringIO(pkey)
key_cls_list = [paramiko.RSAKey, paramiko.ECDSAKey, paramiko.Ed25519Key]
if hasattr(paramiko, "DSSKey"):
key_cls_list.append(paramiko.DSSKey)
for key_cls in key_cls_list:
pky_io.seek(0)
try:
pkey_obj = key_cls.from_private_key(pky_io, password=(pkey_passwd if pkey_passwd else None))
except Exception as e:
if "base64 decoding error" in str(e):
return "Private key data error, please check if it is a complete copy of the private key information"
elif "Private key file is encrypted" in str(e):
return "The private key has been encrypted, but the password for the private key has not been provided, so the private key information cannot be verified"
elif "Invalid key" in str(e):
return "Private key parsing error, please check if the password for the private key is correct"
continue
else:
break
else:
return "Private key parsing error, please confirm that the entered key format is correct"
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# look_for_keys 一定要是False排除不必要的私钥尝试导致的错误
ssh.connect(hostname=host, port=port, username=username, password=(password if password else None),
pkey=pkey_obj, look_for_keys=False, auth_timeout=timeout)
ssh.close()
return ""
except Exception as e:
err_str = str(e)
auth_str = "{}@{}:{}".format(username, host, port)
if err_str.find('Authentication timeout') != -1:
return 'Authentication timeout, [{}] error{}'.format(auth_str, e)
if err_str.find('Authentication failed') != -1:
if pkey:
return 'Authentication failed, please check if the private key is correct: ' + auth_str
return 'Account or password error:' + auth_str
if err_str.find('Bad authentication type; allowed types') != -1:
return 'Unsupported authentication type: {}'.format(err_str)
if err_str.find('Connection reset by peer') != -1:
return 'The target server actively rejects the connection'
if err_str.find('Error reading SSH protocol banner') != -1:
return 'Protocol header response timeout, error' + err_str
return "Connection failed" + err_str