web-dev-qa-db-ja.com

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

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

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

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

11
Olivier Lalonde

moreutilsにはvipeと呼ばれるユーティリティがあり、エディタにstdinを表示します。このユーティリティでは、ファイルがstdoutに渡される前にファイルをレビューおよび変更できます。

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

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

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

5
Shawn J. Goff

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

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

これは、スクリプトがテキストファイルであることを前提としています。ヌルバイトはサポートされていません。シェルによっては、ヌルバイトが削除されたり、行またはファイル全体が切り捨てられたりする場合があります。また、ファイルの最後にあるすべての改行が削除されます(heredocコンストラクトが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"

特別な目的のツールが必要になるほど頻繁にダウンロードして実行するスクリプトのソース(または複数のソース)がどこにあるかは言うまでもなく、なぜこれを実行したいのか想像するのは難しいです。

curl(またはwgetまたはsnarfなど)を使用してスクリプトをダウンロードし、調べて編集してみませんか(特定のシステムに合わせてカスタマイズする必要のないまれなスクリプトです)。 )そしてそれを実行します-chmodまたはsh scriptnameで実行可能にしますか?

1
cas

readが-p(Prompt)を知っていて、Shebangによって指定されたインタープリターでスクリプトを実行する必要がないと仮定します。

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
0
user unknown

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

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