假设我在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脚本的安全问题,但让我们暂时忽略所有这些问题。


当前回答

如果你想让脚本使用当前的shell运行,不管它是什么,使用:

${SHELL:-sh} -c "$(wget - qo - http://mywebsite.example/myscript.txt)"

如果你有wget,或者:

${SHELL:-sh} -c "$(curl -Ls http://mywebsite.example/myscript.txt)"

如果有旋度。

如果脚本是交互式的,这个命令仍然有效,也就是说,它要求用户输入。

注意:默认情况下,OpenWRT有wget克隆,但没有curl。

其他回答

另外:

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

如果你想让脚本使用当前的shell运行,不管它是什么,使用:

${SHELL:-sh} -c "$(wget - qo - http://mywebsite.example/myscript.txt)"

如果你有wget,或者:

${SHELL:-sh} -c "$(curl -Ls http://mywebsite.example/myscript.txt)"

如果有旋度。

如果脚本是交互式的,这个命令仍然有效,也就是说,它要求用户输入。

注意:默认情况下,OpenWRT有wget克隆,但没有curl。

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

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

最好的办法是

curl http://domain/path/to/script.sh | bash -s arg1 arg2

这是@user77115的回答略有变化吗

这种方式既好又传统:

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#