我只是ssh-ed到某个远程服务器,发现我尝试在bash中运行的所有命令/进程的stdout
和stderr
被重定向到某个地方。
所以,我得到了以下问题
如何检测:
1)哪个文件stdout
,stderr
正在Linux中重新路由?
和
2)如何将默认情况下stdout
和stderr
重新路由回/ dev / tty?
提前谢谢。
答案 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。