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

如何在受限 Bash shell 中丢弃 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 0orsed d或一个名为的脚本discardcat > /dev/null

{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1

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

ls /blah 2>&3

哪些是允许的:

$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$

您可以使用以下命令检查重定向是否/dev/null允许/有效:

if true 2>&- > /dev/null; then
  echo allowed
fi

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

case $- in
  (*r*) echo restricted
esac

答案2

man rbash它看来,任何重定向都是被禁止的:(以下是不允许或不执行的)redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

看起来您确实可以生成另一个 shell 脚本来执行重定向,因为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在 bar 包含的地方运行
#/bin/bash
foo 2>/dev/null

它必须在完整的 bash 环境中提前设置,因为 rbash 也不允许,specifying command names containing /这看起来会禁止您的当前目录./bar,但不会禁止隐式目录/bin/bar

请注意:我还没有尝试过这个

相关内容