Use ssh -t ...
para forçar uma alocação pseudo-tty (que é o que você obtém quando efetua login normalmente via ssh.)
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)
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.)
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
Tags ssh