本页目录

SSH 操作手册

连接与配置

ssh user@host
ssh -p 2222 user@host
ssh -i ~/.ssh/id_ed25519 user@host       # 指定私钥

~/.ssh/config 是 SSH 最重要的配置文件,每个 Host block 定义一组连接参数:

Host myserver
    HostName 1.2.3.4                     # 实际 IP 或域名
    Port 2222                            # 默认 22
    User root                            # 登录用户
    IdentityFile ~/.ssh/id_ed25519        # 私钥路径
    ServerAliveInterval 60               # 每 60s 发 keepalive (防止 NAT/防火墙断连接)
    ServerAliveCountMax 3                # 连续 3 次失败才断开
    # 免密已配好 → ssh myserver 直接登录

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_ed25519_github  # 多 key 时指定不同 key
    IdentitiesOnly yes                     # 只用这个 key, 不尝试 agent 中的其他 key

Host jump-*
    ProxyJump jumphost                    # 通过跳板机连接

Key Management

# 生成 ED25519 key (推荐, 比 RSA 更快更安全)
ssh-keygen -t ed25519 -C "comment" -f ~/.ssh/id_ed25519

# 放公钥到远程 (password → key 免密)
ssh-copy-id user@host
# 等效于: cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 列出 agent 中的 key
ssh-add -L
ssh-add ~/.ssh/id_ed25519               # 添加 key 到 agent
ssh-add -D                              # 清空 agent

# 删除 known_hosts 中的旧 key (重装系统后)
ssh-keygen -R hostname
ssh-keygen -R 1.2.3.4

端口转发

# 本地转发: 访问 localhost:8080 = 访问 remote 能访问的 internal:80
ssh -L 8080:internal:80 user@remote
# 适用: 远程内网的服务 (如数据库) 映射到本地端口

# 远程转发: 访问 remote:3000 = 访问 localhost:22
ssh -R 3000:localhost:22 user@remote
# 适用: 把本机 SSH 暴露给外网 (homessh 的原理)
# 注意: 默认只 bind remote 的 localhost, 需要 GatewayPorts yes 才能 bind 0.0.0.0

# 动态转发 (SOCKS5 proxy): 浏览器设置 proxy 为 localhost:1080
ssh -D 1080 user@remote
# 适用: 通过 SSH 服务器做代理 (比 HTTP CONNECT 通用)

文件传输

scp file.txt user@host:/path/
scp -r dir/ user@host:/path/
scp user@host:/path/file.txt ./

# rsync 支持增量传输和续传
rsync -avz --progress dir/ user@host:/path/
# -a: archive (保留权限/时间/符号链接)
# -v: verbose
# -z: 压缩
# --progress: 显示进度
# 注意: dir/ (带斜杠) = 传输目录内容, dir (不带) = 传输目录本身

故障排查

# 详细调试输出 (看 key exchange, auth 过程, 问题在哪一步)
ssh -vvv user@host

# Permission denied (publickey)
# → 检查本地 key 是否被私钥加了密码忘了 unlock
# → 检查远程 ~/.ssh/authorized_keys 是否包含正确的公钥
# → 检查远程 ~/.ssh 权限: chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
# → 检查远程 /etc/ssh/sshd_config: PubkeyAuthentication yes

# Connection refused
# → 远程 sshd 在跑吗? systemctl status sshd
# → 远程防火墙放行了吗? iptables -L -n -v | grep 22

# Host key verification failed (重装系统后)
ssh-keygen -R hostname

# 连接建立后卡住 (可能 DNS 反向解析慢)
# → 在远程 /etc/ssh/sshd_config 设: UseDNS no