Linux 通过/dev/pts在另一个终端中执行命令

Linux 通过/dev/pts在另一个终端中执行命令,linux,stdin,pts,Linux,Stdin,Pts,我有一个终端,它使用的是标准数据3(/proc/xxxx/fd/0->/dev/pts/3) 因此,如果(在另一个终端)我这样做: 该命令显示在我的第一个(pts/3)终端中,但未执行该命令。如果(在这个终端pts/3)我在一个程序中等待来自stdin的一些数据,数据会写入屏幕,但程序不会从stdin捕获数据 我要做的是执行命令“do\u something\u command”,而不仅仅是显示它 有人能给我解释一下这种行为吗?如何实现我的意图?您似乎在命令周围使用了错误的引号。 删除引号和ec

我有一个终端,它使用的是标准数据3(
/proc/xxxx/fd/0->/dev/pts/3

因此,如果(在另一个终端)我这样做:

该命令显示在我的第一个(
pts/3
)终端中,但未执行该命令。如果(在这个终端
pts/3
)我在一个程序中等待来自
stdin
的一些数据,数据会写入屏幕,但程序不会从
stdin
捕获数据

我要做的是执行命令
“do\u something\u command”
,而不仅仅是显示它


有人能给我解释一下这种行为吗?如何实现我的意图?

您似乎在命令周围使用了错误的引号。 删除引号和echo命令,或者使用echo和back ticks(`)

尝试:

或者只是

date > /dev/pts/3

请注意,在/dev/pts/3上运行的任何程序都无法读取“从后面”弹出的内容。

我完全理解您的要求。您可以通过自己用C编写和执行一小段代码来实现这一点。这应该会给你一些想法

#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效打印帮助(字符*程序名){
printf(“用法:%s[-n]DEVNAME命令\n”,程序名);
printf(“用法:'-n'是一个可选参数,如果您想在文本末尾加一个新行\n”);
printf(“用法:如果可执行文件不是setuid root,则需要运行'sudo'”);
出口(1);
}
int main(int argc,char*argv[]){
char*cmd,*nl=“\n”;
inti,fd;
int devno、commandno、newline;
国际货币基金组织;
devno=1;commandno=2;换行符=0;
如果(argc<3){
打印帮助(argv[0]);
}
如果(argc>3&&argv[1][0]='-'&&argv[1][1]=='n'){
devno=2;commandno=3;换行符=1;
}如果(argc>3&&argv[1][0]='-'&&argv[1][1]!='n'){
printf(“无效选项”);
打印帮助(argv[0]);
}
fd=打开(argv[devno],O_RDWR);
如果(fd==-1){
perror(“开放式设备”);
出口(1);
}
mem_len=0;
对于(i=commandno;icommandno){
cmd=(char*)realloc((void*)cmd,mem_len);
}else{//i==commandno
cmd=(char*)malloc(mem_len);
}
strcat(cmd,argv[i]);
strcat(cmd,“”);
}
如果(换行符==0)
美国LEEP(225000);
for(i=0;cmd[i];i++)
ioctl(fd、TIOCSTI、cmd+i);
如果(换行符==1)
ioctl(fd、TIOCSTI、nl);
关闭(fd);
自由((void*)cmd);
出口(0);
}
使用
sudo
权限编译并执行它。例如,如果要在
/dev/pts/3
上执行命令,只需执行
sudo./a.out-n/dev/pts/3 whoami
,在
/dev/pts/3
上运行
whoami


此代码完全取自。

在接收数据后是否需要在
/dev/pts/3
中按enter键?我尝试了。。。如果我在向/dev/pts/3发送数据后在终端(pts 3)上输入,则只接收输入。不是“做某事”命令。就像它不存在一样。。。仅显示。真正的目的是从另一个终端控制mpg123-R。但我很好奇pts的功能,以及它能做什么,不能做什么。为什么,嗯。。。这不是一个解决方案,但是mpg123命令有一个fifo参数,它创建一个命名管道来解决我的问题。OK。然后,您可以使用一个使用TIOCSTI ioctl模拟终端输入的程序来实现您想要的。stackoverflow.com上有几种语言的示例。我不知道你喜欢哪种语言,所以试着在搜索框中找到TIOCSTI,看看其中一种是否合适。谢谢,但我要找的不是。。。您的建议只会将命令的输出重定向到/dev/pts/3,我正在尝试执行/dev/pts/3中的命令。那么我应该如何打开另一个终端的交互式外壳呢?如果您想更好地理解这一点,我建议
man ioctl_tty
,并注意
TIOCSTI
选项。
echo `date` > /dev/pts/3
date > /dev/pts/3