ubuntu免密登录

 人参与 | 时间:2026-10-17 07:28:19

每次 SSH 连服务器都要敲密码,免密烦。登录尤其是免密搞了一堆测试机的时候,`ssh user@192.168.1.101` 回车,登录等一秒,免密输密码,登录再回车。免密一天重复几十遍,登录手指头都麻了。免密其实 Ubuntu 上有个更省事的登录办法:把本机的公钥丢到目标机器的 `~/.ssh/authorized_keys` 里,之后直接 `ssh user@host` 就进去了,免密密码?登录不存在的。

这事原理不复杂。免密SSH 支持公钥认证,登录你本地生成一对密钥——私钥自己留着,免密公钥可以随便给。服务器拿到你的公钥后,登录时它会发一个随机挑战,你的客户端用私钥签名发回去,服务器用公钥验证签名。验证通过就放行。私钥不出本机,比密码安全得多,密码还可能被暴力猜解,私钥基本没这烦恼。

先看看本地有没有现成的密钥

打开终端,敲:

ls -l ~/.ssh/id_rsa.pub

如果显示文件存在,恭喜,跳过生成步骤。如果没有,或者你压根没折腾过 SSH,那就先生成一对。Ubuntu 默认用 RSA 或者更现代的 ed25519,我习惯用 ed25519,短小快:

ssh-keygen -t ed25519 -C "your_email@example.com"

一路回车就行。它会问你要不要设 passphrase,设了更安全,但每次用密钥还得输一次密码,那免密就免了个寂寞。个人测试环境直接空着回车,生产环境建议设一个,配合 ssh-agent 也能少输几次。生成完,`~/.ssh/` 下会多出 `id_ed25519`(私钥)和 `id_ed25519.pub`(公钥)。私钥权限必须是 600,不然 SSH 会拒绝使用,Ubuntu 一般自动设好,不放心就 `chmod 600 ~/.ssh/id_ed25519`。

把公钥送到目标机器上

最省事的命令是 `ssh-copy-id`。假设目标机器 IP 是 192.168.1.101,用户名 ubuntu:

ssh-copy-id ubuntu@192.168.1.101

它会提示你输一次目标机器的密码,然后把公钥追加到对方的 `~/.ssh/authorized_keys` 文件里。完事之后,再 `ssh ubuntu@192.168.1.101`,应该直接进去了,不再问密码。如果 `ssh-copy-id` 不存在(某些精简版 Ubuntu 没装),手动来也行:

cat ~/.ssh/id_ed25519.pub | ssh ubuntu@192.168.1.101 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

这条命令看起来长,其实就是把本地公钥内容通过 SSH 传到对面,然后追加到文件里,顺便把权限设对。`~/.ssh` 目录权限得是 700,`authorized_keys` 得是 600,SSH 对权限很敏感,权限不对它直接忽略这个文件,你查半天日志才发现是权限问题。

几个容易踩的坑

有次我帮同事配,死活不生效。`ssh -v` 看调试日志,发现服务器压根没读 `authorized_keys`。原因是那台机器的 `/home/ubuntu` 目录权限是 777,SSH 认为其他用户可写,直接拒绝使用该目录下的密钥文件。改成 755 就好了。所以权限链条要完整:家目录不能组或其他用户可写,`.ssh` 目录 700,`authorized_keys` 600,私钥 600。一条条对。

还有时候是 SELinux 或者 AppArmor 在捣乱,不过 Ubuntu 桌面和服务器默认 AppArmor 对 SSH 的约束不算严,一般碰不到。真碰到了,`aa-status` 看看有没有相关 profile,临时 `sudo aa-complain /usr/sbin/sshd` 能排查。

另外,如果你改了 SSH 端口,`ssh-copy-id` 要加 `-p` 参数:`ssh-copy-id -p 2222 ubuntu@host`。忘了加就会连默认 22 端口,然后超时。

想更懒一点?配个别名

免密之后,每次还要敲一长串 IP 和用户名也烦。在 `~/.ssh/config` 里加几行:

Host test101 HostName 192.168.1.101 User ubuntu IdentityFile ~/.ssh/id_ed25519

保存后,直接 `ssh test101` 就完事。多个机器就多写几段,管理起来清爽。我自己的 config 里塞了十几台机器,名字按用途起,比如 `db-prod`、`web-staging`,比记 IP 强多了。

免密登录本身不复杂,核心就是公钥放对位置、权限别乱。配好之后,脚本里 `scp`、`rsync` 也不用再交互输密码,自动化顺手就起来了。花五分钟弄一次,省下的是后面几百次的敲键盘时间。

顶: 81踩: 2