A saída SSH não está em buffer de linha?

31

Estou executando um script em uma máquina remota como esta:

ssh $host "pip install -r /path/to/requirements.txt"

Mas a saída não é armazenada em buffer de linha; em vez de ver uma linha retornada por vez, todas as linhas (~ 10) são todas impressas de uma vez enquanto a conexão termina.

O que há com isso? Existe alguma maneira de forçá-los a serem armazenados em buffer?

(também, para indicar o óbvio: quando eu ssh em $host e executo o comando “manualmente”, a saída é armazenada em buffer, como esperado)

    
por David Wolever 03.10.2011 / 04:48

3 respostas

41

Use ssh -t ... para forçar uma alocação pseudo-tty (que é o que você obtém quando efetua login normalmente via ssh.)

    
por 03.10.2011 / 04:55
23

Para expandir um pouco a resposta de Ryan Fox: Muitos programas (a maioria - é o padrão para qualquer programa C) stdout de buffer de linha quando eles estão falando com um terminal, mas o buffer é totalmente diferente. (O padrão C especifica que o stdout é inicialmente totalmente armazenado em buffer quando "pode ser determinado não se referir a um dispositivo interativo".)

Então, o que você está vendo é que a saída do programa que você está executando remotamente (como determinado para o stdout) não está com buffer de linha; O ssh está apenas passando pelo que acontece quando consegue. (Eu acho que o ssh realmente não armazena nada na sua saída - essa seria a maneira menos mágica de garantir que o usuário visse o que o programa remoto pretendia.)

    
por 03.10.2011 / 05:25
5

Para expandir ainda mais a resposta de Ryan Fox, "ssh -t" também não funcionou para mim, mas "ssh -tt" funcionou. Veja a página man do ssh sobre -t:

Múltiplas opções -t forçam a alocação tty, mesmo que ssh não tenha tty local

    
por 23.11.2017 / 09:06

Tags