如何在 Shell 脚本中建立远程连接时捕获错误

Posted

技术标签:

【中文标题】如何在 Shell 脚本中建立远程连接时捕获错误【英文标题】:How to Catch an Error While Establishing Remote Connection in Shell Script 【发布时间】:2019-04-08 10:10:44 【问题描述】:

这就是我的 shell 脚本的一部分。

#! /bin/sh
sftp -i $IdentityFile $ServerAddress << EOF
command 1 #Execute in the remote
command 2 #Execute in the remote
bye
EOF
command 3 #Execute locally

根据我目前对脚本的了解,如果一个命令执行失败,控制权会简单地传递给下一个命令。但是如果 sftp 命令无法在上面的块中建立网络连接怎么办?这是否意味着command 1command 2 将在本地执行?还是控件会跳转到command 3

如何捕捉 sftp 中可能出现的错误并将控件定向到command 3?如果可能的话,我可以使用? 变量检测错误,以采取某些先发制人的行动吗?一些指导会很棒。

【问题讨论】:

here-document的内容不是shell命令的一部分,而是一组要传递给sftp的stdin的字符串,如果连接失败,将被丢弃。然后控件跳转到command 3sftp 的错误代码设置为$?。请访问here 获取代码表。 【参考方案1】:

有几件事要做。

首先,您需要将输入提取为函数,以允许使用 command3 进行管道传输,这样会更清晰:

function sfpInstruction() 
cat << EOF
command 1
command 2
bye
EOF

因此,您的 sftp 指令可以更改为:

tmpFile="/tmp/errorFile.txt"
sftp -i $IdentityFile $ServerAddress $( sfpInstruction ) 2>"$tmpFile" || command3

这样的方式:

所有错误信息都在您的错误文件中输出 在任何情况下,如果 sftp 以失败状态(非 0)退出,GNU/Bash 将执行 command3 如果您还希望 command3 读取/检查/解析错误消息,您可以给它 "$tmpFile"

【讨论】:

在 *** 上,您可以将up-vote 提供给人们有用的答案以感谢他们,并从所有答案中选择correct answer 中的任何一个。

以上是关于如何在 Shell 脚本中建立远程连接时捕获错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从 shell 脚本中捕获 Spark 错误

如何使用XManager下的Xshell远程连接Linux

JenkinsJenkins配置从节点,实现远程主机调用功能

如何使用python执行远程shell脚本

从 cron 运行时远程端口转发断开连接

UI测试之远程桌面连接的困扰