ssh – 使用“curl |”远程执行脚本bash“反馈

ssh – 使用“curl |”远程执行脚本bash“反馈,第1张

概述我正在使用一个使用很多这样命令的平台: ssh [email protected]’curl http://some_server/script.sh |庆典” 这是非常干净和方便远程执行脚本,但是,我不会看到任何方式获取脚本的输出/退出代码.任何人都可以找出一些东西,以确保脚本已正确执行(从主机启动ssh的角度来看). 正如@Zoredache指出的那样,ssh将远程命令的状态作为自己的退出状态进 我正在使用一个使用很多这样命令的平台:
ssh [email protected]’curl http://some_server/script.sh |庆典”

这是非常干净和方便远程执行脚本,但是,我不会看到任何方式获取脚本的输出/退出代码.任何人都可以找出一些东西,以确保脚本已正确执行(从主机启动ssh的角度来看).

解决方法 正如@Zoredache指出的那样,ssh将远程命令的状态作为自己的退出状态进行中继,因此错误检测通过SSH透明地工作.但是,在您的示例中需要特别考虑两个要点.

首先,卷曲往往非常宽松,将许多异常情况视为成功.例如,curl http://serverfault.com/some-non-existent-url-that-returns-404实际上具有退出状态0.我发现此行为违反直觉.要将这些条件视为错误,我喜欢使用-fsS标志:

> –fail标志在发生故障时抑制输出,因此bash将无法像执行代码一样执行Web服务器的404错误页面.
> –silent –show-error标记一起提供合理数量的错误报告. –silent抑制卷曲的所有评论. –show-error重新启用错误消息,这些消息将发送到STDERR.

其次,您有一个管道,这意味着第一个或第二个命令可能会发生故障.从约Pipelines in bash(1)部分:

The return status of a pipeline is the exit status of the last command,unless the pipefail option is enabled (see 07001). If pipefail is enabled,the pipeline’s return status is the value of the last (rightmost) command to exit with a non-zero status,or zero if all commands exit successfully.

旁注:bash文档是相关的,不是因为你管道bash,而是因为(我假设)它是你的远程用户的登录shell,因此是解释远程命令行并处理管道执行的程序.如果用户具有不同的登录shell,请参阅该shell的文档.

作为一个具体的例子,

( echo whoami ; false ) | bashecho $?

产生输出

login0

证明管道末端的bash将掩盖false返回的错误状态.只要它成功执行whoami,它将返回0.

相反,

set -o pipefail( echo whoami ; false ) | bashecho $?

产量

login1

以便报告管道上半部分的故障.

总而言之,解决方案应该是

ssh [email protected] 'set -s pipefail ; curl -fsS http://some_server/script.sh | bash'

这样,如果以下任何一个返回非零,您将获得非零退出状态:

> ssh
>远程登录shell
>卷曲
>管道末端的bash

此外,如果curl -fsS检测到异常的http状态代码,那么它将:

>抑制它的STDOUT,这样就不会有任何东西被传递给bash来执行>返回一个非零值,该值一直正确传播>将一行诊断消息打印到其STDERR,该消息也一直传播

总结

以上是内存溢出为你收集整理的ssh – 使用“curl |”远程执行脚本bash“反馈全部内容,希望文章能够帮你解决ssh – 使用“curl |”远程执行脚本bash“反馈所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1038024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存