在远程活动终端中执行命令


10

假设您打开了一个终端仿真器(T1),其PID为6350。

在另一个终端上,键入以下命令(C1):

echo "ls\n" > /proc/6350/fd/0

这会ls在T1中写入新行,但不会执行它。为什么?

我也尝试使用cat|bashwith,echo "ls\n" > /proc/catid/fd/0但仍未执行。

如何将命令回显到另一个终端并执行命令?

可能的答案:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

在这种情况下,您不能再直接在终端中写入(所有显示的内容都与命令(C1)在该终端中显示内容的方式相同。



我读过,但这不是很有帮助。
rvlander 2012年

1
它可能不像“给您一种方法”那样“有用”,但是它回答了您的问题:您不能。您可以告诉我们您要达到的最终目标,看看是否还有其他方法。
凯文

好的,您不能,但是为什么在另一个终端中显示该文本?
rvlander 2012年

因为您将文本发送到终端接口而不是外壳程序。

Answers:


11

有一个名为的命令行实用程序ttyecho,可以将命令发送到另一个终端(tty / pts)并执行该命令。

sudo ttyecho -n /dev/pts/5 ls

请参阅:将命令或数据发送到其他终端的实用程序(tty / pts)

另请参见:ttyechogithub上的源代码

另一个有趣的tty命令是selector控制台中的实时交互式模式匹配器,用于更新tty输入缓冲区。

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

请参阅:选择器-在控制台中进行动态搜索


可悲的是,指向ttyechogithub 上的源代码的链接似乎已断开。但是,它现在似乎可以在github.com/osospeed/ttyecho上找到。
威尔逊F

7

当您发出对/dev/pts/X/proc/6350/fd/01并且2只是该链接的符号链接)的写操作时,发生的事情与进程6350(或其子进程之一,适当地分叉的)输出内容时发生的事情完全相同:它写入终端。

如果您尝试从该设备()进行读取cat < /dev/pts/X,则会发生时髦的事情。您应该会看到在原始shell中键入的内容。(很可能只有在您输入的第一行之后-我猜终端程序(xterm或您正在使用的任何东西)会进行一些行缓冲,并且6350被阻塞的readshell会获得该片段;然后,shell可能会或可能不,赢得随后的阅读,但是我对此可能完全错了。)

问题是:当您从该设备读取或写入该设备时,您并不是在与使用该设备的另一个外壳说话。您正在与终端仿真器交谈(xterm例如)。只有终端仿真器才能将数据注入该通道(shell读取的内容),而shell写入的所有内容都将发送到终端。附加第二个外壳不会改变这一点。

如果您想在该6530过程中注入命令,则必须通过终端(无论是X11应用程序还是其他)来完成。

推荐阅读:“终端”,“外壳”,“ tty”和“控制台”之间的确切区别是什么?


1
有趣的是,从pts(cat /dev/pts/x不需要<)上读取,我得到了在终端之间严格交替的字母。
凯文(Kevin)

不使用重定向可能不会有太大变化。无论哪种方式,我都会得到不可预测的输出。
Mat

有趣,感谢您的链接。所以/proc/6350/fd/0是simlink到标准输入父process 6350这是一个终端。我猜窗口应用程序是一样的吗?
rvlander 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.