2008-08-27 12 views
9

Estoy buscando una manera de redirigir todas las corrientes de stderr en bash interactivo (idealmente para su proceso principal de llamada).¿Cómo redirigir todo stderr en bash?

No deseo redirigir la corriente de stderr de cada comando individual, lo cual podría hacer agregando 2> a_file a cada comando.

De forma predeterminada, estos flujos stderr se redirigen a la stdout de un bash interactivo. Me gustaría ponerlos al corriente de este proceso interactivo bash para evitar que mi rutina sea contaminada por mensajes de error y ser capaz de tratarlos por separado.

¿Alguna idea?

Todavía no he encontrado una respuesta ... Pero tal vez es en realidad un parámetro tty. ¿Alguien sabe algo sobre la responsabilidad tty/interactive shell para el manejo de stderr?

+0

usted menciona pitón en un comentario, ¿podría mostrar lo que el código que está utilizando para crea estas secuencias SSH. ¿No estás usando popen/popen2/popen3? – jtimberman

Respuesta

4

Se podría lanzar un nuevo proceso fiesta de redirigir el stderr de ese proceso:

$ bash -i 2> stderr.log 
    $ 
7

Uso del exec orden interna en bash:

exec 2> /tmp/myfile

2

Pruebe sus comandos en comillas dobles, así:

ssh remotehost "command" 2>~/stderr 

Probado en mi sistema local usando un archivo no inexistente en el host remoto.

$ ssh remotehost "tail x;head x" 2>~/stderr 
$ cat stderr 
tail: cannot open `x' for reading: No such file or directory 
head: cannot open `x' for reading: No such file or directory 
+0

Si escribe el comando directamente después de ssh, no está cargando un shell en el host remoto. El comando se ejecuta directamente a través del canal ssh. Estoy usando paramiko en python, pero esto es lo mismo. Mi problema es que necesito un intérprete interactivo para ejecutar muchos comandos y seguir obteniendo stderr. –

2

no veo el problema funciona como fue diseñado:

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout 
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found 
0

Probamos ssh -t para crear un pseudo-TTY en el extremo remoto?

2

dos cosas:

  1. Uso de 2>&1 en una remota resultados del comando ssh en el error que termina en el interior del archivo tar locales, lo que resulta en una copia de seguridad 'roto'.
  2. Si desea aplicar una redirección en el otro lado del ssh, recuerde escapar del comando redirigir.

Mi sugerencia sería redirigir stderr en el lado remoto a un archivo y recogerlo más tarde, en caso de error.

ejemplo:

ssh -t remotehost tar -cf - /mnt/backup 2\>backup.err > localbackup.tar 
EXITSTATUS=$? 
if [ $EXITSTATUS != "0" ] then 
    echo Error occurred! 
    ssh remotehost cat backup.err >localbackup.errors 
    cat localbackup.errors 
    ssh remotehost rm backup.err 
else 
    echo Backup completed successfully! 
    ssh remotehost rm backup.err 
fi 
2

me parece una buena manera es rodear los comandos entre paréntesis, '()', (lanzar una sub-shell) o entre llaves, '{}' (sin sub -shell; más rápido):

{ 
    cmd1 
    cmd2 
    ... 
    cmdN 
} 2> error.log 

por supuesto, esto se puede hacer en 1 línea:

{ cmd1; cmd2; ... cmdN; } 2> error.log 
Cuestiones relacionadas