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?