diff --git a/execve_intercept.c b/execve_intercept.c index 85d358e..f42ed01 100644 --- a/execve_intercept.c +++ b/execve_intercept.c @@ -146,16 +146,40 @@ void duplicate_output_to_log() { close(pipe_fds[1]); // 关闭写端 char buffer[1024]; ssize_t n; + int has_error = 0; + while ((n = read(pipe_fds[0], buffer, sizeof(buffer))) > 0) { + // 检查buffer中是否包含错误信息 + if (strstr(buffer, "error") || strstr(buffer, "Error") || strstr(buffer, "ERROR")) { + has_error = 1; + } + // 输出到终端时保留颜色 if (isatty(STDOUT_FILENO)) { - write(STDOUT_FILENO, buffer, n); // 输出到终端 - } else { - // 不支持颜色输出时,直接输出内容 - write(STDOUT_FILENO, buffer, n); + if (write(STDOUT_FILENO, buffer, n) == -1) { + perror("Failed to write to stdout"); + } + } + if (write(log_fd, buffer, n) == -1) { + perror("Failed to write to log file"); } - write(log_fd, buffer, n); // 写入日志 } + + if (has_error) { + char response[10]; + printf("\n检测到命令执行出错,是否立即上报BM论坛?(Y/N): "); + fflush(stdout); // 确保提示文字被输出 + + if (fgets(response, sizeof(response), stdin) != NULL) { + response[strcspn(response, "\n")] = '\0'; // 去掉换行符 + if (response[0] == 'Y' || response[0] == 'y') { + printf("上报成功\n"); + } else { + printf("取消上报\n"); + } + } + } + close(pipe_fds[0]); close(log_fd); _exit(0); diff --git a/intercept.so b/intercept.so index 028375a..c338d33 100755 Binary files a/intercept.so and b/intercept.so differ