假设我在URL http://mywebsite.example/myscript.txt上有一个包含脚本的文件:

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

我希望在不先将其保存到文件的情况下运行该脚本。我怎么做呢?

现在,我已经看到了语法:

bash < <(curl -s http://mywebsite.example/myscript.txt)

但这似乎不像我保存到一个文件,然后执行。例如,readline不工作,输出只是:

$ bash < <(curl -s http://mywebsite.example/myscript.txt)
Hello, world!

同样,我也试过:

curl -s http://mywebsite.example/myscript.txt | bash -s --

同样的结果。

最初我的解决方案是这样的:

timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.example/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

但这看起来很草率,我想要一个更优雅的解决方案。

我知道关于从URL运行shell脚本的安全问题,但让我们暂时忽略所有这些问题。


当前回答

我经常用下面的就够了

curl -s http://mywebsite.example/myscript.txt | sh

但是在一个老系统(kernel2.4)中,它遇到了问题,做下面的事情就可以解决它,我尝试了很多其他的,只有下面的工作

curl -s http://mywebsite.example/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

例子

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

问题可能是由于网络慢,或者bash版本太旧,不能优雅地处理网络慢

但是,下面的方法可以解决这个问题

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$

其他回答

你可以使用curl并将它发送给bash,就像这样:

bash <(curl -s http://mywebsite.example/myscript.txt)
source <(curl -s http://mywebsite.example/myscript.txt)

应该这么做。或者,在您的重定向上去掉初始重定向,即重定向标准输入;Bash需要一个文件名来执行,不需要重定向,而<(命令)语法提供了一个路径。

bash <(curl -s http://mywebsite.example/myscript.txt)

如果你看一下echo <(cat /dev/null)的输出可能会更清楚

我经常用下面的就够了

curl -s http://mywebsite.example/myscript.txt | sh

但是在一个老系统(kernel2.4)中,它遇到了问题,做下面的事情就可以解决它,我尝试了很多其他的,只有下面的工作

curl -s http://mywebsite.example/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

例子

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

问题可能是由于网络慢,或者bash版本太旧,不能优雅地处理网络慢

但是,下面的方法可以解决这个问题

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$

另外:

curl -sL https://.... | sudo bash -

是一些无人值守的脚本我使用以下命令:

sh -c "$(curl - ssl <URL>)"

我建议避免直接从url执行脚本。您应该确保URL是安全的,并在执行之前检查脚本的内容,您可以在执行之前使用SHA256校验和来验证文件。