URLからbashスクリプトを実行する


184

スクリプトが含まれている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からのシェルスクリプトの実行に関するセキュリティの問題は承知していますが、今はすべて無視します。


3
最終的に一時ファイルを作成する場合はmktemp、独自のソリューションをロールするのではなく、おそらく使用する必要があります
Hasturkun

cmd <<foo ほとんどのシェルのヒアドキュメント構文であり、おそらくあなたが望んでいるものではありません。
dietbuddha 2011

回答:


218
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は利用できるがcurlが利用できない場合(たとえば、標準の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ます。もちろん、これには$ 1と$ 2の代わりにMYFLAG1とMYFLAG2を使用する必要があります
Bruno Bronosky

3
$ sudo bash <(curl -s xxx)got error:bash:/ dev / fd / 63:Bad file descriptor
Jake

2
最初のソリューション(ソースを使用するソリューション)はまったく機能しませんでした。2つ目は多少機能しましたが、制限があります。サブシェルのURLからスクリプトを実行しています。親で使用したいスクリプトで定義された関数がいくつかあります。とにかくそれを達成する方法はありますか?それとも私は運が悪いのですか?唯一の解決策は、そのスクリプトを一時ファイルにコピーしてから、それをソースにすることです?
Harsh Pandey 2017

86

これは、いくつかの引数(arg1 arg2)を渡してリモートスクリプトを実行する方法です。

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

2
これはsttyを壊しbash <(curl ... ) ます:\ stdinを使用する場合に使用します
Flores Robles

47

バッシュ、ボーンシェル、フィッシュの場合:

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

フラグ「-s」は、シェルをstdinから読み取ります。


1
これはほとんどのシェルで機能するはずですが、たとえば、受け入れられた回答はfishでは機能しません。
hoijui

16

使用してwget、通常はデフォルトのシステムのインストールの一部です、:

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

RTFMgnu.org/software/wget/manual/wget.html。||| -q == --quiet == "Wgetの出力をオフにします。" ||| -O- == --output-document =-==「-」をファイルとして使用すると、ドキュメントは標準出力に出力されます。
amra 2017年

13

使用する:

curl -s -L URL_TO_SCRIPT_HERE | bash

例えば:

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




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
最後のストリップが意味する線量は?
2015

bashのmanページから:A-オプションの終わりを示し、それ以降のオプション処理を無効にします。-の後の引数は、ファイル名と引数として扱われます。-の引数は-と同等です。
明江市2015

3

amraとuser77115の答えを組み合わせるだけです:

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

-v -vオプションを渡してbbstart.sh遠隔スクリプトを実行します。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.