スクリプトを含む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からシェルスクリプトを実行することに関するセキュリティの問題は承知していますが、今のところはすべて無視しましょう。
source <(curl -s http://mywebsite.com/myscript.txt)
それをするべきです。または、標準入力をリダイレクトする最初のリダイレクトをオフにします。 bash
は、リダイレクトなしで正常に実行するためにファイル名を取り、<(command)
構文はパスを提供します。
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
フラグ「-s」を使用すると、シェルは標準入力から読み取られます。
対象:
バッシュ
ボーンシェル
魚
通常はデフォルトのシステムインストールの一部であるwget
を使用します。
bash <(wget -qO- http://mywebsite.com/myscript.txt)
ちょうど試してください:
bash <(curl -s http://mywebsite.com/myscript.txt)
これも行うことができます:
wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
つかいます:
curl -s -L URL_TO_SCRIPT_HERE | bash
例えば:
curl -s -L http://bitly/10hA8iC | bash
それを行う最良の方法は
curl http://domain/path/to/script.sh | bash -s arg1 arg2
@ user77115による回答のわずかな変更です
私は頻繁に次を使用して十分です
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
$
また:
curl -sL https://.... | Sudo bash -
Amraとuser77115の回答を組み合わせるだけです:
wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v
-v -vオプションを渡してbbstart.sh遠隔スクリプトを実行します。
私は次のコマンドを使用するいくつかの無人スクリプトです:
sh -c "$(curl -fsSL <URL>)"
URLから直接スクリプトを実行しないようにすることをお勧めします。 URLが安全であることを確認し、実行する前にスクリプトの内容を確認する必要があります。SHA256チェックサムを使用して、実行する前にファイルを検証できます。
この方法は優れた従来の方法です。
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: $#
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:~$