从URL执行bash脚本


182

假设我在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 --

具有相同的结果。

最初我有一个解决方案,例如:

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

但这似乎草率,我想要一个更优雅的解决方案。

我知道有关从URL运行Shell脚本的安全性问题,但是现在让我们忽略所有这些问题。


3
如果您确实创建了一个临时文件,则可能应该使用mktemp而不是使用自己的解决方案
Hasturkun 2011年

cmd <<foo 在大多数shell中是Heredoc语法,可能不是您想要的。
Dietbuddha 2011年

Answers:


217
source <(curl -s http://mywebsite.com/myscript.txt)

应该这样做。或者,不进行您的初始重定向,即重定向标准输入。bash使用文件名即可正常执行而无需重定向,<(command)语法提供了路径。

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

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


谢谢,这清楚了说明发生了什么。很好奇,使用该初始重定向的好处是什么?我问,因为对于RVM安装,他们使用以下命令: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) 为什么不只是: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
小记:如果wget可用,但卷曲不是(如股票Ubuntu桌面系统),可以替代wget -q http://mywebsite.com/myscript.txt -O -curl -s http://mywebsite.com/myscript.txt)。
D Coetzee

5
请注意,您无法将命令行参数传递给脚本。bash will_not_work foobar <(curl -s http://example.com/myscript.sh)如果您拥有脚本,则可以改为使用环境变量:MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)并且它也可以与管道一起使用,如下所示:curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash当然,这要求您使用MYFLAG1和MYFLAG2而不是$ 1和$ 2
Bruno Bronosky 2013年

3
$ sudo bash <(curl -s xxx)得到了错误:bash:/ dev / fd / 63:错误的文件描述符
Jake

2
第一个解决方案(使用源代码的解决方案)根本不起作用。第二种方法有些奏效,但有其局限性。它从子外壳程序中的URL执行脚本。我在脚本中定义了一些功能,希望在父级中使用。反正有实现这一目标的方法吗?还是我不走运,唯一的解决方案是将脚本复制到一个临时文件中,然后提供源代码?
严厉的潘迪


47

对于bash,伯恩贝壳和鱼:

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

标志“ -s”使shell从stdin中读取。


1
例如,这应该适用于大多数贝壳,而接受的答案不适用于
houiui

16

使用wget,通常是默认系统安装的一部分:

bash <(wget -qO- http://mywebsite.com/myscript.txt)

RTFM:gnu.org/software/wget/manual/wget.html。||| -q == --quiet ==“关闭Wget的输出。” ||| -O- == --output-document =-==如果将'-'用作文件,则文档将打印到标准输出。
amra

13

用:

curl -s -L URL_TO_SCRIPT_HERE | bash

例如:

curl -s -L http://bitly/10hA8iC | bash

12

尝试一下:

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

11

您也可以这样做:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash

11

最好的方法是

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

这是@ user77115的答案的轻微变化


6

我经常用下面的就够了

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'
$

该问题可能是由于网络运行缓慢或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
$

4

也:

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

3
最后一个试纸是什么剂量?
拖曳

在bash手册页中:A-表示选项结束并禁用进一步的选项处理。-后面的任何参数均被视为文件名和参数。-的参数等效于-。
2015年

3

只需结合amra和user77115的答案:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

它执行bbstart.sh远程脚本,并向其传递-v -v选项。


2

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

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

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


0

这种方法是很好的常规方法:

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: $#

-3
bash | curl http://your.url.here/script.txt

实际示例:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 

这是完全错误的。发布前测试脚本,不要伪造输出。
korkman,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.