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

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

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

从另一个终端输入以下命令 (C1):

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

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

我也尝试使用cat|bashwithecho "ls\n" > /proc/catid/fd/0但它仍然没有执行。

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

可能的答案:

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

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

答案1

有一个名为的命令行实用程序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)

看:选择器 - 控制台中的动态搜索

答案2

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

如果你尝试从该设备 ( cat < /dev/pts/X) 中,将会发生一些奇怪的事情。您应该会看到您在原始 shell 中键入的内容显示出来。 (很可能只有在您输入的第一行新行之后 - 我猜测终端程序(xterm或您正在使用的任何程序)会进行一些行缓冲,并且6350被阻止的 shellread会获取该部分;然后 shell 可能会,或者可能不,赢得后续阅读,但我很可能在这一点上完全错误。)

问题是:当您从该设备读取或写入该设备时,您并没有与使用该设备的其他 shell 进行通信。您正在与终端模拟器交谈(xterm例如)。只有终端模拟器才能将数据注入该通道(shell 读取的数据),并且 shell 写入的所有内容都会发送到终端。安装第二个外壳并不会改变这一点。

如果您想将命令注入该6530进程,则必须通过终端(无论是 X11 应用程序还是其他应用程序)来执行此操作。

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

相关内容