web-dev-qa-db-ja.com

ルートとしてのcurlから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を実行しています

6
pr.nizar

そのようなプロセス置換を使用しないでください。実際には、とにかくこれだけです:

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

または:

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

実行しようとしているスクリプトがbashismsを使用しない限り、上記は機能します。 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実行可能ファイルを再度呼び出す必要はありません。

3
mikeserv

Sudoは、stdin、stdout、およびstderr以外のすべての開いているファイル記述子を閉じます(man Sudoを参照)。したがって、プロセス置換は機能しませんOOTB with Sudo

比較する

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

そして

$ bash <(echo echo foo)
foo

これを回避することはできますが(または-Cフラグを使用してSudo)、実行しようとしていることを実行することは、一般的ではありますが、とにかく悪いことです。本当にインストーラーを実行したいだけの場合は、root- Shell firstを取得してから、残りをSudoなしで実行します。

6