Как перенаправить стандартный вывод stderr обратно в / dev / tty - PullRequest
11 голосов
/ 25 января 2012

Я только что отправил ssh-ed на какой-то удаленный сервер и обнаружил, что stdout и stderr всех команд / процессов, которые я пытаюсь запустить в bash, перенаправлены куда-то.Итак, я получил следующие вопросы

Как определить:

1) Какой файл stdout, stderr перенаправляется в Linux?

и

2) А как перенаправить по умолчанию stdout и stderr обратно в / dev / tty?

Заранее спасибо.

Ответы [ 4 ]

11 голосов
/ 25 января 2012

Команда, которая должна делать буквально то, что вы просили в (2):

exec >/dev/tty 2>&1

Но я подозреваю, что ваш анализ проблемы неверен. Было бы полезно увидеть вывод ssh -v ... (где ... - это те аргументы, которые вы ввели в оригинальной команде ssh).

8 голосов
/ 25 января 2012

Команда:

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

покажет вам, какие файлы открыты как stdout (дескриптор файла 1) и stderr (дескриптор файла 2).

1 голос
/ 20 мая 2014

Ответ на ваш первый вопрос можно найти в /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 на cat через канал, и стандартный дескриптор входного файла отражает это.Насколько я знаю, нет никакого способа найти, какой процесс имеет другой конец трубы.Во всех примерах есть четвертый файловый дескриптор, который представляет дескриптор, который ls имеет для чтения /proc/self/fd.В этом случае он говорит /proc/15537, потому что /proc/self фактически является символической ссылкой на /proc/pid, где pid - PID процесса, обращающегося к /proc/self.

1 голос
/ 25 января 2012

Это может быть сделано только в том случае, если ваша оболочка longing запущена с конвейером для команды tee с другой консолью в качестве параметра.

Позвольте мне объяснить.

Если вы входите в систему /dev/tty1, а кто-то еще входит в систему /dev/tty2.Если вы запустите свою оболочку (bash) с помощью следующей команды, все STDOUT / STDERR будут перенаправлены / скопированы в другую оболочку (/dev/tty2 в этом случае).

bash 2>&1 | tee /dev/tty2

Итак, кто-то сидит в /dev/tty2увидит всю вашу деятельность.

Если кто-то входит в оболочку /bin/bash 2>&1 | tee /dev/tty2 вместо /bin/bash Это будет происходить каждый раз, когда он входит в систему. Но я не уверен, что оболочку входа можно настроить таким образом.

Если кто-топеренаправляет весь вывод вашей оболочки таким образом, вы можете проверить это, просто проверив, работает ли tee в фоновом режиме.

ps ax | grep tee

Это выведет что-то вроде

tee /dev/tty2
...