SSH 是日常运维和远程开发的基础。本文整理免密登录配置、两个典型排障案例、多私钥管理,以及结合 screen 和 rsync 的远程构建工作流。

一、免密登录

假设要从 serverA 免密登录 serverB:

1.1 serverA 生成密钥

ssh-keygen -t rsa

生成的文件在 ~/.ssh/ 下:

id_rsa          # 私钥,必须保管好
id_rsa.pub      # 公钥,可以分发到各机器
authorized_keys # 存放允许免密登录的公钥
known_hosts     # 已连接主机的公钥清单

1.2 把公钥加入 serverB

把 serverA 的 id_rsa.pub 内容追加到 serverB 的 ~/.ssh/authorized_keys。

1.3 指定端口连接

ssh root@ip -p port

二、排障案例 1:私钥权限过宽

错误信息:

Permissions 0777 for '/home/cyy/.ssh/id_rsa' are too open.

SSH 为了安全拒绝权限过宽的私钥。修复:

chmod -R 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

三、排障案例 2:SSH 连接卡住

连接时长时间停在:

To escape to local shell, press 'Ctrl+Alt+]'

原因是服务端对客户端 IP 做 DNS PTR 反向查询,动态 IP 没有 PTR 记录,查询超时拖慢连接。

关闭服务端的 DNS 查询:

vim /etc/ssh/sshd_config
UseDNS no

重启服务:

systemctl restart sshd

四、多私钥管理

一台机器连接多个远端时,使用 -i 指定私钥:

ssh -i "~/.ssh/remote_id_rsa" remote_user@remote_ip

五、去除私钥密码

私钥设置了密码,每次连接都要输入。可以生成去掉密码的新私钥(新私钥安全性降低,注意保管):

openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new

六、远端执行命令

ssh -t remote_user@remote_ip -p port './dir/cmd; bash'

-t 分配伪终端,命令执行后留在远端 shell。

七、screen:保持会话

关闭本地终端后,远端程序会随 SSH 断开而被终止。用 screen 保持会话:

sudo apt install screen   # 或 yum install screen

screen -S name    # 创建会话
screen -ls        # 列出会话
screen -r name    # 恢复会话

# 关闭当前会话:Ctrl+a 后输入 k

八、rsync + SSH 远程构建

本地改代码后自动同步到远端并执行构建,参数化脚本如下:

#!/bin/bash

HOST=${1:-192.168.0.102}   # 远端 IP
PORT=${2:-22}              # SSH 端口
USER=${3:-root}            # 登录用户
TARCMD=$4                  # 远端要执行的指令
TARGETDIR="/root/src"      # 远端目录
SRCDIR="/local/src"        # 本地源码目录

# 同步脚本和源码
rsync -aPzv -e "ssh -p ${PORT}" ./{*.sh} "${USER}@${HOST}:${TARGETDIR}/script/"
rsync -aPzv -e "ssh -p ${PORT}" ${SRCDIR} "${USER}@${HOST}:${TARGETDIR}/"

# 远端执行构建脚本
ssh -p ${PORT} ${USER}@${HOST} "cd ${TARGETDIR}; ./cmd.sh $TARCMD"

使用:

./syncbuild.sh 192.168.0.102 22 root "make"

文件传输也可以直接用 scp:

scp local_file user@host:/remote/path
scp user@host:/remote/file ./local

九、总结

  • 免密登录 = 本机私钥 + 远端 authorized_keys 登记公钥。
  • ~/.ssh 权限必须收紧,私钥 600、目录 700。
  • SSH 卡住优先检查服务端 UseDNS。
  • 多私钥用 -i 指定,私钥密码用 openssl rsa 去掉。
  • screen 保持远程会话,rsync + ssh 实现同步构建工作流。

相关脚本

整理自 cyy-tag/bash-example 仓库: