Por que o redirecionamento falha ao passar por ssh, sudo e sh?

5

Depois de ler esta questão , eu sei que tenho que fazer

sudo sh -c 'ls -hal /root/ > /root/test.out'

para evitar o erro "Permissão negada".

Mas quando eu faço

ssh hostname sudo sh -c 'ls -hal /root/ > /root/test.out'

de outra máquina, recebo

bash: /root/test.out: Permission denied

Por quê? E como posso fazer isso funcionar?

Editar : existe a linha

Defaults:<username>    !requiretty

antes

<username> ALL= NOPASSWD: ALL

em /etc/sudoers .

Eu posso fazer

ssh remote-machine 'sudo ls /'

sem nenhum problema. Então eu não acho que seja um problema tty. Adicionar -t não resolve o problema.

    
por Fabien 19.04.2013 / 10:00

1 resposta

6

O problema é que as aspas são interpretadas e removidas pelo shell local, não pelo remoto; você precisa de um nível extra:

ssh host sudo sh -c '"ls -hal /root/ > /root/test.out"'

O shell local consumirá um nível de cotação - as aspas simples serão "usadas" aqui, o ssh obterá os argumentos host , sudo , sh , -c e "ls -hal /root/ > /root/test.out" .

O shell remoto consome a próxima camada - as aspas duplas - e chama sudo com sh , -c e ls -hal /root/ > /root/test.out .

Por fim, a instância sh (em execução como raiz) é chamada com -c e ls -hal /root/ > /root/test.out - e analisa esse único argumento como uma linha de comando normal, avaliando o redirecionamento.

Para assistir a tudo isso, no sistema de destino, tente executar sudo strace -f -e execve -p $(cat /var/run/sshd.pid) .

    
por 02.05.2013 / 13:33