Direciona o stderr para um arquivo sobre o ssh

4

Estou tentando executar um comando em uma máquina local e direcionar o stderr para uma máquina remota por ssh. Não posso fazer

 ssh remote machine "command 2>stderr.log"

porque a máquina remota não tem a construção correta para executar o comando, e eu tenho que executar o comando na minha máquina local. Eu não tentei ainda, mas eu sou principalmente positivo que não podemos fazer 2>ssh local machine /dir/stderr.log ?

    
por user3669481 26.07.2016 / 02:29

2 respostas

3

Pelo que entendi, você quer executar um comando localmente , mas salvar a saída do stderr em um arquivo de log remoto.

Tente substituição de processo :

local_command 2> >(ssh somemachine 'cat >logfile')

Aqui, >(...) é substituição de processo . Ele cria um objeto semelhante a um arquivo a partir do comando nos parênteses. Portanto, 2> redireciona o stderr para esse objeto semelhante a um arquivo, resultando na saída sendo salva na máquina remota.

Ou use apenas o redirecionamento antigo:

{ local_command 2>&1 1>&3 | ssh somemachine 'cat >logfile'; } 3>&1

Aqui, o stderr é redirecionado para o stdout para que possamos canalizá-lo para o ssh. Para que o stdout não vá para o ssh, nós o redirecionamos para o identificador de arquivo 3. No final do comando, o identificador de arquivo 3 é redirecionado para stdout para que apareça no terminal.

    
por 26.07.2016 / 02:37
2

Se você não se importa em rastrear o stderr do processo enquanto ele está em execução, então você pode usar um arquivo local temporário eg

#!/bin/bash

tmpfile='mktemp'

trap '/bin/rm -f $tmpfile ; exit' 0 1 2 3 15

run_command 2> $tmpfile

if [ -s $tmpfile ]
then
  scp $tmpfile remoteserver:logfile
fi

exit 0

Se você quiser dados "ao vivo", terá problemas de buffer. enviar stderr sobre ssh pode não ser armazenado em buffer e, portanto, todo esse conceito pode não ser a melhor maneira de fazê-lo.

    
por 26.07.2016 / 02:56