- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在读取另一个生成输出(缓慢且无限)的进程的输出。因为我想实时读取这些数据,所以我使用“stdbuf -oL”(行缓冲,数据是文本)。我无法控制生成过程,因此无法修改源以强制刷新。
到目前为止,stdbuf 工作正常,但是该进程使用 SOCK_RAW 并且需要以 root 身份运行,具有 setuid(0) 或 cap_net_raw
功能。当使用 setuid 或 capabilities 以非 root 身份运行时,stdbuf 似乎被忽略。让我演示一下这个问题:
这是一个简单的作家:
#include <stdio.h>
#include <unistd.h>
int main(){
int i;
for ( i = 0;; i++){
fprintf(stdout, "%d\n", i);
sleep(1);
}
}
还有一个简单的阅读器:
#include <stdio.h>
int main(){
char* line = NULL;
size_t n = 0;
while (getline(&line, &n, stdin) != -1 ) {
fputs(line, stdout);
}
}
正如预期的那样,通过执行 ./writer | ./reader
在缓冲区被填满之前不会显示任何内容。前置 stdbuf -oL
启用行缓冲,我将这些行输入阅读器:
% stdbuf -oL ./writer | ./reader
0
1
2
...
但是如果我添加 cap_net_raw+ep
它会停止工作:
% sudo setcap cap_net_raw+ep ./writer
% stdbuf -oL ./writer | ./reader
(no output)
使用 setuid 时观察到相同的行为:
% sudo chown root:root ./writer
% sudo chmod +s ./writer
% stdbuf -oL ./writer | ./reader
(no output)
我很想了解为什么会发生这种情况,以及如何在不以 root 身份运行的情况下继续使用 stdbuf。我承认我并不完全理解 setuid 在幕后做了什么。
最佳答案
从查看 stdbuf source code看起来它可以通过设置 LD_PRELOAD 来工作。将 LD_PRELOAD 与 setuid 可执行文件或 sudo 一起使用当然存在安全问题。
我发现的一个建议是 disable the noatsecure selinux attribute为您的可执行文件。
另一个更简单的选择是避免使用 stdbuf 并直接从您的源代码中调用 fflush(stdout)
。
关于c - 带有 setuid/capabilities 的 stdbuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13644024/
我想监控我将要启动的程序的实时输出。我试图通过将程序的输出重定向到管道然后从监视脚本读取管道来做到这一点。 ./program >> apipe 然后从监控脚本中 cat apipe 但是由于>>中的
所以 gnu 有 stdbuf 允许你修改命令的 I/O 流的缓冲。我需要相同的命令提示符功能,但我似乎找不到任何关于它的信息。 我只是试图将程序的 stdout 和 stderr 输出到日志文件,而
我们可以在常规命令上使用 stdbuf,例如 stdbuf -o 0 echo aaa 但是我不能在 bash 函数上使用它,例如 function tmpf() { echo aaa; } stdb
给定以下 Python 程序: import sys print("input") while True: pass 和 C 中的等价物: #include int main() {
我正在读取另一个生成输出(缓慢且无限)的进程的输出。因为我想实时读取这些数据,所以我使用“stdbuf -oL”(行缓冲,数据是文本)。我无法控制生成过程,因此无法修改源以强制刷新。 到目前为止,st
在 Windows 平台(尝试了多台 Windows 机器)上使用 mosestokenizer(https://github.com/luismsgomes/mosestokenizer,通过 py
我是一名优秀的程序员,十分优秀!