コンテキスト
以下を使用して実行できるスクリプトを公開するサイトを設定しました。
curl -so /tmp/script http://scripts.programster.org/scripts/1?output=raw && . /tmp/script
このスクリプト例では、「hello world」を端末に出力します。
ご覧のとおり、これはかなり長くて混乱しています。ユーザーが/tmp/script
。
curl -s http://scripts.programster.org/scripts/1?output=raw | bash
#!/usr/bin/php
しかし、このコマンドはPHPのような他の言語で書かれたスクリプト(スクリプトの上で使用されている)で動作したいので、最初のコマンドを変更しました。
質問
ローカルファイルシステムに保存せずにオンラインスクリプトを実行でき、どのプログラムで実行するかを事前に知ることができない方法はありますか?たぶん、ファイルなどのURLを処理する方法があります。これにより、次のことができます。
. http://scripts.programster.org/scripts/1?output=raw
答え1
セキュリティの問題については、(点)コマンドでwget
実行できる外部スクリプトの実行のリスクを認識してください。source
. <(wget -q -O- http://scripts.programster.org/scripts/1?output=raw)
これは、スクリプトテキストを現在のシェルにインポートすることを意味します。
wget -O-
STDOUTにダウンロードして-q
静かにします(メッセージなし)。
<(any command)
出力をファイルとして解釈できるプロセス置換。
wget -q -O-
PSカール - isと同じcurl -s -o-
修正する
上記の例は、外部スクリプトの she-bang を使用せずに呼び出しシェルのコンテキストで実行されます。シバンラインを活用するには、〜しなければならないファイルを保存し、実行可能にしてから実行します。
これを使用して一意の名前を保証することができ、一時mktemp
ファイルを削除する責任があります。これは、外部URLをパラメータとして使用するラッパーに結合できます。
以下は、これらのラッパーの実際のサンプルコードです。
#/bin/bash
exturl=${1?"No external url specified"}
tmpexe=$(mktemp)
trap 'rm $tmpexe' EXIT
curl -s $exturl -o $tmpexe
chmod 0755 $tmpexe
$tmpexe