使用Bash将stdin重定向到来自不同的终端

时间:2009-03-12 21:09:51

标签: linux bash stdin

我想知道如何将脚本的stdin从当前的xterm会话(即/ dev / pts / 0)重定向到使用bash运行即/ dev / pts / 1的脚本?我有一个打开3个xterm窗口的bash脚本,我想从其中一个窗口获取输入,我无法弄清楚如何做到这一点。任何帮助表示赞赏!感谢。


<小时/> 编辑(从下方移动 - OP提交此澄清作为答案)

我想我应该澄清一下我想做什么。我将从一个pty开始一个脚本,让我们说它是/ dev / pts / 3。这个脚本将打开3个终端,比方说:/ dev / pts / 0,/ dev / pts / 1和/ dev / pts / 2。这3个新的ptys是用户将要看到的。该脚本要求用户输入一些内容,我希望将用户的输入输入到/ 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

最后的案例陈述只是一个小占位符,看看输入是否真的有效。

4 个答案:

答案 0 :(得分: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的一部分)结合使用,以便在不同的ttys之间进行通信?

有关详细信息,请参阅:

答案 1 :(得分:5)

我怀疑这是不可能的。 AFAIK,在不修改内核空间中的内容的情况下,不可能从tty(或pty)读取不是当前tty的输入。即使root也无法做到。我花了一些时间研究这个,我无法找到如何做到这一点,但我发现很多消息来源声称这是不可能的。这似乎是提高用户安全性/隐私的设计决策。

答案 2 :(得分: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的脚本中,按照你的要求重定向stdin:

$ cat > /dev/pts/2

如果你跨用户这样做,你必须chmod写入/ dev / pts / 2的权限。

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

如果您希望发送xterm的自动方式找出接收方的字符设备,可以通过多种方式回答,具体取决于您要使用的进程间通信类型。一个简单的黑客将是接收者做tty&gt; file1和发送者做什么回应&gt; $(cat file1)。

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

答案 3 :(得分:1)

这很简单 你只需要理解

ls -ls / dev / pts 你会看到

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

现在使用一个NOT 4 并输入 猫&lt;的/ dev / PTS / 4 要么 exec&lt; cat / dev / pts / 4

并在第4个输入内容 你现在知道会发生什么了