【问题标题】:SSH Remote command exit codeSSH 远程命令退出代码
【发布时间】:2018-10-01 14:42:52
【问题描述】:

我知道有很多关于它的讨论,但我需要你帮助解决 ssh 远程命令退出代码。我有那个代码: (scan 是一个在给定文件中扫描病毒的脚本)

for i in $FILES 
do
    RET_CODE=$(ssh $SSH_OPT $HOST "scan $i; echo $?")
    if [ $? -eq 0 ]; then
        SOME_CODE

扫描有效,如果发现病毒,则返回 0 或(1 表示错误)或 2。但不知何故,我的返回码总是 0。即使我扫描了病毒。

这里是set -x 输出:

++ ssh -i /home/USER/.ssh/id host 'scan Downloads/eicar.com; echo 0'
+ RET_CODE='File Downloads/eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
0'

如果我在没有 ssh 的“远程”机器上运行这些命令,这是输出:

[user@ws ~]$ scan eicar.com; echo $?
File eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
2

我只想要返回码,我不需要scan 的所有其他输出。

!更新!

看来,echo 是问题所在。

【问题讨论】:

    标签: linux bash shell unix scripting


    【解决方案1】:

    你的ssh 总是返回0 的原因是因为最后的echo 命令总是成功的!如果要从scan 获取返回码,请删除echo 或将其分配给变量并使用exit。在我的系统上:

    $ ssh host 'false'
    $ echo $?
    1
    $ ssh host 'false; echo $?'
    1
    $ echo $?
    0
    $ ssh host 'false; ret=$?; echo $ret; exit $ret'
    1
    $ echo $?
    1
    

    【讨论】:

    • 在第二个例子中,你的意思是0作为返回值?
    • 是的,'假;回声$?退出值为 0,因为该值来自(成功的)回显命令。但是,回显的值为 1,因为它来自 false 命令。
    • 好吧,然后我误解了我自己的脚本。现在脚本在执行代码后停止,因为我猜输出中有换行符。是否也是exit 0,如果我将输出通过管道传输到/dev/null
    • 重定向输出不影响退出值。
    【解决方案2】:

    ssh 返回它运行的整个管道的退出状态 - 在这种情况下,这就是 echo $? 的退出状态。

    您想要做的只是直接使用ssh 结果(因为您说您不想要任何输出):

    for i in $FILES 
    do
        if ssh $SSH_OPT $HOST "scan $i >/dev/lull 2>&1"
        then
            SOME_CODE
    

    如果您真的觉得必须打印返回码,您可以使用EXIT 陷阱在不影响整体结果的情况下执行此操作:

    for i in $FILES 
    do
        if ssh $SSH_OPT $HOST "trap 'echo \$?' EXIT; scan $i >/dev/lull 2>&1"
        then
            SOME_CODE
    

    演示:

    $ ssh $host "trap 'echo \$?' EXIT; true"; echo $?
    0
    0
    $ ssh $host "trap 'echo \$?' EXIT; false"; echo $?
    1
    1
    

    顺便说一句,我建议您在脚本中避免使用大写变量名——这些通常用于改变程序行为的环境变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多