web-dev-qa-db-ja.com

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

同じ結果が得られます。

もともと私は次のような解決策がありました:

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

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

それをするべきです。または、標準入力をリダイレクトする最初のリダイレクトをオフにします。 bashは、リダイレクトなしで正常に実行するためにファイル名を取り、<(command)構文はパスを提供します。

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

echo <(cat /dev/null)の出力を見れば、より明確になるかもしれません

184
geekosaur

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

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

Bashの場合:

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

フラグ「-s」を使用すると、シェルは標準入力から読み取られます。

対象:
バッシュ
ボーンシェル

32
user77115

通常はデフォルトのシステムインストールの一部であるwgetを使用します。

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

ちょうど試してください:

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

これも行うことができます:

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

つかいます:

curl -s -L URL_TO_SCRIPT_HERE | bash

例えば:

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

それを行う最良の方法は

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

@ user77115による回答のわずかな変更です

9

私は頻繁に次を使用して十分です

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
$
5
Chinglin Wen

また:

curl -sL https://.... | Sudo bash -
4
Thomas Decaux

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

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

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

3
ling

私は次のコマンドを使用するいくつかの無人スクリプトです:

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

URLから直接スクリプトを実行しないようにすることをお勧めします。 URLが安全であることを確認し、実行する前にスクリプトの内容を確認する必要があります。SHA256チェックサムを使用して、実行する前にファイルを検証できます。

1

この方法は優れた従来の方法です。

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: $#
0
javafoot
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:~$ 
0