16

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

如何检测:

1) 哪个文件在 Linuxstdoutstderr被重新路由?

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

先感谢您。

4

4 回答 4

16

应该按照您在 (2) 中的要求执行的命令是

exec >/dev/tty 2>&1

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

于 2012-01-24T22:22:32.893 回答
9

命令:

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

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

于 2012-01-25T06:31:25.797 回答
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. 在最后一个示例中,我通过管道发送了lsto的输出cat,标准输入文件描述符反映了这一点。据我所知,没有办法找到哪个进程有管道的另一端。在所有示例中,都有第四个文件描述符,它表示ls具有用于读取的句柄/proc/self/fd。在这种情况下,它说/proc/15537因为/proc/self实际上是一个符号链接,指向访问的进程的 PID 在/proc/pid哪里。pid/proc/self

于 2014-05-20T14:24:29.407 回答
1

仅当您的渴望外壳以管道启动时才能完成,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
于 2012-01-24T22:25:21.480 回答