次のコマンドを使用して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
sudo
stdin、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
シェルの組み込み機能が利用可能な場合は、実行可能ファイルを再度呼び出す必要はありません。