我正在使用一些管道和 fork 来执行类似的命令

猫file.tar.gz | myprogram -c“tar -zvt” -i“remoteMachineIp”

但是如果我这样做

myprogram -c“bash” -i“remoteMachineIp”

bash还可以,但是没有tty。
没有tty,如果我调用vim命令,它将打开vi困惑的状态。

我如何用tty在execlp上调用bash。

程式码范例

if(cm->pid2==0){ //pipe and fork to send data to my execlp
close(cm->fout[0]);
dup2(cm->fout[1], 1);
execlp("bash", "bash", "-c", command.c_str(), NULL); // command is mycommand so is bash -c "bash"
}
else{
close(cm->fout[1]);
while((size=read(cm->fout[0], buffer, 2000)) > 0){
cm->message->send(buffer, size); //send the data to my program
}
//Close it and send the return code

问题是execlp将bash返回给我,但是没有tty
如果我将ssh user @ machine称为“bash”,bash会出现问题,但将ssh user @ machine突出显示就可以了

我如何用tty叫bash?

谢谢

最佳答案

我猜您担心的是,您启动的命令从其父级(stdin)继承了myprogram,而其父级的stdin是从cat file.tar.gz接受数据的管道。您想运行一个强制从tty而不是继承的stdin管道读取数据的子级。

您可以打开/dev/tty以获得对tty的引用。如果没有tty,它将失败。例如:

close(0);
open("/dev/tty", O_RDWR);
/* The file descriptor returned by open should be 0 */

但是,我注意到您将子命令的stdout重定向到程序的管道。如果您正在exec进行编码的命令是交互式的,则此命令将无效。交互式命令需要将其输入和输出都连接到tty。不管是否将stdin连接到tty,启动一个交互式命令并将其输出连接到管道都可能没有任何意义。

顺便说一句:为什么您在bash -c <command>中使用sh -c <command>而不是execlp?这样,您引入了对bash的不必要依赖,而您真正需要的只是标准POSIX bourne shell sh。通过exec进行sh -c编码是通过shell启动命令的标准方法。例如,这就是通过system()完成的。

关于c++ - 不带TTY的Execlp通话 bash ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10585878/

10-16 19:03