curlからshにパイプする前にシェルスクリプトを読んで確認します(curl -s [url] | sh)


11

Webからシェルスクリプトを実行する必要があるときはいつでもcurl -s [url] | sh、まずurlWebブラウザーで開いて、スクリプトが悪意のないものであり、安全に実行できることを確認します。

コマンドラインからスクリプトを読み取り、スクリプトを読み取った後に実行を確認することを可能にするコマンドライントリックを見たのを覚えています。私が正しく思い出せば、それは何かのように見えcurl -s [url] | something...here | sh、ソフトウェアのインストールを必要としませんでした。

誰もがこのトリックを知っていますか?

回答:


5

moreutils呼び出されるユーティリティがありvipe、エディタでstdinを表示します。stdoutに渡される前に、ファイルを表示して変更できます。

をインストールしたくない場合はmoreutils、次のような同様のことを実行できます。

file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file

mktempcoreutilsインストールされており、システムにすでにインストールされている可能性があります。


2

あなたが説明することを行う単一のユーティリティを考えることはできませんが、それをシェルスニペットにするのは十分簡単です。

script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac

これは、スクリプトがテキストファイルであることを前提としています。ヌルバイトはサポートされていません。シェルによっては、削除される場合や、行またはファイル全体が切り捨てられる場合があります。また、ファイルの最後にあるすべての改行が削除されます(ヒアドキュメントコンストラクトが1つ追加されます)。これは通常、スクリプトの問題ではありませんが、たとえば、スクリプトがバイナリ形式のアーカイブで終了し、それが抽出する場合に発生する可能性があります。ある時点でそのようなバイナリスクリプトが誤ってエンコードされるという重大なリスクがあるため、これはファイルを配布する非常に信頼できる方法ではありません。それでも、スクリプトを一時ファイルに書き込むことで処理できます。

script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"

$()最初の行で引用する必要があります。また、これにより入力内のNUL文字が削除され、おそらく致命的となる可能性があります(たとえば、自己解凍スクリプトの場合)。
l0b0 2013年

1
@ l0b0 間違いなく良いスタイルですが、割り当てで引用符を付ける必要はありません。最終的な改行と同様に、nullバイトは実際に失われます。シェルスクリプトにアーカイブを含める場合は、base64などのテキストエンコーディングを使用することをお勧めします。
Gilles 'SO-悪をやめる'

通常どおり、すべての有効なポイント。+1
l0b0 2013年

@ l0b0考え直しますが、多少リスクを伴いますが、これは有効なユースケースです。回答を更新しました。また、スクリプトが標準入力を使用できなかった元の回答の欠陥も修正しました(スクリプトが標準入力で渡されたため、正当な理由がありません)。
Gilles 'SO-悪をやめる'

1

特別な目的のツールを必要とするほど頻繁にこのようにダウンロードして実行するスクリプトのソースを見つける場所は言うまでもなく、なぜこれを実行したいのか想像するのは困難です。

curl(またはwgetsnarfまたは何でも)を使用してスクリプトをダウンロードし、それを調べて編集し(特定のシステムをカスタマイズする必要のないまれなスクリプトです)、それを実行chmodsh scriptnameます。


専用ツールは欲しくない。標準のツールでこれを行う簡単な方法があったことを覚えています。
Olivier Lalonde 2012

2
小さなシェルスクリプト(おそらく5行程度)を記述してスクリプトをダウンロードし、それを表示するためにless何かを表示してから、実行するかどうかを尋ねるのは難しくありません。それがスクリプトをダウンロードして表示し、それが問題ないように見える場合は実行することよりも優れているとは思えません。IMOそれはもっと悪いでしょう、それは何の利点も提供しませんが、シェルで作業するだけで得られる柔軟性を取り除きます。
cas

0

次のコマンドラインを使用します。

curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh

あなたはそのために小さな関数を使うことができます:

curlsh()
{
    curl "$1" \
    | ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
    | sh
}

そしてそれをこのように使うより:

curlsh http://site.in.net/path/to/script

0

読み取りが-p(プロンプト)を知っていて、スクリプトがシバンによって指定されたインタープリターで実行される必要がないと想定します。

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.