从URL执行bash脚本
假设我在URL“http://mywebsite.com/myscript.txt”中包含一个包含脚本的文件:
#!/bin/bash echo "Hello, world!" read -p "What is your name? " name echo "Hello, ${name}!"
我想运行这个脚本,而不是先保存到一个文件。 我该怎么做呢?
现在,我已经看到了语法:
bash < <(curl -s http://mywebsite.com/myscript.txt)
但是,如果我保存到一个文件,然后执行,似乎并没有这样的工作。 例如readline不起作用,输出只是:
$ bash < <(curl -s http://mywebsite.com/myscript.txt) Hello, world!
同样,我试过了:
curl -s http://mywebsite.com/myscript.txt | bash -s --
有了同样的结果。
最初我有一个解决scheme,如:
timestamp=`date +%Y%m%d%H%M%S` curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp bash /tmp/.myscript.${timestamp}.tmp rm -f /tmp/.myscript.${timestamp}.tmp
但是,这似乎马虎,我想要一个更优雅的解决scheme。
我知道有关从URL运行shell脚本的安全问题,但现在我们忽略所有这些。
source <(curl -s http://mywebsite.com/myscript.txt)
应该这样做。 或者,不要在你的初始redirect,这是redirect标准input; bash
需要一个文件名来执行而不用redirect, <(command)
语法提供了一个path。
bash <(curl -s http://mywebsite.com/myscript.txt)
如果你看echo <(cat /dev/null)
的输出,
这是通过传递一些参数(arg1 arg2)来执行远程脚本的方法:
curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
对于bash:
curl -s http://server/path/script.sh | bash -s arg1 arg2
Bourne shell还支持“-s”从标准input读取。
尝试只是:
bash <(curl -s http://mywebsite.com/myscript.txt)
使用wget
,通常是默认系统安装的一部分:
bash <(wget -qO- http://mywebsite.com/myscript.txt)
你也可以这样做:
wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
最好的办法是
curl http://domain/path/to/script.sh | bash -s arg1 arg2
这是@ user77115的一个小小的改变
只要结合amra和user77115的答案:
wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v
它执行bbstart.sh遥远的脚本,传递-v -v选项。
curl -s -L URL_TO_SCRIPT_HERE | 庆典
例如::
curl -s -L http://bitly/10hA8iC | bash
我经常用下面就足够了
curl -s http://mywebsite.com/myscript.txt | sh
但是在一个旧的系统(kernel2.4)中,遇到了问题,下面的方法可以解决它,我尝试了很多其他方法,只有下面的工作
curl -s http://mywebsite.com/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' $
这个问题可能是由于networking速度慢导致的,或者是bash版本过于老旧,无法正常处理networking缓慢
但是,下面解决了这个问题
$ 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 -