我只是 ssh-ed 到某个远程服务器,发现我试图在 bash 中运行的所有命令/进程都被重定向到某个地方stdout
。stderr
所以,我有以下问题
如何检测:
1) 哪个文件在 Linuxstdout
中stderr
被重新路由?
和
2) 默认情况下如何重新路由stdout
并stderr
返回/dev/tty?
先感谢您。
应该按照您在 (2) 中的要求执行的命令是
exec >/dev/tty 2>&1
但我怀疑你对问题的分析是不正确的。查看(您在原始命令中键入的任何参数在ssh -v ...
哪里)的输出会很有用。...
ssh
命令:
ls -l /proc/$$/fd/{1,2}
将显示哪些文件作为 stdout(文件描述符 1)和 stderr(文件描述符 2)打开。
您的第一个问题的答案可以在 中找到/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:~#
在第一个示例中,您可以看到前 3 个文件描述符(分别是标准输出、输入和错误)都指向我的伪终端/dev/pts/3
。在第二个示例中,我将输入重定向到/dev/null
,因此标准输入文件描述符指向/dev/null
. 在最后一个示例中,我通过管道发送了ls
to的输出cat
,标准输入文件描述符反映了这一点。据我所知,没有办法找到哪个进程有管道的另一端。在所有示例中,都有第四个文件描述符,它表示ls
具有用于读取的句柄/proc/self/fd
。在这种情况下,它说/proc/15537
因为/proc/self
实际上是一个符号链接,指向访问的进程的 PID 在/proc/pid
哪里。pid
/proc/self
仅当您的渴望外壳以管道启动时才能完成,tee
以另一个控制台作为参数进行命令。
让我解释。
如果您正在登录/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