2012-01-24 3 views
11

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

Как обнаружить:

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

и

2) И как перенаправлять по умолчанию stdout и stderr обратно в/разработчика/TTY?

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

+0

Как вы это узнали? –

+0

просто введите команды, которые должны выводиться в STDOUT и STDERR. – Sergey

+0

Есть ли что-нибудь релевантное в .bashrc? –

ответ

10

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

exec >/dev/tty 2>&1 

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

+0

добавив это в мой цикл управления fork, сделал трюк для сброса stdout. Я сидел, запускал экран и запускал скрипт perl os patching perl, внутри которого новые строки начали действовать как каретка, переходя к следующей строке, не возвращаясь. Mucho gracias за указание этой команды. –

1

Это может быть сделано только в том случае, если ваша тоскающая оболочка запускается с помощью трубы в команду 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 
8

Команда:

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

покажет вам, какие файлы открыты в стандартный вывод (файловый дескриптор 1) и поток ошибок (дескриптор файла 2) ,

+0

очень хорошо! любая идея, как соотнести, например: «1 -> pipe: [16418291]' to pid? –

+0

Я только что нашел, в/proc, другой pid с этим! '0 -> pipe: [16418291]' –

1

Ответ на ваш первый вопрос можно найти в /proc/self/fd. Он содержит символические ссылки на файлы (или другие вещи, трубы, сокеты и т. Д.), К которым подключен ваш экземпляр bash.

[email protected]:~# 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/ 
[email protected]:~# 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/ 
[email protected]:~# 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/ 
[email protected]:~# 

В первом примере, вы можете увидеть первые 3 дескрипторы файлов (которые являются стандартный вывод, ввод, и ошибок, соответственно) все это указывает на мой псевдо-терминала /dev/pts/3. Во втором примере я перенаправил ввод на /dev/null, поэтому стандартный дескриптор входного файла указывает на /dev/null. И в последнем примере я отправил вывод ls в cat через трубку, и это отражает стандартный дескриптор входного файла. Насколько я знаю, нет способа найти, какой процесс имеет другой конец трубы. Во всех примерах есть четвертый файловый дескриптор, представляющий дескриптор, который ls имеет для чтения /proc/self/fd. В этом случае он говорит /proc/15537, потому что /proc/self на самом деле является символической ссылкой на /proc/pid, где pid является PID процесса, получающего доступ к /proc/self.