【问题标题】:linux - write commands from one terminal to anotherlinux - 将命令从一个终端写入另一个终端
【发布时间】:2012-05-09 17:08:08
【问题描述】:

我需要将命令从一个终端写入另一个终端。

我试过这些:

echo -e "ls\n" > /proc/pid/fd/0
echo -e "ls\n" > /dev/pts/4

这只是将ls 打印为输出并且不执行。

我试过这些:

chmod 777 /dev/tty4 ;echo "ls" > /dev/tty4
chmod 777 /dev/tty40 ;echo "ls" > /dev/tty40

似乎什么都没做

有什么想法吗?

[请注意,我不想触摸第二个终端来完成此操作。只有第一个]

【问题讨论】:

  • 真正想做什么?可能是您尝试这样做的逻辑首先是有缺陷的;可能有更简单的解决方案来获得相同的结果。此外,终端在不同的进程中运行,因此您需要某种形式的 interprocess communication 才能让它们相互通信。

标签: linux redirect terminal stdin tty


【解决方案1】:

Python 代码:

#!/usr/bin/python

import sys,os,fcntl,termios
if len(sys.argv) != 3:
   sys.stderr.write("usage: ttyexec.py tty command\n")
   sys.exit(1)
fd = os.open("/dev/" + sys.argv[1], os.O_RDWR)
cmd=sys.argv[2]
for i in range(len(cmd)):
   fcntl.ioctl(fd, termios.TIOCSTI, cmd[i])
fcntl.ioctl(fd, termios.TIOCSTI, '\n')
os.close(fd)

【讨论】:

  • 这很好用,但前提是您对相关 tty 具有适当的权限。
【解决方案2】:

可以使用以下脚本同时在多个终端上显示命令的输出。它适用于所有控制台程序,包括编辑器。例如做:

execmon.bash  'nano hello.txt' 5

打开一个编辑器,我们介绍的输出和文本都将被重定向到虚拟终端号 5。你可以看到你的终端:

ls /dev/pts

每个虚拟终端都有一个关联的号码。

与普通终端、konsole 和 xterm 一起工作,只需创建文件 execmon.bash 并输入:

#! / bin / bash
# execmon.bash
# Script to run a command in a terminal and display the output
# in the terminal used and an additional one.
param = $ #
if [$ param-eq 2]; Then
    echo $ 1 | tee a.out a.out && cat> / dev / pts / $ 2 && exec `cat` a.out | tee / dev / pts / $ 2 && rm a.out
else
    echo "Usage:"
    echo "execmon 'command' num '
    echo "-command is the command to run (you have to enter ')"
    echo "-num is the number of virtual console to output to the"
fi

例子:

execmon.bash 'ls-l' 5
execmon.bash 'nano Hello.txt' 5

【讨论】:

  • 好的。出于这个原因,你也对我的回答投了反对票。我只是想帮忙
  • @VoislavSauca 我相信你的答案被否决是因为它不正确。
  • 但是,您没有运行或无法修改其他终端的外壳环境。因此,例如,之前显示的当前目录可能不是执行命令的目录,并且更改目录的命令在那里无效。任何使用 subshel​​l 在另一个终端中运行命令的答案都无法更改其父级的环境,但它至少会继承它。关于需要什么的问题不够精确。
  • 首先感谢您的回答。我不想显示命令的输出。我想在另一个终端执行它。不过谢谢你的脚本
  • @Chris Stratton 我想要的只是模拟输入,而不是从键盘获取它,而是从另一个终端获取它。
【解决方案3】:

这是毛茸茸的。您尝试使用的 proc 中的标准输入文件是终端设备的符号链接(可能是 /dev/pts/something)。有 两个 进程打开了该设备:shell(您的目标)和终端仿真器(例如 gnome-terminal),它们像套接字一样使用它来双向传递数据。大概后者正在窃取输出并显示它,因此外壳永远不会看到它。我认为这种技术行不通。

你想完成什么?你不能像孩子一样使用像popen()这样的传统工具来运行这个过程吗?如果是 GUI 终端仿真器,您可以尝试通过 X 事件或内核的 uinput API 伪造键盘输入。

【讨论】:

  • 首先感谢您的回答。那我不能将输出定向到外壳吗?而不是终端仿真器?它如何从键盘获取命令?我不能模拟吗? popen 是我不太喜欢的选择。如果将命令写入 shell 不起作用,我会尝试 popen。
【解决方案4】:

打开 2 个终端 然后在要写入的终端上键入 ttd ttd 会显示终端的地址 移动到另一个终端并输入 cat >(第二个终端的地址) 然后按回车

【讨论】:

    【解决方案5】:

    看看:

    man 1 script
    

    例如:

    script -f /dev/tty1
    

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    【解决方案6】:

    这是错误的处理方式 - 您可能会将其显示在 终端,但未执行。

    你需要做一些事情,比如告诉 shell 从命名管道或 netcat/socat 中读取。或者您可以尝试以 root 身份或使用 xtest 注入击键(有时在 X 下还有另一种方式,我忘记了)。

    【讨论】:

    • 首先感谢您的回答。我试图让命令执行。为什么我可以将标准输入发送到进程但不能发送到外壳?.. 发送击键是什么意思?我可以将击键注入另一个外壳?
    【解决方案7】:

    命令 > dev/pts/# 其中 # 是另一个终端的名称

    【讨论】:

    • 我猜提问者试图在另一个 pty 中执行命令,而不仅仅是在那里放字符串
    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 2022-11-26
    • 1970-01-01
    • 2012-01-30
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多