【问题标题】:redirect the stdin to come from a different terminal using Bash使用 Bash 将标准输入重定向到来自不同的终端
【发布时间】:2009-03-12 21:09:50
【问题描述】:

我想知道如何使用 bash 将脚本的标准输入从当前 xterm 会话(即 /dev/pts/0)重定向到也正在运行的脚本(即 /dev/pts/1)?我有一个打开 3 个 xterm 窗口的 bash 脚本,我只想从其中一个窗口获取输入,但我不知道该怎么做。任何帮助表示赞赏!谢谢。



EDIT (从下面移动——OP 提交了这个澄清作为答案)

我想我应该澄清一下我想要做什么。我将从一个 pty 开始一个脚本,假设它是 /dev/pts/3。该脚本将打开 3 个 xterminal,比如说:/dev/pts/0、/dev/pts/1 和 /dev/pts/2。这 3 个新的 pty 是用户将要看到的。该脚本要求用户输入一些输入,我希望将用户的输入输入 /dev/pty/1 并且程序应该从那里获取它的信息。但是我尝试过这样做,但它不起作用。这是我的代码的 sn-p。

exec</dev/pts/1

echo
echo "Would you like to search for more info?" 1>/dev/pts/1
read answer

case $answer in
    y) echo "YES" ;;
    n) echo "NO"  ;;
    *) echo "y/n only!";;
esac

最后的case语句只是一个小占位符,用于查看输入是否真的有效。

【问题讨论】:

    标签: linux bash stdin


    【解决方案1】:

    也许您可以根据需要调整ttyecho

    # /dev/ttysXXX is the result of the tty command in another Terminal window
    sudo ttyecho -n /dev/ttysXXX pwd
    

    也许ttyecho 可以与netcat(或nc)或ncat(这是nmap 的一部分)结合使用以在不同的tty 之间进行通信?

    更多信息见:

    【讨论】:

      【解决方案2】:

      我怀疑这是不可能的。 AFAIK,如果不修改内核空间中的某些内容,就不可能从不是当前 tty 的 tty(或 pty)读取输入。连root都做不到。我花了一些时间研究这个,但我无法找到如何去做,但我确实发现很多消息来源声称这是不可能的。这似乎是为了提高用户的安全性/隐私性而做出的设计决定。

      【讨论】:

      • 我认为这不值得一票否决,尤其是没有评论告诉我我错了。现在,根据 Ian Kelling 的回答,我可能误解了 OP 的意图,在这种情况下,我的回答可能不适用,但它仍然是真实的 AFAIK。请参阅我对该答案的评论。
      • 添加了一个反对票,因为在关注@soeren 链接到 ttyecho 之后,我可以将字符发送到另一个 tty 的标准输入(在对 tty 进行 chmod 并以 root 身份运行之后)。如果发帖人没有将其标记为 Linux,我认为您的评论可以站得住脚,这也是我在许多其他地方听到的。
      【解决方案3】:

      要回答您明确的问题,一种简单的方法是使用 FIFO(命名管道)来完成这项工作。在发送端:

      mkfifo ./myfifo
      read var
      echo "var" > myfifo
      

      在接收终端上:

      read line < ./myfifo
      

      在接收 xterm 时从您自己的 xterm 中简单地打印另一个 xterm:

      $ tty
      /dev/pts/2
      

      在发送 xterm 时:

      $ echo howdy doody > /dev/pts/2
      

      或从发送 xterm 中的脚本,按照您的要求重定向标准输入:

      $ cat > /dev/pts/2
      

      如果您跨用户执行此操作,您必须更改写入 /dev/pts/2 的权限。

      您无法在接收终端上捕获以这种方式打印的内容。没有内置的重定向方法来捕获来自另一个终端的输入。

      如果您希望发送 xterm 以自动方式找出接收 xterm 的字符设备,则可以通过多种方式回答,具体取决于您要使用的进程间通信类型。一个简单的技巧是让接收者做 tty > file1 和发送者做 echo 不管 > $(cat file1)。

      如果您想尝试从接收方而不是发送方引导它,那么您又遇到了一个可以通过多种方式解决的进程间通信问题。

      【讨论】:

      • 我过去曾尝试过这样做,而您最终得到的是在 /dev/pts/2 窗口中打印的“你好,doody”。它不会像用户键入它一样发送(stdin),它会像 shell 打印它一样发送(stdout)。我完全误解了OP的问题吗?
      【解决方案4】:

      很简单 你只需要了解

      ls -ls /dev/pts 你会看到

      0 1 2 3 4 假设你打开了几个

      现在使用一个 NOT 4 并输入 猫

      然后在第 4 个中输入一些内容 你现在知道会发生什么了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2020-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多