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。