如何检查 ssh 隧道的退出代码?

如何检查 ssh 隧道的退出代码?

我有以下形式的命令:

dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"

如何检查 ssh 命令是否由于连接问题而失败?

谢谢。

答案1

man 1 bash

管道的返回状态是最后一个命令的退出状态,除非pipefail启用了该选项。如果pipefail启用了,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令都成功退出,则返回状态为零。

然后从man 1 ssh

ssh以远程命令的退出状态或255发生错误时退出。

通常(pipefail禁用)您将获得退出状态ssh。 的可能值255可能来自ssh其本身,也可能来自您在远程端运行的任何命令(但“常见”错误通常会产生“低”退出状态,如1, 2)。实际上255表示出了严重的问题。

$?管道退出后,退出状态可用作特殊参数。例如:

$ true | ssh no-such-address.example.org true
# error message here, skipped
$ echo $?
255

要从 获得更具体的信息ssh,您需要分析其 stderr。请参阅手册,尤其是-E(如果有)和-v选项。-E指定应写入的日志文件ssh,但通过使用 重定向 stderr 可以获得类似的效果2>/path/to/logfile。关于-v

-v
详细模式。ssh打印有关其进度的调试消息。这有助于调试连接、身份验证和配置问题。多个-v选项可增加详细程度。最大值为3

因此,一般程序是这样的:ssh退出后,检查退出状态;如果是255,则分析logfile失败是否是“由于连接问题导致的”。

答案2

使用 :echo ${PIPESTATUS[1]}

或者echo ${PIPESTATUS[*]}检查所有命令的退出状态。

参见示例:$管道状态

数组的成员$PIPESTATUS保存管道中执行的每个相应命令的退出状态。$PIPESTATUS[0]保存管道中第一个命令的退出状态、$PIPESTATUS[1]第二个命令的退出状态,依此类推。

相关内容