基础

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 prodssh 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-rsynclinux/46-ssh-hardening