将输入从一个终端重定向到另一个终端

Nik*_*chi 7 linux unix terminal redirection tty

我已经进入了一个 linux 机器,我正在使用 dvtm 和 bash(虽然我也尝试过使用 Gnu screen 和 bash)。我有两个终端,当前的 /dev/pts/29 和 /dev/pts/130。我想将输入从一个重定向到另一个。

据我了解,在 /dev/pts/130 中,我可以输入:

cat </dev/pts/29
Run Code Online (Sandbox Code Playgroud)

然后当我输入 /dev/pts/29 时,我输入的字符应该会出现在 /dev/pts/130 中。然而,最终发生的是我输入的每个其他字符都被重定向。例如,如果我输入“你好”,我会得到这个:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo
Run Code Online (Sandbox Code Playgroud)

这真的很令人沮丧,因为我需要这样做以重定向在 gdb 中运行的进程的 io(我已经尝试过运行 /dev/pts/# 并设置低级 tty /dev/pts/# 并且都导致上述行为)。我做错了什么,还是 bash/screen/dvtm 中的错误?

Chr*_*sen 8

在您的简化示例中,您有两个进程(您的 shell 和cat)试图从 tty 的“从”端读取。结果是一个进程获取一些字符,另一个进程获取其他字符。

“将输入从一个[终端]重定向到另一个”是什么意思?在您的实际情况中,哪些进程试图从每个终端读取?一旦获得了捕获的输入,您想用它做什么?什么,究竟,你实际上是想实现什么?

对我来说,“重定向在 gdb 中运行的进程的 io”似乎更像是在已经运行的进程中重新打开 stdin/stdout/stderr。

您可以使用(除其他外)GDB更改正在运行的进程的 stdin/stdout/stderr 。对“使用命令行重定向进程启动后的 STDERR/STDOUT”的答案?展示了如何做到这一点。您想/dev/null在答案中替换 tty 路径名,并且您可能也想处理 stdin,但该技术仍然适用。


您应该能够使您的简化示例稳健地工作,但我不相信它会做您真正想做的事情(请记住,伪终端实际上是一对设备,例如双向管道的两端;但是您的所有示例都与“从”部分进行了交互)。

修复您的示例的关键是让所有竞争进程(暂时)停止从终端读取。如果像你的例子一样,你有一个 shell 在你想要捕获数据的一侧运行,那么你可以执行以下操作:

(
    s="$(stty -g)"
    exec 3<&0
    trap 'stty "$s" 0<&3;exit' 0 INT QUIT

    cat <<EOM
In some other terminal, run the command

    cat <$(tty)

Press ^C or ^\ to quit.
EOM

    stty raw isig brkint susp '' dsusp ''
    while true; do sleep 3600; done </dev/null
)
Run Code Online (Sandbox Code Playgroud)