SSH 免密登录与 scp 实战:密钥、config 别名与传文件
每次连服务器输一遍密码,IP 和端口记在备忘录里翻着敲——这套体验其实配置一次就能永久甩掉:密钥登录免掉密码,config 别名免掉记 IP,剩下的就是 ssh myserver 三个词连上任何机器。
这是 Linux 命令系列的一篇,承接 Linux 常见命令与工具地图。
ssh 基本连接
ssh 是加密的远程登录协议和客户端命令,连上之后拿到的就是远程机器的 shell:
1 | ssh deploy@192.168.1.100 |
ssh-keygen:生成密钥对
密钥登录的原理一句话:生成一对钥匙,公钥放到服务器上,私钥留在本地绝不外传;连接时客户端用私钥证明身份,服务器用公钥验证,全程不需要密码。
1 | ssh-keygen -t ed25519 -C "you@example.com" |
生成后 ~/.ssh/ 下多出两个文件:id_ed25519 是私钥(权限 600,谁都别给),id_ed25519.pub 是公钥(就是要放到服务器上的那个)。
需要管理多台机器、每台用独立密钥时(比如公司服务器一把、自己 VPS 一把、GitHub 再一把),用 -f 给每把钥匙指定自己的文件名,不然后生成的会覆盖先生成的:
1 | ssh-keygen -t ed25519 -C "you@example.com" -f ~/.ssh/id_ed25519_work |
多把钥匙怎么让 ssh 知道连哪台机器用哪把?靠的就是后面 ~/.ssh/config 里的 IdentityFile 字段——每台服务器的配置段里指定自己的那把私钥。
ssh-copy-id:把公钥装到服务器上
1 | ssh-copy-id deploy@192.168.1.100 |
没有 ssh-copy-id 的环境(比如从 Windows 连),手动做等价的事:
1 | cat ~/.ssh/id_ed25519.pub | ssh deploy@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
免密不生效时,第一个该查的是服务器端的目录权限——sshd 对权限要求很严格,太宽松会直接拒绝密钥登录:
1 | chmod 700 ~/.ssh |
~/.ssh/config:给服务器起别名
密钥解决了密码,config 解决记 IP。在本地 ~/.ssh/config 里给每台服务器写一段:
1 | Host myserver |
配好之后:
1 | ssh myserver |
管理多台服务器时价值更明显——每台一段配置,名字起得有意义(prod-web、test-db),连哪台敲哪个名字,IP 和端口再也不用记。scp、rsync 也认这份配置,别名全程通用。
scp:基于 SSH 传文件
scp 走 SSH 通道在本地和远程之间拷贝文件,语法和 cp 一致——把其中一端写成 用户@主机:路径 就行:
1 | scp app.tar.gz myserver:/opt/deploy/ |
一个必踩一次的坑:scp 指定端口用大写 -P,和 ssh 的小写 -p 不一样——因为 scp 的小写 -p 已经被”保留文件的修改时间和权限位”占用了(man 手册原文就是这么解释的):
1 | scp -P 2222 app.tar.gz deploy@192.168.1.100:/opt/deploy/ |
偶尔传一两个文件 scp 最顺手;大目录、大文件、需要断点续传或增量同步的场景,换 rsync 更合适。
常用命令速查表
| 命令 | 作用 |
|---|---|
ssh user@host |
远程登录,默认端口 22 |
ssh -p 端口 |
指定端口(小写 p) |
ssh-keygen -t ed25519 |
生成密钥对,ed25519 是当前默认推荐 |
ssh-copy-id user@host |
把公钥装到服务器,装完免密 |
chmod 700 ~/.ssh + 600 authorized_keys |
免密不生效先查这个权限 |
~/.ssh/config |
别名配置,ssh 别名 直连,scp/rsync 通用 |
scp 文件 host:路径 |
上传;反过来写就是下载 |
scp -r |
整目录递归拷贝 |
scp -P 端口 |
指定端口是大写 P,小写 p 是保留时间戳 |
写到这里
一次性的配置换永久的顺手:ssh-keygen 生成 ed25519 密钥、ssh-copy-id 装到服务器、~/.ssh/config 起好别名,之后连任何机器都是 ssh 名字 一步到位。传文件 scp 顺手用,记住端口是大写 -P;要增量和断点续传,隔壁 rsync 伺候。








