Linux中封装SSH远程执行命令的函数核心是:固化连接参数、统一错误处理、支持灵活传参;基础版用ssh_run封装主机/命令/用户/端口/密钥,增强版ssh_exec支持多命令、退出码判断与stderr捕获,批量版ssh_batch实现并发控制,配置驱动版ssh_cfg对接~/.ssh/config实现简洁安全调用。

在 Linux 中封装远程执行 SSH 命令的函数,核心目标是:避免重复写连接参数、统一错误处理、支持灵活传参,并能复用于脚本或批量任务。不依赖外部语言(如 Python/Go),纯 Shell 就能实现简洁可靠的封装。
基础封装:单主机命令执行函数
把常用连接选项(端口、用户、密钥、超时)固化进函数,调用时只关心目标和命令:
ssh_run() {
local host="$1"
local cmd="$2"
local user="${3:-$USER}"
local port="${4:-22}"
local key="${5:-$HOME/.ssh/id_ed25519}"
<pre class='brush:php;toolbar:false;'>ssh -o ConnectTimeout=5 \
-o StrictHostKeyChecking=accept-new \
-o BatchMode=yes \
-p "$port" \
-i "$key" \
-l "$user" \
"$host" "$cmd"}
用法示例:
-
ssh_run 192.168.1.100 "df -h"(用当前用户 + 默认端口/密钥) ssh_run 192.168.1.100 "systemctl restart nginx" admin 2222 ~/.ssh/deploy_key
增强封装:支持多命令与错误判断
实际运维中常需执行多条命令、检查退出码、捕获标准错误。可升级为:
ssh_exec() {
local host="$1"
shift
local cmd="$*"
<pre class='brush:php;toolbar:false;'>if ! output=$(ssh -o ConnectTimeout=5 \
-o StrictHostKeyChecking=accept-new \
-o BatchMode=yes \
"$host" "$cmd" 2>&1); then
echo "❌ Failed on $host: $output" >&2
return 1
else
echo "$output"
return 0
fi}
关键点说明:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
shift和"$*"支持带空格、管道、分号的复杂命令,如"cd /var/log && tail -n 5 nginx/error.log | grep '502'" -
BatchMode=yes禁用交互式提示(如密码输入、yes/no),确保脚本不卡住 -
2>&1合并 stderr 到 stdout,便于统一捕获和判断
批量封装:循环执行 + 并行优化
对多台机器执行相同命令,可用 for 循环封装;加 & 和 wait 实现并发(注意控制并发数防雪崩):
ssh_batch() {
local cmd="$1"
shift
local hosts=("$@")
local max_jobs=5
<pre class='brush:php;toolbar:false;'>for host in "${hosts[@]}"; do
ssh_exec "$host" "$cmd" &
# 控制并发数
if (( $(jobs -r | wc -l) >= max_jobs )); then
wait -n
fi
done
wait # 等待剩余任务}
调用方式:
ssh_batch "uptime" server1 server2 server3- 配合数组更清晰:
servers=(192.168.1.{10..15}); ssh_batch "free -h" "${servers[@]}"
配置驱动封装:对接 ~/.ssh/config
若已用 ~/.ssh/config 定义了别名、端口、用户、密钥等(推荐做法),函数可大幅简化:
ssh_cfg() {
local alias="$1"
local cmd="$2"
ssh -o ConnectTimeout=5 "$alias" "$cmd"
}
前提是在 ~/.ssh/config 中配置好,例如:
Host web01
HostName 192.168.1.100
User deploy
Port 2222
IdentityFile ~/.ssh/web_key
StrictHostKeyChecking accept-new
之后直接调用 ssh_cfg web01 "hostname; df -h" 即可,干净又安全。

















