カールからルートへのbashへのプロセスの置き換え

カールからルートへのbashへのプロセスの置き換え

次のコマンドを使用してURLからrootとしてスクリプトを実行しようとしています。

sudo bash <(curl -s http://copy.com/gLVZIqUubzcS/popcorn)

ただし、次のエラーが発生します。

bash: /dev/fd/63: Aucun fichier ou dossier de ce type

「見つかりません」を意味するフランス語です。どんなアイデアがありますか?

PS:私はUbuntu 12.04を実行しています。

答え1

sudostdin、stdout、stderr(参考資料を参照man sudo)を除くすべての開いているファイル記述子を閉じるため、プロセス置換はOOTBには影響しませんsudo

比較する

$ sudo bash <(echo echo foo)
bash: /dev/fd/63: No such file or directory

そして

$ bash <(echo echo foo)
foo

この問題は解決できますが、(または-Cフラグを使用してsudo)必要な操作を実行するのは一般的ですが、練習するのはお勧めできません。本当にインストーラを実行したい場合は、root-shellを入手してください。最初それからsudo

答え2

このようなプロセス置換を使用しないでください。実際にはとにかくほぼ次のようになります。

sudo sh <<CURL_SCRIPT
    $(curl -s http://copy.com/gLVZIqUubzcS/popcorn)
CURL_SCRIPT

または:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo sh

実行したいスクリプトがbashisms上記の内容を使用しない場合は機能しません。 -only構文を使用する場合は、次のことをbash行う必要があります。

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo . /dev/stdin

上記の方法がうまくいかないようですが、これはsudoシェルの組み込み機能が嫌いだからです。.dot.

これを行う:

curl -s http://copy.com/gLVZIqUubzcS/popcorn | sudo ${0#-} /dev/stdin

単に次のこともできます。

sudo sh -c "$(curl -s http://copy.com/gLVZIqUubzcS/popcorn)"

bashシェルの組み込み機能が利用可能な場合は、実行可能ファイルを再度呼び出す必要はありません。

関連情報