我怎样才能欺骗子进程的 isatty 检查?
How can I trick the isatty check of the child process?
父进程的代码如下:
#include <stdio.h>
int main() {
char buffer[BUFSIZ];
FILE *child = popen("./child", "r");
size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
fprintf(stdout, "child message: %s", buffer);
return 0;
}
这是子进程的代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
fprintf(stdout, "%s\n", isatty(fileno(stdout)) ? "true": "false");
return EXIT_SUCCESS;
}
$ gcc child.c -o child && gcc main.c -o main
$ ./main
child message: false
我想我不应该通过 popen 启动子进程,它不能骗过子进程的 isatty 检查。
我应该如何创建一个子进程以便我可以欺骗 isatty 检查?
您可以为您的进程分配一个 pty。这可以使用 script
实用程序方便地完成,默认情况下在许多平台上可用。此用法适用于 util-linux
版本:
#include <stdio.h>
int main() {
char buffer[BUFSIZ];
FILE *child = popen("script -qc ./child /dev/null", "r");
size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
fprintf(stdout, "child message: %s", buffer);
return 0;
}
macOS 将改为使用 script -q /dev/null ./child
父进程的代码如下:
#include <stdio.h>
int main() {
char buffer[BUFSIZ];
FILE *child = popen("./child", "r");
size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
fprintf(stdout, "child message: %s", buffer);
return 0;
}
这是子进程的代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
fprintf(stdout, "%s\n", isatty(fileno(stdout)) ? "true": "false");
return EXIT_SUCCESS;
}
$ gcc child.c -o child && gcc main.c -o main
$ ./main
child message: false
我想我不应该通过 popen 启动子进程,它不能骗过子进程的 isatty 检查。
我应该如何创建一个子进程以便我可以欺骗 isatty 检查?
您可以为您的进程分配一个 pty。这可以使用 script
实用程序方便地完成,默认情况下在许多平台上可用。此用法适用于 util-linux
版本:
#include <stdio.h>
int main() {
char buffer[BUFSIZ];
FILE *child = popen("script -qc ./child /dev/null", "r");
size_t len = fread((void *) &buffer, BUFSIZ, 1, child);
fprintf(stdout, "child message: %s", buffer);
return 0;
}
macOS 将改为使用 script -q /dev/null ./child