Use sudo com o comando ssh e capturando stdout

4

Estou tentando executar um comando como root (via sudo) em um servidor remoto e capturar stdout (mas não stderr) em um arquivo.

por exemplo. Algo parecido com isto:

ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz

Exceto que preciso ser root no controle remoto:

ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz

root não tem senha e não pode ser logado como, então não posso usar su ou ssh root@server .

Quando eu tento o comando acima, recebo:

$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified

Eu adicionei -t para que ssh aloque um tty, mas então root-file.tar.gz obtém a saída do sudo (e gzip, mas eu posso --force), então eu acho que está capturando stdout e stderr remotos no stdout local:

$ ssh -t user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
(hangs)

$ cat root-file.tar.gz
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
[sudo] password for user:

Eu listei comandos específicos usando o NOPASSWD em sudoers, o que funciona bem para scripts que ocorrem regularmente, mas eu acho que eu quero fazer esse tipo de coisa ocasionalmente com comandos arbitrários diferentes, então eu não posso estar sempre adicionando NOPASSWD.

    
por mrb 29.09.2014 / 15:09

1 resposta

3

Você pode passar a opção -S [0] para sudo, então ele pode aceitar a senha de stdin em vez de exigir um tty.

Isso provavelmente fará com que sua senha seja repetida no terminal, por isso, tente desativar o eco:

$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
[sudo] password for user:
$

[0] Na página de manual : a opção -S (stdin) faz com que o sudo leia o senha da entrada padrão em vez do dispositivo terminal. A senha deve ser seguida por um caractere de nova linha.

    
por 29.09.2014 / 15:09

Tags