![如何在受限 Bash shell 中丢弃 stderr?](https://linux22.com/image/28136/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%8F%97%E9%99%90%20Bash%20shell%20%E4%B8%AD%E4%B8%A2%E5%BC%83%20stderr%EF%BC%9F.png)
在我的 .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
orsed d
或一个名为的脚本discard
)cat > /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
请注意:我还没有尝试过这个