4

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



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

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

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 语句只是一个小占位符,用于查看输入是否真的有效。

4

4 回答 4

8

也许您可以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之间进行通信?

有关更多信息,请参阅:

于 2011-08-28T12:04:08.553 回答
5

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

于 2009-03-12T21:16:45.393 回答
4

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

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

在接收终端上:

read line < ./myfifo

在接收 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)。

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

于 2009-03-13T01:49:14.833 回答
2

这很简单,您只需要了解

ls -ls /dev/pts 你会看到

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

现在使用一个 NOT 4 并键入 cat < /dev/pts/4 或 exec < cat /dev/pts/4

并在第 4 个中输入一些内容,您现在知道会发生什么

于 2011-08-26T03:41:43.820 回答