12

sudo コマンドの bash プロセス置換を使用したいと考えています。

たとえば、これは私のために働く非sudoコマンドです:

$ cat <(echo "installed.txt")
installed.txt

そして、これは機能しないコマンドの sudo バージョンです。

$ sudo cat <(echo "installed.txt")
cat: /dev/fd/63: Bad file descriptor

sudo のマニュアル ページを読むと、root としてコマンドを実行する前に、sudo が stdin/stdout/stderr ファイル記述子以外のすべてを閉じているようです。これにより、sudo コマンドを実行する前に、bash が記述子を作成している (およびプロセスの置換を実行している) と思われます。

root のシェルを (デフォルトの sh ではなく) bash に変更しました。rootとしてログインしたときにコマンドが正常に機能することをテストしました。sudo コマンドを介してのみ機能しません。

ここでやろうとしていることを達成するための適切な手法は何ですか? Eval、引用、sudo フラグ、sudoers ファイル mod、その他?

4

5 に答える 5

13

質問に記載されている動作は、 の設計によるものですsudo

$ sudo cat <(echo "installed.txt")
cat: /dev/fd/63: Bad file descriptor

エラーが発生するのsudoは、標準入力、出力、およびエラー以外のファイル記述子を閉じるデフォルトの動作があるためです。マニュアルページで説明されているように:

デフォルトでは、sudo は、コマンドの実行時に、標準入力、標準出力、および標準エラー以外のすべての開いているファイル記述子を閉じます。

この動作は、-C(または--close-from) オプションでオーバーライドして、ファイルを閉じてはならないファイル記述子番号を指定できます。ただし、このオプションの使用は管理者によって許可されている必要があります。/etc/sudoers

 Defaults closefrom_override

-Cこれを使用すると、次のコマンドを使用するとコマンドが機能します。

$ sudo -C64 cat <(echo "installed.txt")
installed.txt

(ここでは、エラー メッセージの64よりも大きい数値が指定されています)。63

于 2016-09-17T17:11:33.463 に答える
10

シェルでこれを試してください:

$ sudo bash -c 'cat <(echo "installed.txt for UID=$UID")'
installed.txt for UID=0
于 2012-12-02T18:52:00.380 に答える
3
sudo bash  -c 'cat <(echo "installed.txt")'
于 2012-12-02T18:54:57.450 に答える
0

最善のアプローチは、おそらくすべてをスクリプトに入れ、そのスクリプトを で実行することsudoです。

于 2012-12-02T18:45:53.317 に答える