Saída SSH não é buffer de linha?

35

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 é buffer de linha; em vez de ver uma linha retornada por vez, todas as linhas (~ 10) são impressas de uma só vez quando a conexão termina.

O que há com isso? Existe alguma maneira de forçá-los a ser buffer de linha?

(também, para afirmar o óbvio: quando ssh $hoste executo o comando "manualmente", a saída é armazenada em buffer, como esperado)

David Wolever
fonte

Respostas:

45

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

Ryan Fox
fonte
infelizmente não ajudou. Isso também pode ser um problema com o MTU, mas nada disso ajudou
314 Nick Roz
Veja o comentário de Magnus abaixo ref using -tt- que funcionou para mim quando -t não funcionou.
Tom Dalton
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 estão conversando com um terminal, mas, caso contrário, serão totalmente armazenados em buffer. (O padrão C especifica que o stdout é inicialmente totalmente armazenado em buffer quando "pode ​​ser determinado que não se refere a um dispositivo interativo".)

Então, o que você está vendo é que a saída do programa que você está executando remotamente (conforme fornecido ao stdout) não tem buffer de linha; O ssh está apenas passando pelo que recebe quando recebe. (Eu acho que o ssh realmente não faz buffer em sua saída - essa seria a maneira menos mágica de garantir que o usuário veja o que o programa remoto pretendia.)

Dave Vandervies
fonte
Um usuário anônimo sugere que stdout está totalmente tamponada, não linha tamponada
Michael Mrozek
Dave Vandervies me disse fora da banda que ele foi quem fez a edição e que está correto (ou seja, stdout é inicialmente totalmente bufferizado, não de linha).
David Wolever
6

Expandir ainda mais a resposta de Ryan Fox ssh -ttambém não funcionou para mim, mas ssh -ttfuncionou. Veja a página de manual do ssh sobre -t:

Várias opções -t forçam a alocação de tty, mesmo se ssh não tiver tty local

Magnus Berg
fonte