制限されたBashシェルからstderrを削除する方法は?

制限されたBashシェルからstderrを削除する方法は?

私の.bashrcにはいくつかのコマンドがあります。標準エラーを/dev/nullにリダイレクトするで、次の範囲では許可されませんrbash

bash: /dev/null: restricted: cannot redirect output

Bashを修正する以外に、この問題を解決する方法はありますか?つまり、

  • それ以外の場合は標準エラーを破棄するか、
  • 許可されている場合にのみリダイレクトを試してください。

ベストアンサー1

次のようにstderrをオフにできます。

ls /blah 2>&-

これはほとんどの場合機能しますが、誤って作成されたアプリケーションが自動的にファイル記述子として機能する新しいファイルを開くことができ、2予期しないエラーメッセージが表示される可能性があるため、問題が発生する可能性があります。

これはまた、アプリケーションがstderrに書き込むすべての操作がエラー(EBADF)を返し、その動作に影響を与える可能性があることを意味します。

パイプは許可されているため、すべての入力を削除するコマンドを提供できます。ここでは、次を使用します(ただし、またはというスクリプトをgrep -v '^'使用することもできます)。tail -n 0sed ddiscardcat > /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

おすすめ記事