From 3139e359a83bb8e7a25b67955c289f3261f4e264 Mon Sep 17 00:00:00 2001 From: "QCQCQC@Ubuntu" <1220204124@zust.edu.cn> Date: Wed, 26 Mar 2025 16:02:52 +0800 Subject: [PATCH] tee --- execve_intercept.c | 83 ++++++++++++++++++++++++++++++++++----------- intercept.so | Bin 21808 -> 21864 bytes 2 files changed, 63 insertions(+), 20 deletions(-) diff --git a/execve_intercept.c b/execve_intercept.c index 2a55b58..a9a4918 100644 --- a/execve_intercept.c +++ b/execve_intercept.c @@ -114,29 +114,72 @@ void write_log(const char *filename, char *const argv[]) { // 复制标准输出和错误输出到日志文件 void duplicate_output_to_log() { - int log_fd = open(LOG_OUT_FILE, O_WRONLY | O_CREAT | O_APPEND, 0644); - if (log_fd < 0) return; + int stdout_pipe[2], stderr_pipe[2]; - int stdout_copy = dup(STDOUT_FILENO); - int stderr_copy = dup(STDERR_FILENO); - - dup2(log_fd, STDOUT_FILENO); - dup2(log_fd, STDERR_FILENO); - close(log_fd); - - // 让 stdout 和 stderr 同时输出到日志文件和控制台 - FILE *log_file = fdopen(log_fd, "a"); - if (log_file) { - setvbuf(stdout, NULL, _IOLBF, 0); - setvbuf(stderr, NULL, _IOLBF, 0); - stdout = log_file; - stderr = log_file; + // 创建 stdout 和 stderr 的管道 + if (pipe(stdout_pipe) < 0 || pipe(stderr_pipe) < 0) { + perror("pipe"); + return; } - dup2(stdout_copy, STDOUT_FILENO); - dup2(stderr_copy, STDERR_FILENO); - close(stdout_copy); - close(stderr_copy); + pid_t pid = fork(); + if (pid < 0) { + perror("fork"); + return; + } + + if (pid == 0) { // 子进程 + close(stdout_pipe[1]); // 关闭 stdout 写端 + close(stderr_pipe[1]); // 关闭 stderr 写端 + + // 打开日志文件(追加模式) + int log_fd = open(LOG_OUT_FILE, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (log_fd < 0) { + perror("open log file"); + exit(1); + } + + // 让 tee 进程读取 stdout_pipe[0] 并写入日志和终端 + dup2(stdout_pipe[0], STDIN_FILENO); + dup2(log_fd, STDOUT_FILENO); + execlp("tee", "tee", "/dev/tty", NULL); + perror("execlp tee stdout"); + exit(1); + } + + pid_t pid_err = fork(); + if (pid_err < 0) { + perror("fork"); + return; + } + + if (pid_err == 0) { // 另一个子进程 + close(stderr_pipe[1]); // 关闭 stderr 写端 + + int log_fd = open(LOG_OUT_FILE, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (log_fd < 0) { + perror("open log file"); + exit(1); + } + + // 让 tee 进程读取 stderr_pipe[0] 并写入日志和终端 + dup2(stderr_pipe[0], STDIN_FILENO); + dup2(log_fd, STDOUT_FILENO); + execlp("tee", "tee", "/dev/tty", NULL); + perror("execlp tee stderr"); + exit(1); + } + + // 父进程 + close(stdout_pipe[0]); // 关闭 stdout 读端 + close(stderr_pipe[0]); // 关闭 stderr 读端 + + // 让标准输出、错误输出流向管道 + dup2(stdout_pipe[1], STDOUT_FILENO); + dup2(stderr_pipe[1], STDERR_FILENO); + + close(stdout_pipe[1]); // 关闭写端(子进程 tee 负责处理) + close(stderr_pipe[1]); } diff --git a/intercept.so b/intercept.so index 8913496d5207d7859a38c29ac15abd085451b85d..e05f950bf9fccd7a7386f782a5c9641721d8c140 100755 GIT binary patch delta 5656 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 delta 5194 zcmZ`-3v?4z8lIbUN>iGoX`3b~v}sFQ3WX*qj|!GP2_3LNTG}n>BCtFJA5bNA)dRFp z!XX>7Jbv)tDheL-up)cV`X~t4;wo_5U0HQG#lvb@QB$eA;iauSX8(KdOdGoE%|0#0aEo#4mTA)iSk*67>G|Ec;#An-i5zMIY>0JE6EqkzEE69 z)-l@_RyIS2=pX|1M_y$NPqY(uM_b`^w6p0ejG7=AgbS&d5?=Z!F6S%whbdeiOCJNT zd6hD0&A18EYaKnD3Q|nNr2^}$WJWmvZ~Q5tX}GU@;8mkV3zLFWI=<2pv3{uDmAST zC1}AFYX&Jcp-GF=hFU3$-ek~^$0yh(6LX`p&4c$_+n>eR7A=fXuvVsvLZPB3tyrNK zuuZw5H>Rx6(aBJSI=yI=L~3i|x)9aJK zKRcV_bZsbu%79J17e z&cJI3-Z3x}(KU$9jX+~zEuya@x;z4ngF}d3K=i2y)ByiPG)^C<-yDI)gI;feB1Csb zpb0Pq(Vn4k`U4T@D0mFf7m(W)fhNHoy~U>V6wCK?gw+CnMXNHCnYA;*ng_Sh;}}Dn zJ`{nbz*vLDHjJ@((HmjShxrBzY{51$%COM>NrfPy#}KtfpmsQpXb+;f5oiYdfc{5E z_`fH@Is#IS*#E{j7?acfX8cag)T?rK9qxQa`&2==W=#7T^~VP3O9$!m2kCXKZ3(%W zA}Kg!dXXSVL9v{QNxfdP6cFE;jCEhTS0{HF?aef;4-|=f8{j zcSluBa;>)I8|BLfyKx13fizZ$S~({KTI8*RT9 zN-a5tS8p<;ogy=C!B(pU0+vL>N)DfS(%B*G6Cb9ysQJtY?-`t`LN zH-1WcEZ{y%o4p5_)&~+^`k6gL7|}3A9XBz?#F$EiTik~UbJk_ev2Ef3yQDx}?-D65 zDLWTkdBspM*liogBk;0q(}bziS5TarOyhopH4m$u3O%m|X;~W7_HsVU4y_{;}%cGlr+kXm}u zkM76q{6rbDII+gL6hU2EDxs0WCUCpwdsbP!~i8xDwbSWz zkhTi?!kl-Z4P>vS6UB;4Dmx(K8B#gEY#5I>}p z-O`HoEPT7A#+~R(@{6xfJRrV^!iw%1(<0h$K*}j`a{pyqFo%F0>IoFtxImc{I zQPtle13lZ`cK^!u{d6POP-{=s^MItcm}QnzedoNC|$RfGl{ zn4uEe@x@)}0;_lJZIiCRq7j+H>p1fsoLT!=RCUU8~%q+$=HUGk8<+H(VSe74_mWRh9AI}R)w%r@wSb6VV&NI*;*i^J}|WZbe0 zcN^ST`DQQ|X_(mDIPOFls`7AaDBBv_>daX~b~x9W^Bs?_dT6y{=~GJ=Ke==P9xw7y zhYQXnP~!5}y#A#uufd#$UzFwjD94~YhSGgWmOn??@SQAQM>#zt%So7Rb+;^!N4f5M zS*}HS>#{6+Q7-S1<(()S!;n&tBj%#p25=XQa5Z$vGA`Nv3%7aU*LW{Se4%n$pvK{N zd+}ZY&lT8-7mi>#7S0#gGtC&9o!s1p_)VG$eY7@<#0`mIEof?)-H|{AqV;KdHmuv-(M%PM8D+!TcUfC*} z5cwjHZE>OD!O0*v;bNJ^rsl|<3PK@Ph+q>uU@Etm)Z>$CeHgBkS-?{sL&7kxd}Kx` zJ`rWlt>z3hsRN3ag|M&Og2^2zcVIT%rxLTFggU|FIEBN3u{W<2No0Yd|DVp&AFP(m)An9P5W+6^m+Nu$y zSq(np-(i_Nz?ds(31_E8CmMvS%IRsHGJBqms0yc6d^2hP0PN^Unsby~++vF+<>s>A%mP`@BB0~G@eo}#51yzR*7{q=Q)K_mRGIzLvO;M=m` zWc4(%8gw-d-M}ZZvYNu!P8Sc<>4FV46Lsphi!gN56hd2#6LROoLvKwyNOPPf^^3&W z65hxO{y8PMn9j^`=+v(k5|G+Lokv-O9w@6V!Nsz^wnW!l##=oFXOPib$+cHOS64`0 JgtEGk{{^;uQ)>VK