我有以下形式的命令:
dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"
如何检查 ssh 命令是否由于连接问题而失败?
谢谢。
答案1
管道的返回状态是最后一个命令的退出状态,除非
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]
第二个命令的退出状态,依此类推。