You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地机器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明文密码——不仅更安全,还能彻底避免这类命令依赖问题:

  1. 在本地机器X生成密钥对(没有的话执行):
    ssh-keygen -t ed25519 -N "" -f ~/.ssh/jump_key
    
  2. 把公钥传到机器A:
    ssh-copy-id -p 30025 admin@A.A.A.A
    
  3. 再从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:16:56