控制终端和GDB

时间:2015-06-06 20:22:05

标签: c linux terminal gdb pty

我在后台运行Linux进程。我想通过SSH接管它的stdin / out / err,也是终端控制器。 “原始”文件描述符也是伪终端。 我试过了Reptyr和dupx。 Reptyr在vfork周围失败,但dupx工作得非常好。它生成的GDB脚本:

attach 123
set $fd=open("/dev/pts/14", 0)
set $xd=dup(0)
call dup2($fd, 0)
call close($fd)
call close($xd)
set $fd=open("/dev/pts/14", 1089)
set $xd=dup(1)
call dup2($fd, 1)
call close($fd)
call write($xd, "Remaining standard output of 123 is redirected to /dev/pts/14\n", 62)
call close($xd)
set $fd=open("/dev/pts/14", 1089)
set $xd=dup(2)
call dup2($fd, 2)
call close($fd)
call write($xd, "Remaining standard error of 123 is redircted to /dev/pts/14\n", 60)
call close($xd)

一旦dupx命令完成,就不会返回shell,目标应用程序会立即收到我的输入(通过pts / 14)。

现在我希望使用我的独立二进制应用程序获得相同的结果。我已经移植了相同的系统调用(dup / dup2 / close等)gdb通过dupx驱动的脚本执行的操作:

int fd; int xd;
char* s = "Remaining standard output is redirected to new terminal\n";

fd = open(argv[1], O_RDONLY);
xd = dup( STDIN_FILENO);
dup2(fd,  STDIN_FILENO );
close(fd);
close(xd);

fd = open(argv[1], O_WRONLY|O_CREAT|O_APPEND);
xd = dup( STDOUT_FILENO);
dup2(fd,  STDOUT_FILENO);
close(fd);
write(xd, s, strlen(s));
close(xd);

fd = open(argv[1], O_WRONLY|O_CREAT|O_APPEND);
xd = dup( STDERR_FILENO);
dup2(fd,  STDERR_FILENO);
close(fd);
write(xd, s, strlen(s));
close(xd); 

运行上面的snipplet是通过sigstop / ptrace attach / dlopen / etc(使用类似于hotpatch的工具)将共享库注入远程进程来完成的。让我们认为问题的这一部分是安全且可靠的:在完成所有这些之后,目标进程的文件描述符会根据需要进行更改。我可以通过检查/ proc / pidof target / fd。

来验证它

然而,shell返回并且它仍然接收我的所有输入,而不是目标应用程序。

我注意到,如果我在这一点之后简单地用gdb附加/分离(= fds被注入的C代码更改)而没有实际更改任何内容,则完成了所需的行为(意思是:shell没有返回,但目标应用程序开始接收我的意见)。命令是:

gdb --pid=`pidof target` --batch --ex=quit

现在我的问题是:怎么样?在后台会发生什么?没有gdb我怎么能这样做?我试着用gdb来获取一些提示,并尝试使用tty ioctl API而没有任何运气。

请注意,通过fork / setsid方式获取终端控制器状态(如果这是此问题的关键),Reptyr使用的方式对我来说是不可接受的:我想避免分叉。 另外,我无法控制启动目标,因此“为什么不在屏幕上运行它”在这里没有答案。

1 个答案:

答案 0 :(得分:0)

  

我有ssh访问权限,那就是pts / 14来自哪里。壳牌和   目标应用可能会竞争,但我从未经历过这样的竞争   行为;在这种情况下,dupx alwaysed做了我想要的。

好吧,坐下来想知道为什么过去出现的已知问题没有解决,即使这一点得到澄清。要走的路是让它按设计而不是偶然工作。为此目的,您的独立二进制应用程序必须不返回shell(以避免并发读取输入),而输入应该转到目标应用程序
见e。 G。还Redirect input from one terminal to anotherWhy does tapping a TTY device only capture every other character?