Web curl -s [url] | sh
からシェルスクリプトを実行する必要がある場合は常に、最初にWebブラウザでurl
を開いて、スクリプトが悪意のないものであり、安全に実行できることを確認します。
コマンドラインからスクリプトを読み取って、スクリプトを読んだ後に実行を確認できるようにするコマンドラインのトリックを見たのを覚えています。正しく思い出せば、curl -s [url] | something...here | sh
のように見え、ソフトウェアをインストールする必要はありませんでした。
誰かがこのトリックを知っていますか?
moreutils
にはvipe
と呼ばれるユーティリティがあり、エディタにstdinを表示します。このユーティリティでは、ファイルがstdoutに渡される前にファイルをレビューおよび変更できます。
moreutils
をインストールしたくない場合は、次のようなことを実行できます。
file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file
mktemp
はcoreutils
にあり、システムにすでにインストールされている可能性があります。
あなたが説明したことを実行する単一のユーティリティを考えることはできませんが、それをシェルスニペットにするのは簡単です。
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
で実行可能にしますか?
readが-p(Prompt)を知っていて、Shebangによって指定されたインタープリターでスクリプトを実行する必要がないと仮定します。
curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
次のコマンドラインを使用します。
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