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

Bash脚本执行ssh命令后出现‘command not found’错误原因排查

Bash脚本执行ssh后出现"command not found"错误

我正在使用GNU bash 4.4.11(1)-release(sparc-sun-solaris2.11)编写脚本,脚本遍历主机文件./FILES/Solaris_Full_Inventory_Dec_2022.txt中的主机,通过ssh执行/usr/bin/id命令检查指定用户。脚本功能可正常运行,但执行后会出现“command not found”错误,开启set -x后的执行日志如下:

# set -o pipefail

HOSTS=./FILES/Solaris_Full_Inventory_Dec_2022.txt
+ HOSTS=./FILES/Solaris_Full_Inventory_Dec_2022.txt

cmd0="/usr/bin/id"
+ cmd0=/usr/bin/id
usernames=$(cat <<EOF
sac_haeaadmin
sac_botadmin
sac_appadmin
EOF
)
sac_haeaadmin
sac_botadmin
sac_appadmin
EOF
++ cat
+ usernames='sac_haeaadmin
sac_botadmin
sac_appadmin'

while read line; do
  [ "${line:0:1}" = "#" ] && continue
  echo $line;
for x in ${usernames}; do
       $(ssh -qntT -o StrictHostKeyChecking=no $line "${cmd0} $x");
     done
done<$HOSTS
+ read line
+ '[' C = '#' ']'
+ echo hostname1
hostname1
+ for x in ${usernames}
++ ssh -qntT -o StrictHostKeyChecking=no hostname1 '/usr/bin/id sac_haeaadmin'
+ 'uid=10201(sac_haeaadmin)' 'gid=1005(sugrp)'
./checkfor_username_solaris.sh: line 21: uid=10201(sac_haeaadmin): **command not found**
+ for x in ${usernames}
++ ssh -qntT -o StrictHostKeyChecking=no hostname2 '/usr/bin/id sac_botadmin'
+ 'uid=10202(sac_botadmin)' 'gid=20001(ibm)'
./checkfor_username_solaris.sh: line 21: uid=10202(sac_botadmin): command not found
+ for x in ${usernames}
++ ssh -qntT -o StrictHostKeyChecking=no hostname3 '/usr/bin/id sac_appadmin'
+ 'uid=10203(sac_appadmin)' 'gid=20002(appuser)'
./checkfor_username_solaris.sh: line 21: uid=10203(sac_appadmin): command not found

我是Bash新手,希望有人能解答该错误的产生原因,谢谢!


错误原因

你用的$(ssh -qntT ...)是命令替换语法,Bash会先执行括号里的ssh命令,把输出结果当作新的命令去执行。而ssh返回的uid=xxx(xxx) gid=xxx(xxx)是普通字符串,不是合法的Bash命令,所以触发了"command not found"错误。

解决方法

  • 如果只是想让ssh的输出直接打印到终端,去掉$(...)直接执行ssh即可:
ssh -qntT -o StrictHostKeyChecking=no "$line" "${cmd0} $x"
  • 如果需要捕获输出做后续处理,把结果赋值给变量:
result=$(ssh -qntT -o StrictHostKeyChecking=no "$line" "${cmd0} $x")
# 后续可对$result做处理,比如打印或判断
echo "$result"

另外建议给变量加上双引号(如"$line"、"${usernames}"),避免空格或特殊字符导致意外问题。

内容的提问来源于stack exchange,提问作者user2766895

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:10:48