来自URL的Bash脚本:当curl失败时返回代码?

时间:2015-08-20 12:54:47

标签: bash curl

直接从URL执行bash脚本的解决方案之一是:

bash <(curl -sS http://1.1.1.1/install) 

问题是当curl无法检索到url时,bash得到什么都不作为输入并且它正常结束(返回代码0)。

我希望整个命令使用curl的返回码中止

更新

两种可能的解决方案:

curl -sS http://1.1.1.1/install | bash; exit ${PIPESTATUS[0]}

或:

bash <(curl -sS http://1.1.1.1/install || echo "exit $?")

最后一个是hackish(但更短)

3 个答案:

答案 0 :(得分:4)

试试这个以获得curl的返回码:

curl -sS http://1.1.1.1/install | bash
echo ${PIPESTATUS[0]}

答案 1 :(得分:2)

使用临时文件。

trap 'rm "$install"' EXIT
installer=$(mktemp)
curl ... > "$installer" || exit
# Ideally, verify the installer *before* running it
bash "$installer"

这就是原因。如果您只是将curl返回到bash的任何内容,那么您实际上是允许在您的计算机上执行未知代码。最好先确保你正在执行的内容不是有害的。

您可能会问,这与使用预打包的安装程序,RPM或其他软件包系统有何不同?使用软件包,您可以通过打包程序提供的校验和来验证您要安装的软件包是否与他们提供的软件包相同。您仍然需要信任打包者,但您不必担心攻击者在途中修改程序包(中间人攻击)。

答案 2 :(得分:1)

您可以将curl命令的输出保存在变量中,并仅在返回状态为零时执行它。它可能不是那么优雅,但它与其他shell更兼容(不依赖$PIPESTATUS,这在许多shell上都不可用):

install=`curl -sS http://1.1.1.1/install`
if [ $? -ne 0 ]; then
  echo "error"
else
  echo "$install" | bash
fi