代码之家  ›  专栏  ›  技术社区  ›  tooptoop4

从ssh隧道[duplicate]上运行的命令获取返回代码

  •  1
  • tooptoop4  · 技术社区  · 6 年前

    即使代码.sh具有非0退出代码此命令在ssh连接成功时返回0。如何在远程服务器上获取.sh的实际返回码?

    /home/mycode.sh '20'${ODATE} 1 | ssh -L 5432:localhost:5432 myuser@myremotehost cat
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   svsd    6 年前

    这与SSH无关,而是与如何使用SSH有关 bash 处理管道中的退出状态。从 猛击 手册页码:

    管道的返回状态是最后一个命令的退出状态,除非启用了pipefail选项。如果启用了pipefail,则管道的返回状态是最后一个(最右侧)要退出的命令的值,状态为非零;如果所有命令都成功退出,则返回零。如果保留字!在管道之前,该管道的出口状态是上述出口状态的逻辑否定。shell等待管道中的所有命令终止,然后返回值。

    如果要检查管道中是否存在由于所涉及的任何命令而导致的错误,只需设置 pipefail 选项:

    set -o pipefail
    your_pipeline_here
    echo $? # Prints non-zero if something went wrong
    

    ssh

    res="$(/home/mycode.sh '20'${ODATE} 1)"
    if (( $? == 0 )); then
        echo -n "$res" | ssh -L 5432:localhost:5432 myuser@myremotehost cat
    else
        # You can do anything with the exit status here - even pass it on as an argument to the remote command
        echo "mycode.sh failed" >&2
    fi
    

    您可能希望保存 mycode.sh $res

        2
  •  1
  •   Community Egal    4 年前

    /home/mycode.sh 位于本地主机上。 ssh命令正在运行 cat 在远程服务器上。

    所有文本打印到 被重定向到 标准输入。

    这个 man ssh 内容如下:

    EXIT STATUS
    
     ssh exits with the exit status of the remote command or with 255 if an error occurred.
    

    ssh 存在于 EXIT STATUS

    如果 /家/代码.sh 脚本将命令打印到标准输入,当 不存在:

    /home/mycode.sh '20'${ODATE} 1 | ssh -L 5432:localhost:5432 myuser@myremotehost
    

    退出状态 宋承宪 :

    printf "%s\n" "uname -r" date "ls this_file_does_not_exist" |\
      ssh -L 5432:localhost:5432 myuser@myremotehost ;\
      printf "EXIT STATUS of the last command, executed remotely with ssh is %d\n" $?
    
    4.4.0-119-generic
    Wed Aug 29 02:55:04 EDT 2018
    ls: cannot access 'this_file_does_not_exist': No such file or directory
    EXIT STATUS of the last command, executed remotely with ssh is 2