【问题标题】:why can't I write to the standard input of my terminal device from another terminal为什么我不能从另一个终端写入我的终端设备的标准输入
【发布时间】:2018-08-31 06:41:09
【问题描述】:

我在我的 Gnome 桌面管理器 Ubuntu 中打开了两个 pts 终端。

我要做的是使用终端 /dev/pts/1 使用重定向向终端 /dev/pts/0 写入一些内容,例如:

##in pts/1
echo date > /dev/pts/0   

但在 pts/0 中,仅打印日期,按 Enter 不会执行它。所以我猜comamnd不会进入 pts/0 的标准输入。所以我尝试将echo date 的输出通过管道传输到 /dev/pts/0 这给了我权限被拒绝的错误,我成为 root 并更改了它的权限我仍然无法让 date 命令在 pts/0 中运行。

我正在尝试这些东西以用于学习目的。所以我真的很困惑它是如何在这里工作的,我应该怎么做才能完成它。

【问题讨论】:

  • 如果“管道连接到/dev/pts/0”是指echo date | /dev/pts/0,那将失败,因为/dev/pts/0 不是您可以执行的程序。
  • 澄清:您是否尝试将文本注入终端,就好像用户输入了它一样?因此,如果 shell 在 pts 0 中运行,date 会被放在命令行上,就像用户输入了 d a t e?
  • “按回车不执行” - 终端不执行任何操作,你是说 shell 吗? “不去 pts/0 的标准输入”——终端没有标准输入,进程有。再说一遍,你的意思是使用终端的 shell 进程吗?
  • 该命令只打印在终端/dev/pts/0,见mesg。文本不会到达那里运行的 shell,也不会“执行”。进行类似操作的最简单方法可能是使用screentmux
  • @melpomeme,是的,我正在尝试向其中注入文本并且它有效,但文本不会作为命令或程序执行。它只是打印,仅此而已。

标签: linux bash shell unix pty


【解决方案1】:

写入终端设备只会在终端上打印输出。如果它将文本塞回输入缓冲区,那么您打印到stdout 的所有内容都会循环回stdin,因为它们都连接到同一个终端设备。

为了将数据放入伪 tty 的输入缓冲区,您必须写入其主设备。不幸的是,它们在 Linux 的文件系统中没有不同的名称。有一个/dev/ptmx 设备,主进程使用grantpt() 创建一个链接到它的从属设备,然后再生成将其用作控制终端的子进程。因此,文件系统中没有任何内容可以写入到 pty 的输入缓冲区中。

【讨论】:

    【解决方案2】:

    您可以通过执行以下命令来做到这一点,(来自 /dev/pts/1 或其他 tty):

    执行 1>/dev/pts/0

    停用

    exec 1>/dev/pts/1 #或者你原来的tty地址。

    基本上你正在取代 tty 标准输入。

    已编辑以获取更多详细信息。

    "exec" 在这种情况下会启动一个新的 bash,您可以使用一组新的环境变量来提供它,通常您无法动态更改这些环境变量。有关详细信息,请执行“man exec”。

    "1>/dev/pts/0" 在这里我们说,“无论我在这个新的 bash 上输入什么,将它写入另一个,它确实会这样做,但是所有的标准输出都将显示在原始tty。

    祝你学习linux好运,希望你喜欢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2017-06-17
      • 2014-08-22
      • 2014-04-07
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      相关资源
      最近更新 更多