Pourquoi la redirection échoue-t-elle lors du passage par ssh, sudo et sh?

5

Après avoir lu cette question , Je sais que je dois faire

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

éviter l'erreur "Autorisation refusée".

Mais quand je fais

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

d'une autre machine, je reçois

bash: /root/test.out: Permission denied

Pourquoi? Et comment puis-je le faire fonctionner?

modifier : Il y a la ligne

Defaults:<username>    !requiretty

avant

<username> ALL= NOPASSWD: ALL

dans /etc/sudoers.

Je peux faire

ssh remote-machine 'sudo ls /'

sans aucun probléme. Donc, je ne pense pas que ce soit un problème de tty. L'ajout de -t ne résout pas le problème.

Fabien
la source

Réponses:

6

Le problème est que les citations sont interprétées et supprimées par le shell local, pas par le shell distant; vous avez besoin d'un niveau supplémentaire:

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

Le shell local consomme un niveau de citation - les guillemets simples sont "utilisés" ici, ssh obtiendra les arguments host, sudo, sh, -c, et "ls -hal /root/ > /root/test.out".

Le shell distant consomme la couche suivante - les guillemets - et appelle sudo avec sh, -c, et ls -hal /root/ > /root/test.out.

Finalement, le sh instance (exécutée en tant que root) est appelée avec -c et ls -hal /root/ > /root/test.out - et analyse cet argument unique en tant que ligne de commande normale, en évaluant la redirection.

Pour voir tout cela, sur le système cible, essayez de lancer sudo strace -f -e execve -p $(cat /var/run/sshd.pid).

Gabe
la source
et si je veux avoir $1 dans les citations?
kirill_igum