本地机器X经A跳转至B查多包版本及sshpass命令未找到问题
我来帮你一步步解决这两个问题——sshpass command not found的报错,还有多软件包版本批量检查的需求:
1. 先搞定 sshpass command not found 错误
这个报错的核心原因是你的机器A上没装sshpass——看你的命令逻辑,是先登录到A,然后在A的环境里执行sshpass去连B,所以A必须先安装这个工具:
- 如果A是Debian/Ubuntu系系统,登录A后执行:
sudo apt update && sudo apt install -y sshpass - 如果是RHEL/CentOS/Rocky Linux这类系统:
sudo yum install -y sshpass
不过更推荐用SSH密钥登录替代sshpass明文密码——不仅更安全,还能彻底避免这类命令依赖问题:
- 在本地机器X生成密钥对(没有的话执行):
ssh-keygen -t ed25519 -N "" -f ~/.ssh/jump_key - 把公钥传到机器A:
ssh-copy-id -p 30025 admin@A.A.A.A - 再从A把公钥传到机器B:
ssh -p 30025 admin@A.A.A.A "ssh-copy-id admin@B.B.B.B"
之后就再也不用输密码,也不会有sshpass找不到的问题了。
2. 优化跳转逻辑:直接从本地X跳转到B
你现在嵌套两层ssh的写法不仅可读性差,还容易出问题。推荐用SSH的ProxyJump(OpenSSH 7.4以上版本支持)直接从本地X通过A跳转B,全程在X的环境里操作:
# 密钥登录的话,直接这么写 ssh -o ProxyJump="admin@A.A.A.A:30025" admin@B.B.B.B "你的检查命令" # 如果还是想用密码,需要本地X装sshpass,命令是: sshpass -p 'Password' ssh -o ProxyJump="admin@A.A.A.A:30025" admin@B.B.B.B "你的检查命令"
这样就不用管A上有没有sshpass了,所有依赖都在本地X。
3. 实现多软件包版本批量检查
要一次性查多个包(比如env.ns、nginx、mysql-server),用循环遍历最直观,也方便维护:
直接执行的命令(密钥登录版)
ssh -o ProxyJump="admin@A.A.A.A:30025" admin@B.B.B.B << 'EOF' # 这里写要检查的包列表 PACKAGES=("env.ns" "nginx" "mysql-server") for pkg in "${PACKAGES[@]}"; do # 查包信息,处理格式;如果包不存在就提示 dpkg -s "$pkg" 2>/dev/null | grep -E 'Package|Version' | tr '\n' ',' | sed 's/,$/\n/' || echo "$pkg: 未安装或查询失败" done EOF
写成本地脚本复用
如果需要经常执行,把逻辑写成本地X上的bash脚本更方便:
#!/bin/bash # 配置参数,按需修改 JUMP_HOST="admin@A.A.A.A:30025" TARGET_HOST="admin@B.B.B.B" CHECK_PACKAGES=("env.ns" "nginx" "mysql-server") # 如果用密码登录,取消下面注释并填密码 # SSHPASS="YourPasswordHere" # 执行检查 if [ -n "$SSHPASS" ]; then sshpass -p "$SSHPASS" ssh -o ProxyJump="$JUMP_HOST" "$TARGET_HOST" << 'EOF' for pkg in "${CHECK_PACKAGES[@]}"; do dpkg -s "$pkg" 2>/dev/null | grep -E 'Package|Version' | tr '\n' ',' | sed 's/,$/\n/' || echo "$pkg: 未安装或查询失败" done EOF else ssh -o ProxyJump="$JUMP_HOST" "$TARGET_HOST" << 'EOF' for pkg in "${CHECK_PACKAGES[@]}"; do dpkg -s "$pkg" 2>/dev/null | grep -E 'Package|Version' | tr '\n' ',' | sed 's/,$/\n/' || echo "$pkg: 未安装或查询失败" done EOF fi
给脚本加执行权限:chmod +x check_pkgs.sh,然后运行./check_pkgs.sh就行。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

