搞ssh密钥登录,就是为了省掉每次输密码的麻烦,顺便提高安全性。密码登录容易被暴力破解,密钥对基于非对称加密,只要私钥不泄露,基本攻不破。下面直接写步骤。
1. 生成密钥对
在本地机器执行,不要跑到服务器上生成。用ed25519算法,比rsa快且安全。如果遇到老系统不支持,才考虑rsa。
ssh-keygen -t ed25519 -C "your_email@example.com"
-C是注释,方便你知道哪个密钥对应哪台机器,不写也行。
回车后问你要存哪里,默认`~/.ssh/id_ed25519`。如果已经有密钥,建议换个名字,比如`~/.ssh/id_ed25519_raincloud`,避免覆盖。
设置passphrase。这是个额外密码,每次用私钥时输入。嫌麻烦直接回车留空,但风险是私钥文件被盗就能直接登录。建议设一个,配合ssh-agent可以只输一次。
2. 把公钥扔到服务器
公钥文件是`.pub`结尾,比如`id_ed25519.pub`。把它追加到服务器上`~/.ssh/authorized_keys`里。
方法一:ssh-copy-id(最省事)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server-ip
输入一次密码,它自动把公钥写进去,还会处理权限问题。如果没有ssh-copy-id,用下面方法。
方法二:手动追加
cat ~/.ssh/id_ed25519.pub | ssh user@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
注意:服务器上`.ssh`目录权限必须是700,`authorized_keys`权限必须是600。否则sshd会忽略这个文件。
ssh user@your-server-ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
3. 测试密钥登录
ssh -i ~/.ssh/id_ed25519 user@your-server-ip
如果设置了passphrase,会先让你输passphrase,直接登录成功。如果没设置,直接进去。
如果失败,看服务器`/var/log/auth.log`或`journalctl -u sshd`,常见原因是权限不对或`~/.ssh`目录所有者不是当前用户。
4. 关闭密码登录(可选但推荐)
确认密钥登录没问题后,再关密码。别搞反了,否则把自己锁外面。
编辑服务器上`/etc/ssh/sshd_config`,找到这几行:
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ChallengeResponseAuthentication no
重启sshd:
sudo systemctl restart sshd
或者`sudo service ssh restart`(看发行版)。
5. 用ssh-agent省事
如果设了passphrase,每次ssh都输一遍很烦。用ssh-agent缓存。
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
输入一次passphrase,之后这个终端会话里ssh都不再需要输passphrase。可以把这个加到shell配置里,比如`.bashrc`或`.zshrc`:
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi
6. 多服务器管理:用config文件
编辑`~/.ssh/config`,省得每次写长命令。
Host raincloud
HostName your-server-ip
User your-username
Port 22
IdentityFile ~/.ssh/id_ed25519_raincloud
直接`ssh raincloud`就能登录。可以配多个Host段,每个对应一台机器。
7. 关于服务器选择
我自己的项目部署在雨云,性价比不错,稳定性也够用。他们的服务器开通后直接ssh上去,按上面步骤配好密钥,后续部署代码、跑服务都很顺手。之前用过其他家,要么网络不稳要么价格虚高,雨云算是个实在的选择。
常见坑点
– 用root直接登录?建议禁止。新建一个普通用户,加到sudo组,用普通用户登录再sudo。在`sshd_config`里设置`PermitRootLogin no`。
– 密钥文件权限:本地私钥必须是600或更严格,`chmod 600 ~/.ssh/id_ed25519`,否则ssh会报`Permissions 0644 for ‘id_ed25519’ are too open`。
– 服务器时间不对?会影响某些认证,用`ntpdate`同步一下。
– 如果你有多台机器,每个机器用不同的密钥对,config里分别指定IdentityFile,避免串用。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容