每次 SSH 连接腾讯云轻量应用服务器都弹出微信扫码二维码,密钥认证完全失效。本文从根本原因出发,提供完整的排查和解决方案。
在使用 SSH 连接腾讯云轻量应用服务器时,每次新建连接都会弹出微信扫码验证:
██████████████████████████████████████████████████████████████████████
██ ██████ ██████ ████ ████ ████ ██
...(各种图案)...
请使用微信扫码安全登录。症状:
id_ed25519)完全失效,返回 Permission denied (publickey)`腾讯云轻量应用服务器默认安装了主机安全(YunJing)组件。该组件通过以下三种方式注入二维码验证:
注入方式 | 路径 | 说明 |
|---|---|---|
PAM 模块动态注入 |
| SSH 认证前强制弹出二维码 |
YunJing 自带 PAM 插件 |
| 替代系统 PAM 模块 |
SSH Banner 输出 |
| SSH 登录后输出二维码文本 |
核心问题在于 /etc/pam.d/sshd 中的 pam_qrlogin.so 模块,它在 SSH 认证流程中插入了二维码验证,跳过了正常的公钥认证。
在解决 SSH 之前,需要先用以下方式之一登录服务器:
# 查看当前的 PAM SSH 配置
cat /etc/pam.d/sshd | grep -n qrlogin
# 注释掉 pam_qrlogin 行
sed -i 's/^auth.*pam_qrlogin.so/# &/' /etc/pam.d/sshd
# 验证修改
cat /etc/pam.d/sshd | grep -n qrlogin修改后应该看到 # auth required pam_qrlogin.so(前面带 # 注释)。
YunJing 还会通过 SSH Banner 输出二维码信息:
# 查看当前 Banner 配置
grep -i "banner" /etc/ssh/sshd_config
# 注释掉 Banner 配置
sed -i 's|^Banner /etc/ssh/banner.txt|#Banner none|' /etc/ssh/sshd_config
# 验证修改
grep -i "banner" /etc/ssh/sshd_config⚠️ 警告:卸载后服务器将失去主机安全防护(入侵检测、恶意文件扫描等)。请确认你已有其他安全措施(防火墙、安全组等)。
# 执行卸载脚本
/usr/local/qcloud/YunJing/uninst.sh
# 或者手动卸载
systemctl stop aliyun.service 2>/dev/null
systemctl stop YunJing 2>/dev/null
rm -rf /usr/local/qcloud/YunJing
rm -f /usr/lib/x86_64-linux-gnu/security/pam_qrlogin.so
# 清理残留的 PAM 配置
ls /etc/pam.d/sshd | xargs grep -l qrlogin && \
sed -i '/qrlogin/d' /etc/pam.d/sshd二维码解决后,密钥认证可能因为权限问题仍然无法使用。修复权限:
# 修复 home 目录权限(不能太宽松)
chmod 755 /home/ubuntu
# 修复 .ssh 目录权限
chmod 700 /home/ubuntu/.ssh
# 修复 authorized_keys 权限
chmod 600 /home/ubuntu/.ssh/authorized_keys
# 将公钥写入 authorized_keys(如果还没有)
cat /home/ubuntu/.ssh/id_ed25519.pub >> /home/ubuntu/.ssh/authorized_keys
# 确保文件属主正确
chown -R ubuntu:ubuntu /home/ubuntu/.ssh# 重启 SSH
systemctl restart sshd
# 测试 SSH 连接(不要弹二维码)
ssh -i ~/.ssh/id_ed25519 ubuntu@你的服务器IP如果连接成功且不弹二维码,说明问题已彻底解决。
现象 | 原因 | 解决方法 |
|---|---|---|
还是弹二维码 | YunJing 进程重新注入 PAM 模块 | 执行卸载脚本,并确认 |
| 公钥未写入或目录权限过宽 | 修复权限 + 写入公钥 |
Git Bash 提示私钥不存在 | Windows 路径反斜杠问题 | 用 |
Ubuntu WSL 连不上 | 私钥在 Windows 侧 |
|
cat /var/log/auth.log | grep sshdAllowUsers 或 AllowGroups 限制 SSH 登录用户600,否则 SSH 会拒绝使用本文基于腾讯云轻量应用服务器 Ubuntu 22.04 环境编写,适用于所有搭载 YunJing 组件的腾讯云实例。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。