Как перенаправить stdout, stderr обратно в /dev/tty

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

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

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

и

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

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

4 ответов


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

exec >/dev/tty 2>&1

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


команды:

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

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


это можно сделать только в том случае, если ваша тоска оболочка запускается с трубы до 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 это произойдет каждый раз, когда он входит в систему. Но я не уверен, что login shell можно установить таким образом.

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

ps ax | grep tee

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

tee /dev/tty2

ответ на ваш первый вопрос можно найти в /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 на самом деле является символической ссылкой на /proc/pid здесь pid является PID процесса доступа /proc/self.