
私が行った場合:
at -f <(echo "rm $file") now + 2 hours
それはうまくいきます
ただし、次のようにすると:
sudo at -f <(echo "rm $file") now + 2 hours
次のような結果になります:
at: /dev/fd/63: No such file or directory
これはコマンドが処理される順序によるものだと思います。sudo コマンドを使用してこの問題を回避する方法はありますか? 考えられる唯一の方法は、コマンドをスクリプトに置き、そのスクリプトを sudo することですが、これはオプションです。しかし、なぜこのようなことが起こるのかを知りたいのです。
すでにどこかで回答されていたら申し訳ありませんが、何を探せばいいのかわからないので見つけることができません。
答え1
この場合、シェルは 内のコマンドへのパイプを開き<(...)
、実行する子プロセスにファイル ハンドルを渡すためです。パスは、通常のパス名を介して既に開いているファイル ハンドルにアクセスできるようにするためにカーネルによって提供される方法です。sudo
/dev/fd/63
ただし、sudo
セキュリティ上の理由から、実行中のプロセスにハンドルは渡されません。デフォルトでは、stdin、stdout、stderr を除くすべてのファイル ハンドルが閉じられるため、最終的に実行されるプログラムには対応するファイル ハンドルがなく/dev/fd/63
、エラーが発生します。
シェル内で sudo の置換を実行することで解決できます。
sudo bash -c 'cat <(echo something)'
もちろん、これは内部の置換も昇格された権限で実行されることを意味します。
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
-C
のフラグは別sudo
の方法を提供しますが、許可するには追加の構成が必要になる場合があります。
-C 数値、 --close-from=数値
コマンドを実行する前に、num 以上のすべてのファイル記述子を閉じます。3 未満の値は許可されません。デフォルトでは、sudo はコマンドを実行するときに、標準入力、標準出力、および標準エラー以外の開いているすべてのファイル記述子を閉じます。セキュリティ ポリシーによって、ユーザーがこのオプションを使用できるかどうかが制限される場合があります。sudoers ポリシーでは、管理者が closefrom_override オプションを有効にした場合にのみ、-C オプションの使用が許可されます。
答え2
cat
あなたの意図は、現在のすべてのファイルをルートとして操作することだと思いますls
。
代わりにパイプを使用するのが賢明かもしれませんxargs
。これを試してください:
ls | xargs sudo cat