sed não está funcionando corretamente quando canalizado

0

Por alguma raz�, eu n� terei uma sa�a ao vivo quando a tubagem da sa�a de comando, e. SSH para sed:

ssh someuser@somehost 2>&1 | sed -e "s/\[32//g" | tee logging

Eu suspeitava que a saída não tivesse novas linhas, mas quando eu removia o comando sed e corria:

wc -l logging

Retorna 6, que é o número correto de retornos. Alguém tem ideia do que eu sinto falta aqui?

[EDITAR] Eu esqueci completamente de mencionar o seguinte: executando

ssh someuser@somehost 2>&1 | sed -e "s/\[32//g"

retorna todos os valores sem nenhum problema, no entanto, assim que eu adicionar tee na mistura, não receberei saídas até que eu ative ^ C ... Nem mesmo o redirecionamento de saída padrão funciona (ssh someuser @ somehost 2 > & 1 | sed -e "s / [32 // g" > arquivo). Apenas ssh com tee também funciona bem.

    
por Matthias Cotting 17.11.2018 / 03:40

2 respostas

2

Quando você executa ssh user@somehost sem um comando explícito, está solicitando ao ssh que inicie um shell interativo na máquina remota.

Um shell interativo (como o bash) normalmente quer ter um terminal disponível, já que ele usará comandos de terminal para implementar uma experiência aprimorada ao editar a linha de comando e navegar pelo histórico. (Comandos de terminal permitem controle em tela cheia).

Mas ssh alocará apenas um terminal por padrão (também chamado de pseudo-terminal ) se sua saída padrão estiver conectada a um terminal.

Se você simplesmente executar ssh user@somehost de um programa terminal (como gnome-terminal, rxvt, xterm, etc.), então sua saída padrão será um terminal, então o ssh criará um pseudo-terminal e o interativo remoto o shell se comportará bem.

Se você canaliza o ssh através de algo (qualquer coisa), como ssh user@somehost | cat , então sua saída padrão será um pipe (e não o terminal), então o ssh não criará um terminal e isso pode fazer com que o shell interativo se comporte mal.

Uma possível solução é forçar o ssh a criar um pseudo-terminal, passando a opção -t , como ssh -t user@somehost | cat , que pode ajudar. (Além disso, você pode precisar de uma opção dupla -tt para forçar a alocação do pseudo-terminal.)

Outra possibilidade, se você estiver executando o ssh principalmente porque está interessado em um comando específico, é executar o comando específico a partir da linha de comando ssh, como ssh user@somehost mycommand | cat . Se você executar um comando específico, um shell interativo não se envolverá e, nesse caso, ter um terminal disponível provavelmente não causará problemas.

    
por 17.11.2018 / 06:33
0

Eu tentaria o mesmo comando com a seguinte adição, ssh someuser @ somehost 2 > & 1 | sed -e "s / [32 // g" | tee --output-error = avisa o registro. Com isso você deve ser capaz de ver se é um erro ao escrever para o stdout. Deixe-me saber se isso ajuda.

Você poderia instalar esperar Então tente: unbuffer ssh someuser @ somehost 2 > & 1 | sed -e "s / [32 // g" | tee logging

    
por 17.11.2018 / 04:30