在传递给bash-s之前,如何验证curl响应?

在传递给bash-s之前,如何验证curl响应?,bash,curl,Bash,Curl,我有一个脚本,看起来像: curl -sSL outagebuddy.com/path/linux_installer | bash -s 用户可以使用提供给他们的命令为站点安装linux客户端。我认为应该有一个中间步骤来验证curl是否有2XX响应,并在将内容传递给bash之前成功下载内容。我该怎么做呢?如果您不介意使用一个中间文件(如果您想确保curl命令完全工作,您当然需要该文件),那么您可以使用: if curl --fail -sSL <params> -o script

我有一个脚本,看起来像:

curl -sSL outagebuddy.com/path/linux_installer | bash -s

用户可以使用提供给他们的命令为站点安装linux客户端。我认为应该有一个中间步骤来验证
curl
是否有2XX响应,并在将内容传递给
bash
之前成功下载内容。我该怎么做呢?

如果您不介意使用一个中间文件(如果您想确保
curl
命令完全工作,您当然需要该文件),那么您可以使用:

if curl --fail -sSL <params> -o script.sh
then
    bash script.sh
fi
if curl--fail-sSL-o script.sh
然后
bash script.sh
fi

没有用户管理的临时文件:

if script=$(curl --fail -sSL "$url"); then
  bash -s <<<"$script"
fi
if脚本=$(curl--fail-sSL“$url”);然后

bash-s您可以使用
--fail
标志,该标志将抑制输出,并为指示失败的响应返回非零状态。除了hmm的注释外,请参阅:在服务器开始写入数据之前,您就知道这是否是2XX响应,因为头先出现。因此,
curl--fail
就足够了,可以当场复制上面的建议。谢谢大家的评论,
--fail
效果很好@BenjaminW.,我也一样。这是直接从安装程序页面引用的一句话:“如果您愿意,请让您的IT人员检查将在您的系统上运行的代码。”该文本的后半部分是指向页面的链接,该页面获得
curl
d,然后通过管道传输到bash。如上所述,我同意这个问题是重复的。也许可以编辑问题,使其包含成功完成转移的要求,并接受其中一个其他答案,以使具有该要求的其他人受益。除非有某种方法来验证
script.sh
的内容,否则这不起作用<如果接收到响应,code>curl
将退出0,即使该响应是404、403等。对,我看到
--fail
是强制性的,因此我们会得到一个失败(在大多数情况下)。我更新了我的回答,“当然需要”有点强烈,不是吗?即使一个人超出了OP的请求,只是检查头中的响应代码,他也可以将内容存储在内存中,而不是将其写入文件中。很好。对只要脚本不太长,它就可以正常工作。输出也可以是
tmpfs
文件系统。您仍然需要等待整个传输完成,然后才能决定它是否有效。只需添加
--fail
看起来就足以完成该工作。它不会通过管道传输到
bash
。谢谢你的回复!here字符串仍然会创建一个临时文件,不是吗?也许
if!卷曲然后回波退出;fi | bash
相反,如果下载失败,只需执行一个不做任何事情的脚本。作为实现细节(在使用之前自动删除),但是是的。它需要是这样的,比如说,
bash-s<简单地添加
--fail
看起来就足够完成这项工作了。它不会通过管道传输到
bash
。谢谢你的回复!当然当然,
--fail
不会告诉您
curl
是否确实成功检索了文件的完整内容,它只会告诉您文件是否以HTTP 200头开始。如果它以正确的标题开始,并在(f/e)中途被截断,
curl
将已经将它接收到的一半数据写入stdout,并且
bash-s
可能已经开始运行它。哦,我没想到它会允许下载和运行一半的内容!谢谢你添加这一点,并帮助我理解。