2011-04-20 341 views
109

說我有一個包含腳本的URL「http://mywebsite.com/myscript.txt」文件:執行bash腳本

#!/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腳本的安全問題,但我們現在忽略所有這些。

+1

如果你最終創建一個臨時文件,你應該使用'mktemp'而不是滾動你自己的解決方案 – Hasturkun 2011-04-20 19:44:23

+0

'cmd << foo'在大多數shell中是heredoc語法,可能不是你想要的。 – dietbuddha 2011-04-20 20:52:10

回答

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

應該做到這一點。或者,不要在你的初始重定向上重定向標準輸入; bash需要文件名才能在沒有重定向的情況下執行正常,並且語法提供了一條路徑。

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

如果你看看echo <(cat /dev/null)

+0

謝謝,這說明了發生了什麼事。 只是好奇,使用該初始重定向的優點是什麼?我問,因爲RVM的安裝,他們使用的命令: '的bash <<(捲曲-s https://rvm.beginrescueend.com/install/rvm)' 爲什麼不乾脆: '的bash <(捲曲-s https://rvm.beginrescueend.com/install/rvm)' – Tristan 2011-04-20 20:49:31

+0

@Tristan:如果他們正在運行交互式安裝腳本/程序(商業安裝程序包或安裝程序,同時還支持自定義安裝類型),他們可以提供默認答案。 – geekosaur 2011-04-20 20:52:52

+3

小記:如果wget可用,但curl不可用(例如在一個Ubuntu桌面系統上),你可以用'wget -q http://mywebsite.com/myscript.txt -O -'替換'curl -s http :// mywebsite.com/myscript.txt')。 – 2012-08-21 22:47:18

10

儘量只:

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

輸出使用wget,通常是系統默認安裝的一部分,它可以更清楚:

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

什麼是-qO-? – CodeGuru 2017-11-02 08:34:52

+0

RTFM:https://www.gnu.org/software/wget/manual/wget.html。 ||| -q == --quiet ==「關閉Wget的輸出。」 ||| -O- == --output-document = - ==如果使用' - '作爲文件,文檔將被打印到標準輸出。 – amra 2017-11-20 11:26:35

9

你也可以這樣做:

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

這是通過傳遞來執行遠程腳本的方式它的一些參數(arg1 ARG2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2 
+2

這打破了stty:\ use'bash <(curl ...)'如果你使用stdin – 2016-01-15 10:04:42

2

另外:

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

最後一個strip的含義是什麼意思? – towry 2015-02-23 07:59:04

+0

從bash手冊頁:A - 表示選項結束並禁用進一步的選項處理。 - 之後的任何參數都被視爲文件名和參數。一個論點 - 相當於 - 。 – 2015-06-30 08:59:39

21

對於bash:

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

Bourne shell中還支持 「-s」 從標準輸入讀取。

3

只是結合AMRA和user77115的答案:

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

它執行bbstart。sh遙遠的腳本通過它-v -v選項。

6

curl -s -L URL_TO_SCRIPT_HERE |慶典

例如::

curl -s -L http://bitly/10hA8iC | bash 
4
我經常使用下面的

足夠

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

以最好的方式做到這一點是

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

這是答案的由@ user77115

略有變化