运维:SSH 免密、排障与远程构建
介绍 SSH 免密登录、常见排障(权限过宽、DNS 反向查询卡住)、多私钥管理,以及 screen 会话保持和 rsync 远程构建。
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 仓库: