【问题标题】:redirect stdout and stderr to different file under sandboxing in linux将stdout和stderr重定向到linux沙箱下的不同文件
【发布时间】:2015-05-23 09:37:46
【问题描述】:

我有一个Test.cpp,它在sandbox(RHEL7) 下运行:

Test.cpp 内容:

#include<stdio>
 int main(void) {
  int a = 1/0;
  return 0;
 }

使用 gcc(4.8) Test.cpp 编译它,生成 a.out 现在在控制台上运行 a.out 打印 floating pointing exception

现在我想如果我将 stderr 重定向到一个文件,我希望错误会打印在文件中。 但事实并非如此,它仍然继续在控制台中打印。 谷歌搜索显示,在这种异常下,程序会立即终止,如果您捕获 bash 的标准错误,那么它应该重定向。 所以我跑了

su -c ./a.out 2>err 

Bingo 错误打印在 err 文件中。

现在主要游戏开始 我想在沙箱下运行它 所以我跑:

su -c 'sandbox ./a.out 1>out 2>err'

但是 err 文件或控制台中没有打印任何内容。

这种情况下如何捕获stdout和stderr?

【问题讨论】:

  • 沙盒不允许您写入文件那么您如何使用cat 写入文件?
  • 我添加了更多有问题的细节
  • 试试这个命令:su -c 'sandbox ./a.out' 1&gt;out 2&gt;err
  • "su -c 'sandbox ./a.out' 1>out 2>err" 不打印......但是“su -c './a.out' 1>out 2>err" 确实将其打印在 err 文件中

标签: linux shell io sandbox rhel


【解决方案1】:

明确一点(你顺便提一下):你想要的错误是由bash 打印的。它不会被打印为程序的垂死喘息。所以重要的是 shell 本身被重定向到哪里。

当你这样做时:

su -c ./a.out 2>err 

重定向是您在其中执行的 shell 的一部分。2&gt;err 打开 errstderr for susu 创建一个继承 stderr 的 shell 并最终打印错误。

在这个版本中:

su -c 'sandbox ./a.out 1>out 2>err'

您引用了重定向'... 2&gt;err',因此sustderr 不受影响。 sandbox 命令被重定向。但是,sandbox 命令可能使用也可能不使用 shell 来运行命令,或者它可能使用 exec cmd...。无论哪种方式,都没有 shell 等待您的崩溃来打印消息。

你可以试试:

su -c 'sandbox bash -c ./a.out 1>out 2>err'

这应该确保有一个 bash 和所需的 stderr 来打印您的结果。

您也可以自己捕捉这个结果(并避免让 shell 打印任何东西),例如:

#!/bin/sh

./a.out &
wait $!
echo $?

在后台调用它会阻止通常的输出。然后等待它(使用显式 PID)将在$? 中返回错误代码。如果一个进程带有信号退出,错误代码将为128 + signum(从kill -l获取列表)

【讨论】:

    【解决方案2】:
    sandbox ./a.out > pr 2> err
    

    在您的示例中,您将标准输出重定向到管道,并将 cat 的标准错误重定向到错误。

    【讨论】:

    • 嗨,我已将问题编辑为更具描述性
    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多