使用Paramiko连接Amazon Linux 2实例,服务器端无登录记录问题排查
排查Paramiko连接Amazon Linux 2实例无服务器端记录的问题
看起来你遇到的情况是代码看似在运行,但实际SSH连接并没有真正建立成功——毕竟服务器端w/who都没记录,程序还卡在input这里,大概率是连接过程卡在了某个环节没完成握手。我给你几个排查方向和解决办法:
1. 先给连接加超时+开启调试日志,快速定位问题
Paramiko默认没有超时设置,要是连接过程中因为网络、加密算法不兼容或者服务器端配置问题卡住,程序会一直挂着,你根本不知道哪里出问题。
修改代码,给connect加上超时参数,同时开启调试日志:
#!/usr/bin/env python3 import pprint import boto3 import os import paramiko import logging # 开启Paramiko调试日志,输出详细连接过程 logging.basicConfig(level=logging.DEBUG) os.system('clear') pp = pprint.PrettyPrinter(indent=4) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 增加10秒超时,避免无限等待 client.connect('X.X.X.X',username='the_username',password='the_password',port=22, timeout=10) # 先执行一个简单命令验证连接是否成功 stdin, stdout, stderr = client.exec_command('whoami') print("Connected as:", stdout.read().decode().strip()) get_input = input("Preventing program from closing and keeping SSH connectiion alive...")
运行后如果连接失败,会直接抛出异常;如果成功,会打印出你的用户名,这时候再去服务器端看w/who,应该就能看到连接记录了。
2. 查看服务器端SSH日志,抓核心线索
Amazon Linux 2的SSH认证日志存在/var/log/secure里,在服务器端执行:
sudo tail -f /var/log/secure
然后运行你的Python程序,盯着日志看——不管连接成功还是失败,这里都会有记录:
- 如果看到
Accepted password for the_username from X.X.X.X port ...,说明连接成功了,那可能是w/who的显示延迟,或者你需要执行命令触发会话激活; - 如果看到
Failed password或者error: no matching cipher found这类信息,就直接知道是认证失败还是加密算法不兼容了。
3. 检查服务器端SSH配置的细节
虽然你说已经开启了密码认证,但再确认下/etc/ssh/sshd_config里的几个关键项:
- 确保
PasswordAuthentication yes(没被注释,值是yes) - 确保
ChallengeResponseAuthentication no(这个开启的话,可能会让Paramiko的密码认证流程出错) - 检查有没有
AllowUsers/DenyUsers配置,限制了你的用户名或者来源IP
改完配置后记得重启sshd:sudo systemctl restart sshd
4. 确认实例的安全组/网络ACL允许SSH流量
虽然你用常规SSH能连,但还是确认下:安全组的入站规则允许你的本地IP访问22端口,网络ACL也没有拦截SSH流量——毕竟有时候环境变化可能会导致这个问题。
内容的提问来源于stack exchange,提问作者slantalpha
相关产品推荐
相关产品推荐

