Você acabou de fazer isso.
Espera-se que os programas locais cuja saída é canalizada para outro programa detectem que eles não estão conectados a nenhum terminal, por isso não podem usar códigos de cores (que variam entre terminais, daí a variável de ambiente TERM).
E quando o programa local ssh
é enviado para outro programa e você não passa as opções -tt
, ele suprime a alocação de um "pseudo-terminal" e usa pipes. Veja também man ssh
.
Se o seu código estava alocando um "pseudo-terminal" em vez de usar um pipe para capturar a saída, você deveria notar esse fato. Na maioria dos contextos, o código requerido é mais obscuro e mais longo do que se você usasse um pipe; na maioria das vezes você não precisa (ou, como você diz, quer) dos recursos extras de um PTY.
EXCETO acho que sua pergunta está errada (na parte UPDATE)
Suponha que você não esteja executando ssh
e, em vez disso, executando sshpass -p '${auth.password}' ssh
...
sshpass, de acordo com a página man
, está executando o ssh "em um TTY dedicado, acreditando que está obtendo a senha de um usuário interativo" (sim, é outro PTY).
Nesse caso, você precisaria desabilitar o comportamento normal do terminal novamente para a conexão SSH interna. Ou seja usando ssh -T
(não ssh -t
como em um dos commits de código!).
Acho que o prefixo com TERM=dumb
também alcança um efeito muito semelhante. É um pouco de trabalho. ssh -T
evita a necessidade de mexer com o TERM. Mas eu testei TERM=dumb sshpass sh -c 'echo $TERM'
no meu computador, parece passar por OK e talvez pareça mais simples para você.
Próxima pergunta: Por que seu teste está dizendo que isso é necessário, quando seu código também já está trabalhando para definir TERM=dumb
, antes de iniciar o comando (inner) ssh
? Você esperaria que o ssh
tivesse herdado TERM=dumb
já. Veja o código do Jsch. Eu acho que seu setPtyType("dumb")
não terá nenhum efeito, porque você não tem nenhuma chamada para setPty(true)
.
Meu entendimento é contradito por sua afirmação de que setPty(false)
"quebra", mas você não diz como.