Minha pergunta pode ser vista como uma extensão do Como fazer a diff sobre o ssh? com uma pequena reviravolta.
Ambiente
macOS Sierra (10.12.3)
OpenSSH 7.3
Exemplo de situação
Estou tentando imprimir um diff
entre dois arquivos, um deles está localizado em um host remoto e requer sudo
para leitura.
Se este arquivo remoto fosse legível pelo meu usuário remoto (ou se eu pudesse executar o comando com o sinalizador sudo NOPASSWD
) eu simplesmente executaria:
diff LOCALFILE <(ssh host 'cat REMOTEFILE')
No entanto, preciso autenticar para executar o comando remoto, o que significa que tenho que alocar um pseudo-terminal com ssh -t
e a execução a seguir nunca é concluída:
diff LOCALFILE <(ssh -t host 'sudo cat REMOTEFILE')
Resolução de problemas
ps
mostra que o processo ssh
foi interrompido:
STAT TIME COMMAND
S+ 0:00.00 diff LOCALFILE /dev/fd/12
T 0:00.03 ssh -t host sudo cat REMOTEFILE
O processo ssh
não responde a SIGTERM nesse ponto, e o descritor de arquivo acima não existe:
❯ ls -l /dev/fd
total 0
crw--w---- 1 me tty 16, 2 Feb 23 17:36 0
crw--w---- 1 me tty 16, 2 Feb 23 17:36 1
crw--w---- 1 me tty 16, 2 Feb 23 17:36 2
dr--r--r-- 1 root wheel 0 Feb 23 09:33 4
Notas extras
Eu posso observar exatamente o mesmo comportamento sempre que usar ssh -t
dentro de uma substituição de processo, independentemente de uma senha ser necessária ou não para sudo
(que disse que eu entendo que o uso de -t
é questionável se não entrada é esperada no host remoto).
Linha de fundo
Estou usando diff
como exemplo aqui, mas minha pergunta é na verdade mais geral: existe alguma maneira de usar um Bash? substituição de processo juntamente com uma alocação de pseudo-terminal SSH?