当我们在远程机器上运行这个时,我们得到
ssh $IP "systemctl disable iptables.service"
标准误差为
echo $?
0
但运行它时出现错误(我添加了错误的语法)
例如
ssh $IP "systemctl disable_bug iptables.service"
为什么我们从标准错误中得到 0?尽管命令失败!
echo $?
0
答案1
您正在回显 ssh 命令的结果 - 两次都成功完成(即 ssh 正常)。您没有显示通过 ssh 运行的命令的结果。
如果将命令的输出直接发送到文件(通过 tee 或只是正常重定向),则可以稍后收集结果。
编辑
由于反对票(我推测是 OP 没有意识到我已经回答的是正确的(见评论)),我正在扩展这个答案。
当你运行时echo $?
,它将输出上次运行的退出代码当地的命令。例如:
$ ssh user@host 'ls /tmp'
lastSubredditNeighborsRun.log
meetupDumper.log
mongodb-27017.sock
$ echo $?
0
这是返回代码远程控制-不是远程运行的返回代码ls
。
运行echo $?
可能也不会显示任何内容:
$ ssh user@host 'ls /tp' && echo $?
ls: cannot access /tp: No such file or directory
或者它可能会显示错误返回代码 - 如果您没有在命令行上链接运行它:
$ ssh user@host 'ls /tp'
ls: cannot access /tp: No such file or directory
$ echo $?
2
ssh 可能会将发送的命令的错误代码发回 - 它应该如此 - 作为它自己的错误代码......但并非总是如此。
但跑步echo $?
是总是只能回显最近运行的错误代码当地的命令。如果 ssh 将远程错误代码作为自己的代码返回,那就太棒了。但如果没有(或者远程命令没有发送错误代码),您将获得预期的结果echo $?
- 即0
如果上一个命令成功运行。