兄弟们,有没有觉得每次 SSH 远程登录服务器,都要手动输入密码超级麻烦?尤其是在写自动化脚本的时候,这简直是效率杀手!别担心,今天就给大家揭秘 Linux 上实现 SSH 自动化登录的两种超实用方法,让你轻松告别密码输入,实现丝滑连接!
🚀 方法一:ssh-keygen
免密登录 (安全、推荐!)
这是最安全、最主流也是最推荐的自动化 SSH 登录方式!它的原理是利用公钥-私钥对进行身份验证,而不是传统的密码。
工作原理:
- 生成密钥对:在你的本地机器上,使用
ssh-keygen
命令生成一对密钥:一个私钥(放在你自己电脑上,绝不能泄露!)和一个公钥。 - 分发公钥:将你的公钥复制到目标远程服务器的
~/.ssh/authorized_keys
文件中。 - 免密验证:当你再次尝试 SSH 连接时,本地 SSH 客户端会用你的私钥去尝试和远程服务器的公钥进行匹配。如果匹配成功,你就可以直接登录,无需输入密码!
操作示例:
-
在本地生成密钥对:
ssh-keygen -t rsa -b 4096
一路回车即可(如果设置了密码,每次登录私钥时需要输入密码,为了免密可不设置)。
-
将公钥复制到远程服务器:
ssh-copy-id username@remote_host_ip # 最推荐的自动化复制方式 # 或者手动复制: # scp ~/.ssh/id_rsa.pub username@remote_host_ip:~/.ssh/authorized_keys
输入一次远程服务器的密码即可完成公钥的部署。
优点: 极其安全、操作简便、一旦设置永久有效、适合大规模自动化部署。
缺点: 首次设置需要手动分发公钥。
🎭 方法二:expect
自动化处理密码 (脚本救急、谨慎使用!)
有时候,你可能没有权限修改目标服务器的 authorized_keys
文件,或者只是临时需要一个脚本来处理密码输入。这时候,expect
命令就派上用场了!
expect
是一个自动化交互的工具,它通过“期望”(expect)某些输出,然后“发送”(send)相应的输入(比如密码)来模拟用户交互。
工作原理:
expect
脚本会监视 SSH 命令的输出,当它“看到”提示符(比如 yes/no
或 password:
)时,就会自动发送预设的回答。
代码示例(来自截图):
#!/bin/bash
# 删除 .ssh/known_hosts 中的旧记录,以便每次登录都需要确认(可选,但通常用于确保重新验证)
sed -i /^192.168.88.102/d /root/.ssh/known_hosts
# 使用 expect 自动化 SSH 登录
expect <<EOF
spawn ssh 192.168.88.102 # 执行 SSH 登录
expect "yes/no)?" # 等待出现 yes/no 确认提示
send "yes\n" # 发送 yes 确认
expect "password:" # 等待输入密码提示
send "123\n" # 输入密码 "123" (**注意:密码明文!**)
expect "]" # 等待登录成功提示符(根据实际情况调整,比如命令提示符的最后一个字符)
send "touch /tmp/123\n" # 登录成功后执行命令
send "exit\n" # 退出 SSH
expect eof # 等待程序结束
EOF
注意事项:
- 密码明文!:这是
expect
最大的弊端!你的密码会直接写在脚本里,这在安全上是非常危险的。务必妥善保管你的脚本文件,不要上传到公共仓库或共享给不信任的人! - 交互模式依赖:
expect
脚本高度依赖于远程服务器的提示符格式。如果服务器的提示符(比如password:
)稍有变化,脚本就可能失效。 - 不适合高并发和长期使用:主要用于简单的脚本自动化或临时任务。
优点: 无需修改目标服务器配置、适用于无法使用密钥认证的场景、实现灵活的交互自动化。
缺点: 安全性差(密码明文)、健壮性差(容易因提示符变化而失效)、维护成本相对较高。
总结:选择你的“魔法”!
- 安全至上、长期自动化:首选
ssh-keygen
免密登录! 它通过非对称加密保障了你的连接安全,一次设置,永久方便。 - 特殊场景、临时需求:可以考虑
expect
自动化密码输入,但务必注意安全风险! 确保你的脚本文件权限设置严格,并仅在内网或受控环境中使用。
两种方法各有利弊,选择哪种取决于你的具体需求和对安全性的考量。希望这篇文章能帮助你更好地理解和使用 Linux 下的 SSH 自动化登录,让你的开发和运维工作更加高效!💻✨