如何在受限的 Bash shell 中丢弃 stderr?

l0b*_*0b0 7 bash io-redirection restricted-shell

在我的 .bashrc 中有几个命令将标准错误重定向到 /dev/null,这在以下内容中是不允许的rbash

bash: /dev/null: restricted: cannot redirect output
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题(除了修改 Bash)?也就是说,要么

  • 以其他方式丢弃标准错误或
  • 仅在允许的情况下尝试重定向。

Sté*_*las 8

您可以关闭 stderr,如下所示:

ls /blah 2>&-
Run Code Online (Sandbox Code Playgroud)

虽然这在大多数情况下都有效,但它可能会导致问题,因为编写2得不好的应用程序可能最终会打开一个新文件,该文件会自动作为文件描述符获取,并最终可能会在您不希望出现的地方写入错误消息。

这也意味着应用程序对 stderr 所做的任何写入都将返回错误 (EBADF),这可能会影响它们的行为。

由于允许使用管道,您可以提供一个丢弃所有输入的命令。在这里,使用grep -v '^'(但您可以使用tail -n 0sed d或脚本调用discardcat > /dev/null):

{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1
Run Code Online (Sandbox Code Playgroud)

或者,您可以让受限制的 shell 以重定向到/dev/null( rbash 3> /dev/null)的 fd 3(例如)启动它,这样您就可以在受限制的 shell 中执行以下操作:

ls /blah 2>&3
Run Code Online (Sandbox Code Playgroud)

这是允许的:

$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式检查是否/dev/null允许/不重定向到:

if true 2>&- > /dev/null; then
  echo allowed
fi
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令检查 shell 是否受到限制:

case $- in
  (*r*) echo restricted
esac
Run Code Online (Sandbox Code Playgroud)