使用Bash脚本拉取远程服务器Linux待处理安全更新至Nagios时遇报错
排查sshpass执行远程命令报错:No such file or directory
看起来你是把ssh命令的格式搞混了,这才导致了sshpass: Failed to run command: No such file or directory的错误。咱们一步步来修正:
首先,修正命令格式(核心问题)
你的原命令把ssh的参数和远程命令的写法都搞错了,sshpass的正确用法是先指定密码,然后调用ssh命令并传递ssh的配置参数,最后用引号包裹要在远程执行的命令。正确的命令应该是这样:
UPDATES=$(sshpass -p "password" ssh -o StrictHostKeyChecking=no user@server "/usr/lib/update-notifier/apt-check" 2>&1) echo "$UPDATES"
原命令的错误点拆解:
- 参数位置错误:
StrictHostKeyChecking=no是ssh的配置参数,不是sshpass的,必须通过ssh -o来传递 - 远程命令写法错误:要在远程执行的命令必须放在ssh连接信息的后面,并用引号包裹,而不是直接拼在
user@server后面(这样ssh会把/usr/lib/update-notifier/apt-check当成主机名的一部分,自然找不到) - 额外小建议:echo变量时用双引号包裹,避免因为输出内容里的空格导致内容被拆分显示
如果修正后还是报错,检查这两点
确认远程服务器上的文件存在
手动登录到远程服务器,执行/usr/lib/update-notifier/apt-check看看是否能正常运行。如果提示“No such file or directory”,说明这个路径不对:- 有些系统可能把这个工具放在其他位置,比如
/usr/bin/apt-check - 如果是Ubuntu/Debian系统,可能需要先安装
update-notifier-common包:sudo apt install update-notifier-common
- 有些系统可能把这个工具放在其他位置,比如
检查sshpass是否安装
虽然报错提示的是找不到命令,但也可以确认下本地机器是否安装了sshpass:sshpass -V,如果没安装,用包管理器安装(比如Ubuntu:sudo apt install sshpass)
最后提个安全提醒
把密码明文写在脚本里是非常不安全的操作,建议改用SSH密钥认证,这样既不用输入密码,也避免了密码泄露的风险。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

