ssh – 使用“curl |”远程执行脚本bash“反馈
我正在使用一个使用很多这样命令的平台:
这是非常干净和方便远程执行脚本,但是,我不会看到任何方式获取脚本的输出/退出代码.任何人都可以找出一些东西,以确保脚本已正确执行(从主机启动ssh的角度来看). 解决方法正如@Zoredache指出的那样,ssh将远程命令的状态作为自己的退出状态进行中继,因此错误检测通过SSH透明地工作.但是,在您的示例中需要特别考虑两个要点.首先,卷曲往往非常宽松,将许多异常情况视为成功.例如,curl http://serverfault.com/some-non-existent-url-that-returns-404实际上具有退出状态0.我发现此行为违反直觉.要将这些条件视为错误,我喜欢使用-fsS标志: > –fail标志在发生故障时抑制输出,因此bash将无法像执行代码一样执行Web服务器的404错误页面. 其次,您有一个管道,这意味着第一个或第二个命令可能会发生故障.从约Pipelines in bash(1)部分:
旁注:bash文档是相关的,不是因为你管道bash,而是因为(我假设)它是你的远程用户的登录shell,因此是解释远程命令行并处理管道执行的程序.如果用户具有不同的登录shell,请参阅该shell的文档. 作为一个具体的例子, ( echo whoami ; false ) | bash echo $? 产生输出 login 0 证明管道末端的bash将掩盖false返回的错误状态.只要它成功执行whoami,它将返回0. 相反, set -o pipefail ( echo whoami ; false ) | bash echo $? 产量 login 1 以便报告管道上半部分的故障. 总而言之,解决方案应该是 ssh login@server.com 'set -s pipefail ; curl -fsS http://some_server/script.sh | bash' 这样,如果以下任何一个返回非零,您将获得非零退出状态: > ssh 此外,如果curl -fsS检测到异常的HTTP状态代码,那么它将: >抑制它的STDOUT,这样就不会有任何东西被传递给bash来执行>返回一个非零值,该值一直正确传播>将一行诊断消息打印到其STDERR,该消息也一直传播 (编辑:长春站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |