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

前端之家收集整理的这篇文章主要介绍了ssh – 使用“curl |”远程执行脚本bash“反馈前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个使用很多这样命令的平台:
ssh login@server.com’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 ) | 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
>远程登录shell
>卷曲
>管道末端的bash

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

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

猜你在找的Linux相关文章