加入收藏 | 设为首页 | 会员中心 | 我要投稿 520站长网 (https://www.520shu.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2021-03-15 21:31:58 所属栏目:Linux 来源:网络整理
导读:我正在使用一个使用很多这样命令的平台: ssh login@server.com’curl http://some_server/script.sh |庆典” 这是非常干净和方便远程执行脚本,但是,我不会看到任何方式获取脚本的输出/退出代码.任何人都可以找出一些东西,以确保脚本已正确执行(从主机启动s

我正在使用一个使用很多这样命令的平台:
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,该消息也一直传播

(编辑:520站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读