非root用户跨Linux主机免密SSH登录:基于/etc/shadow同凭证可行吗?
能否用两端相同的SHA-512密码实现SSH免密登录(非密钥方式)
结论
可以实现,但极度不推荐——这种方式安全风险极高,仅适合临时测试场景,绝对不能用于生产环境。本质是让SSH客户端自动填入密码,同时确保本地和远程的同名非root用户拥有完全一致的SHA-512密码哈希(即/etc/shadow文件中该用户的密码字段完全匹配)。
必要条件
- 本地与远程主机存在同名非root用户,且双方
/etc/shadow中该用户的SHA-512密码哈希完全一致(若两端用相同明文密码生成哈希,且加密参数一致,哈希会自动匹配)。 - 远程SSH服务器允许密码认证(默认通常开启,需确认配置)。
实现步骤
1. 确认远程SSH服务器配置
编辑远程主机的/etc/ssh/sshd_config文件,确保以下配置项正确:
PasswordAuthentication yes ChallengeResponseAuthentication no
修改完成后重启SSH服务:
sudo systemctl restart sshd
2. 本地自动提交密码
SSH密码认证默认是交互式的,需借助工具实现自动填充密码:
方式1:使用sshpass工具
- 安装
sshpass(不同发行版命令不同):
Debian/Ubuntu:sudo apt install sshpass
RHEL/CentOS:sudo dnf install sshpass - 执行登录命令:
sshpass -p '你的明文密码' ssh your_username@remote_host_ip
警告:明文密码会暴露在命令历史、进程列表中,极易被窃取,风险极大。
方式2:使用expect脚本
- 安装
expect:
Debian/Ubuntu:sudo apt install expect
RHEL/CentOS:sudo dnf install expect - 编写脚本(例如命名为
auto_ssh_login.exp):
#!/usr/bin/expect -f set user "your_username" set host "remote_host_ip" set pass "your_plain_password" spawn ssh $user@$host expect "password:" send "$pass\r" interact
- 赋予脚本执行权限并运行:
chmod +x auto_ssh_login.exp ./auto_ssh_login.exp
这种方式比sshpass稍隐蔽,但明文密码仍存储在脚本文件中,安全风险依旧很高。
核心风险点
- 明文密码泄露:无论哪种自动填充方式,都需依赖明文密码,极易被窃取。
- 哈希复用风险:若
/etc/shadow中的密码哈希泄露,攻击者可直接复用该哈希登录其他存在相同用户的主机。 - 审计追踪困难:密码认证无法像密钥认证那样追踪具体登录来源,出现安全问题后难以排查。
推荐的安全替代方案
虽然你明确要求不使用密钥认证,但仍强烈建议采用SSH密钥对认证(Linux远程登录的标准安全方式),步骤如下:
- 本地生成密钥对:
ssh-keygen -t ed25519(一路回车即可,无需设置密钥密码) - 将公钥上传至远程主机:
ssh-copy-id your_username@remote_host_ip - 可选(推荐):远程主机禁用密码认证,修改
sshd_config中PasswordAuthentication no,重启sshd服务。
内容的提问来源于stack exchange,提问作者Gektor
相关产品推荐
相关产品推荐

