
私の.bashrcにはいくつかのコマンドがあります。標準エラーを/dev/nullにリダイレクトするで、次の範囲では許可されませんrbash
。
bash: /dev/null: restricted: cannot redirect output
Bashを修正する以外に、この問題を解決する方法はありますか?つまり、
- それ以外の場合は標準エラーを破棄するか、
- 許可されている場合にのみリダイレクトを試してください。
答え1
次のようにstderrをオフにできます。
ls /blah 2>&-
これはほとんどの場合機能しますが、誤って作成されたアプリケーションが自動的にファイル記述子として機能する新しいファイルを開くことができ、2
予期しないエラーメッセージが表示される可能性があるため、問題が発生する可能性があります。
これはまた、アプリケーションがstderrに書き込むすべての操作がエラー(EBADF)を返し、その動作に影響を与える可能性があることを意味します。
パイプは許可されているため、すべての入力を削除するコマンドを提供できます。ここでは、次を使用します(ただし、またはというスクリプトをgrep -v '^'
使用することもできます)。tail -n 0
sed d
discard
cat > /dev/null
{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1
または、制限されたシェルを起動して fd 3 (たとえば) を/dev/null
( rbash 3> /dev/null
) にリダイレクトして、制限されたシェルで次の操作を実行できます。
ls /blah 2>&3
許可されるもの:
$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$
/dev/null
以下を使用して、リダイレクトが許可されているか有効かを確認できます。
if true 2>&- > /dev/null; then
echo allowed
fi
次のコマンドを使用して、シェルが制限されていることを確認できます。
case $- in
(*r*) echo restricted
esac
答え2
man rbash
ご覧のとおり、リダイレクトは禁止されています。 (次は許可または実行されません。)redirecting output using the >, >|, <>, >&, &>, and >> redirection operators
リダイレクトを実行するために別のシェルスクリプトを生成できるようです。When a command that is found to be a shell script is executed, rbash turns off any restrictions in the shell spawned to execute the script.
したがって、これはできませんが、バーが含まれている場所で実行$ foo 2>/dev/null
できるように見えます。$ bar
#/bin/bash
foo 2>/dev/null
rbashはこれを許可しないため、完全なbash環境で事前設定する必要があります。これは現在のディレクトリを許可していませんが、暗黙的なディレクトリはspecifying command names containing /
許可していないようです。./bar
/bin/bar
注:まだ試したことがありません。