You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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远程登录的标准安全方式),步骤如下:

  1. 本地生成密钥对:ssh-keygen -t ed25519(一路回车即可,无需设置密钥密码)
  2. 将公钥上传至远程主机:ssh-copy-id your_username@remote_host_ip
  3. 可选(推荐):远程主机禁用密码认证,修改sshd_config中PasswordAuthentication no,重启sshd服务。

内容的提问来源于stack exchange,提问作者Gektor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:40:52