SSH:登录远程机器
ssh user@host # 默认端口 22
ssh -p 2222 user@host # 自定义端口
ssh -i ~/.ssh/work_key user@host # 指定私钥
ssh user@host 'ls /var/log' # 远程跑一条命令再退
配置免密登录
# 1. 生成 key(一次就够)
ssh-keygen -t ed25519
# 2. 把公钥送到目标
ssh-copy-id user@host
# 或手动:
cat ~/.ssh/id_ed25519.pub | ssh user@host 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
# 3. 之后 ssh user@host 不再输密码
~/.ssh/config:别再敲长命令
Host prod
HostName 1.2.3.4
User wadely
Port 22
IdentityFile ~/.ssh/prod_key
Host dev
HostName dev.example.com
User admin
Host bastion
HostName bastion.example.com
User wadely
Host inner-db
HostName 10.0.0.10
User root
ProxyJump bastion
之后只要:
ssh prod
ssh inner-db # 自动经 bastion 跳过去
端口转发(隧道)
本地转发:把远程端口拉到本地
ssh -L 8080:localhost:80 user@host
# 本地访问 localhost:8080 = 远程访问 localhost:80
实战:远程数据库不直接开公网,通过 SSH 隧道访问:
ssh -L 5432:localhost:5432 user@db-host
# 然后本地工具连 localhost:5432
远程转发:把本地端口送到远程
ssh -R 8080:localhost:3000 user@host
# 远程访问 localhost:8080 = 你本机的 :3000
适合:本地起的服务想给远程同事看。
Dynamic 转发(SOCKS 代理)
ssh -D 1080 user@host
# 配浏览器 SOCKS5 → localhost:1080
# 所有流量经远程出去
SCP:文件拷贝(简单场景)
# 本地 → 远程
scp file.txt user@host:/tmp/
scp -r folder user@host:/tmp/ # 递归
# 远程 → 本地
scp user@host:/tmp/file.txt .
# 远程 → 远程(经过本地)
scp user1@host1:/path user2@host2:/path
rsync:增量同步(推荐)
rsync 比 scp 强得多:
- 只传差异部分(增量)
- 断了能续传
- 能保留权限 / 时间戳 / 链接
- 能排除文件
- 能压缩传输
# 基础:本地 → 远程
rsync -avz folder/ user@host:/dest/
# 远程 → 本地
rsync -avz user@host:/source/ ./local/
# 排除
rsync -avz --exclude='*.log' --exclude='node_modules' src/ user@host:/dest/
# 删除目标多余的(双向同步)
rsync -avz --delete src/ user@host:/dest/
# 显示进度
rsync -avz --progress src/ user@host:/dest/
# 演练(不真传)
rsync -avzn src/ user@host:/dest/
参数速记:
| 参数 | 含义 |
|---|---|
-a |
archive 模式(含 -rlptgoD,保留全部属性) |
-v |
verbose |
-z |
传输时压缩 |
-n |
演练(dry-run) |
--delete |
同步删除 |
--progress |
进度条 |
--exclude=P |
排除模式 |
--exclude-from=F |
从文件读排除规则 |
⚠ rsync 斜杠的陷阱
rsync -avz src/ dest/ # src 里的内容 → dest(dest 里直接是文件)
rsync -avz src dest/ # src 文件夹本身 → dest(dest/src/ 下是文件)
差一个斜杠意义完全不同——记不住时先 -n 演练。
实战:部署一个站点
# 本地构建后推到服务器
npm run build
rsync -avz --delete \
--exclude='node_modules' --exclude='.git' \
./ user@server:/var/www/mysite/
实战:自动同步代码到服务器(开发期)
# 每次保存就推一遍(要装 inotify-tools)
while inotifywait -re modify .; do
rsync -avz --delete --exclude='.git' ./ user@dev:/srv/code/
done
SSH 高级技巧
Reuse 连接(加速)
~/.ssh/config 加:
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
之后同一目标的多次 ssh 会复用底层连接,第二次起几乎瞬时。
限时会话
ssh -o "ServerAliveInterval 60" user@host # 每 60s 发心跳
服务器或路由器在静默 5 分钟后断 SSH —— 这条解决。
下一篇:下载文件 curl / wget。