如何将stdout,stderr重新路由回/ dev / tty

时间:2012-01-24 21:40:38

标签: linux bash stdout stderr tty

我只是ssh-ed到某个远程服务器,发现我尝试在bash中运行的所有命令/进程的stdoutstderr被重定向到某个地方。 所以,我得到了以下问题

如何检测:

1)哪个文件stdoutstderr正在Linux中重新路由?

2)如何将默认情况下stdoutstderr重新路由回/ dev / tty?

提前谢谢。

4 个答案:

答案 0 :(得分:11)

一个命令应该按字面意思执行(2)中要求的是

exec >/dev/tty 2>&1

但我怀疑你对这个问题的分析是不正确的。查看ssh -v ...的输出会很有用(其中...是您在原始ssh命令中输入的任何参数)。

答案 1 :(得分:8)

命令:

ls -l /proc/$$/fd/{1,2}

将显示哪些文件作为stdout(文件描述符1)和stderr(文件描述符2)打开。

答案 2 :(得分:1)

只有在您使用其他控制台作为参数的tee命令管道启动您的渴望shell时才能执行此操作。

让我解释一下。

如果您正在登录/dev/tty1,而其他人正在登录/dev/tty2。如果通过以下命令启动shell(bash),则所有STDOUT / STDERR将被重新路由/复制到另一个shell(在这种情况下为/dev/tty2)。

bash 2>&1 | tee /dev/tty2

所以,坐在/dev/tty2的人会看到你的所有活动。

如果有人登录shell是/bin/bash 2>&1 | tee /dev/tty2而不是/bin/bash它会在每次登录时发生。但我不确定登录shell是否可以这样设置。

如果有人以这种方式重新路由shell的所有输出,您只需检查后台是否有tee正在运行,就可以检查它。

ps ax | grep tee

这将输出类似

的内容
tee /dev/tty2

答案 3 :(得分:1)

您可以在/proc/self/fd找到对第一个问题的回答。它包含与bash实例连接的文件(或其他东西,管道,套接字等)的符号链接。

root@mammon:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15529/fd/
root@mammon:~# ls -l /proc/self/fd < /dev/null
total 0
lr-x------ 1 root root 64 May 21 02:18 0 -> /dev/null
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15536/fd/
root@mammon:~# ls -l /proc/self/fd | cat
total 0
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3
l-wx------ 1 root root 64 May 21 02:18 1 -> pipe:[497711]
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3
lr-x------ 1 root root 64 May 21 02:18 3 -> /proc/15537/fd/
root@mammon:~#

在第一个示例中,您可以看到前三个文件描述符(分别是标准输出,输入和错误)都指向我的伪终端/dev/pts/3。在第二个示例中,我将输入重定向到/dev/null,因此标准输入文件描述符指向/dev/null。在最后的示例中,我通过管道将ls的输出发送到cat,标准输入文件描述符反映了这一点。据我所知,没有办法找到哪个进程有管道的另一端。在所有示例中,都有第四个文件描述符,表示ls用于读取/proc/self/fd的句柄。在这种情况下,它显示/proc/15537,因为/proc/self实际上是/proc/pid的符号链接,其中pid是访问/proc/self的进程的PID。