我的脚本中有以下内容:
connectionTest=$(sshpass -p "${pass}" ssh -q -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "${remoteUser}"@"${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; echo $?")
当我取出命令并在机器上手动运行它时,我得到了我期望的退出代码。但是,每当脚本运行时,生成的退出代码是总是0。
为什么退出代码总是返回 0?
答案1
您收到意外返回状态的原因是您为远程主机引用命令的方式。
考虑并对比这两种说法:
a=apple; ssh remotehost "a=banana; echo $a"
a=apple; ssh remotehost 'a=banana; echo $a'
在第一种情况下,"... $a"
评估前运行命令ssh
,导致这种有效情况:
ssh remotehost "a=banana; echo apple"
在第二种情况下,'... $a'
通过作为字面意思到远程主机执行,导致这种有效情况:
ssh remotehost 'a=banana; echo $a'
这正是您的$?
.由于您已将其用双引号括起来,因此会在运行命令之前对其进行评估。它的零值来自您之前的命令,所以您是什么有效地跑步是这样的:
connectionTest=$(sshpass -p PASSWORD ssh ... "REMOTEUSER@REMOTEIP "echo quit | netcat ... ; echo 0")
您需要的是使用单引号让本地 shell 将其视为文字,如下所示:
connectionTest=$(sshpass -p "${pass}" ssh ... "${remoteUser}@${IP}" "echo quit | netcat -w 5 local.server.local ${telnetPort}; "'echo $?')
请注意,由两部分组成的字符串(例如)"hello"'world'
连接成一个值helloworld
。第一部分进行变量评估;第二部分则不然。