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

正如@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,该消息也一直传播

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值