基础
ssh user@host # 默认 22 端口
ssh -p 2222 user@host # 自定义端口
ssh -i ~/.ssh/work_key user@host # 指定私钥
ssh user@host 'ls /var/log' # 远程跑一条命令再退
ssh user@host 'tail -f /var/log/syslog' # 跑后台命令
配置 ~/.ssh/config
Host prod
HostName 1.2.3.4
User wadely
Port 22022
IdentityFile ~/.ssh/prod_key
Host bastion
HostName bastion.example.com
User wadely
Host inner-db
HostName 10.0.0.10
User root
ProxyJump bastion # 经 bastion 跳过去
之后只 ssh prod 或 ssh inner-db 即可。
免密登录
# 1. 生成 key(一次就够)
ssh-keygen -t ed25519 -C "your@email"
# 2. 公钥送过去
ssh-copy-id user@host
# 3. 之后 ssh user@host 不输密码
端口转发(隧道)
本地转发(把远端口拉到本地)
ssh -L 8080:localhost:80 user@host
# 本地访问 localhost:8080 = 远端 localhost:80
# 把内网数据库拉到本地访问
ssh -L 5432:db.internal:5432 user@bastion
# 本地 localhost:5432 → 经 bastion → 连内网 db
远程转发(把本地端口送到远端)
ssh -R 8080:localhost:3000 user@host
# 远端访问 localhost:8080 = 你本机 :3000
SOCKS 代理
ssh -D 1080 user@host
# 浏览器配 SOCKS5 → localhost:1080 → 所有流量经远端
跑命令的姿势
ssh user@host 'uname -a' # 单条
ssh user@host < script.sh # 把本地脚本送过去跑
ssh user@host 'bash -s' < local.sh # 同上
# 批量
for h in host1 host2 host3; do
ssh "$h" 'hostname; uptime'
done
文件传输(虽然有专门工具)
# 本地 → 远端
cat localfile | ssh user@host 'cat > remotefile'
# 远端 → 本地
ssh user@host 'cat /remote/file' > localfile
# 但真正用 scp 或 rsync 更好(下两篇)
高级选项
# 保持长连接
ssh -o ServerAliveInterval=60 user@host
# 跳过 host key 检查(CI / 临时机器,不安全)
ssh -o StrictHostKeyChecking=no user@host
# verbose 调试
ssh -v user@host
ssh -vvv user@host # 更详细
坑
- 第一次连新机器要确认 host key——确认对的才接受
- key 文件权限必须
chmod 600——否则 ssh 拒绝用 -L和-R容易记反——记住:本地 L 是从远端拉到本地
详见 linux/28-ssh-scp-rsync 和 linux/46-ssh-hardening。