Fornece a senha sudo sobre o ssh enquanto usa a substituição do processo Bash?

4

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?

    
por Antoine Cotten 23.02.2017 / 17:52

1 resposta

2

Você pode forçar o sudo a obter a senha do STDIN usando a opção -S , por este post de superusuário . Assim a sintaxe diff LOCALFILE <(ssh host 'echo <password> | sudo -S cat REMOTEFILE') deve fazer o que você precisa, sem a necessidade de um pseudo-terminal.

    
por 23.02.2017 / 23:12

Tags