La commande sudo avec le signe égal (=) devient confuse pour la variable d'environnement

1

J'essaie d'exécuter diverses commandes via sudo , où le signe égal ( = ) fait partie de la commande. Dans certains cas, il semble que sudo confonde ce signe pour la variable setting et environment.

Je vois ceci dans sudo (8) man:

Environment variables to be set for the command may also be passed on the command line in the form of VAR=value...

C'est un problème pour moi, par exemple, si j'essaie d'exécuter une commande comme celle-ci:

sudo -i "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"

En fait, il passe dans un shell racine au lieu d'exécuter la commande, car celle-ci est mal interprétée. Je vois ceci dans sudo.log :

Apr 29 16:11:40 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; ENV=cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls ; COMMAND=/bin/bash

Comme vous pouvez le constater, la commande est en fait mal interprétée comme une tentative de définition de ENV.

Si je supprime ce qui précède, cd /tmp;cela fonctionnera. Cependant, pour certaines de mes affaires, je dois d'abord exécuter une commande cd ou quelque chose de similaire.

Cela semble être dû au signe égal qui fait que sudo pense que je mets ENV. Si je supprime le signe égal (c'est-à-dire que je supprime -D dfs.replication=2), alors cela fonctionne et est enregistré correctement:

Apr 29 16:08:46 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; COMMAND=/bin/tcsh -c cd /tmp; /usr/bin/hadoop fs -ls

Ma question est: Comment puis-je échapper à cette = caractère, et / ou obtenir la commande sudo lu comme une commande tout, au lieu de penser un signe égal est la mise en une variable d'environnement?

Merci beaucoup!

redood
la source
cd / tmp; sudo blah blah?
mcalex
J'essayais d'utiliser le double tiret habituel --pour arrêter l'analyse des arguments de ligne de commande en premier: sudo -i -- "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"(je n'ai pas de système avec sudo install à portée de main pour pouvoir le tester moi-même). Si cela fonctionne, j'écris volontiers une réponse.
Mpy
mclex - bonne idée, mais pour certaines commandes, il faut que le cdsoit dans sudo, car un utilisateur non privilégié ne pourra pas accéder au répertoire autrement.
redood
mpy - Je n’ai pas testé votre idée à fond (depuis que j’y suis déjà allée avec la réponse de daBeamer ci-dessous), mais avec un simple test, cela semble également fonctionner. Merci
redood

Réponses:

0

Essayez d’ exécuter une commande shell en passant sudoplutôt que directement. Par exemple, faites quelque chose comme:

sudo bash -c "cd /root; ls -al"

Bien sûr, c’est un exemple stupide puisqu’on pourrait simplement exécuter sudo ls -al /root, mais j’espère que cela fera passer le message.

L'exécution d' une commande shell est beaucoup plus explicite que de passer à l' sudoutilisation de l' -iindicateur car cela exécutera le shell attribué à l' rootutilisateur sur un système donné. En outre, tout problème potentiel lié aux fichiers de ressources de connexion de l' rootutilisateur est évité.

Bash (ou votre shell préféré) devrait analyser le =caractère correctement. Je suis allé de l'avant et testé cela sur mon côté pour la complétude et n'ai rencontré aucun problème. Sinon, échappez-vous simplement en le =faisant précéder d'un \caractère.

daBeamer
la source
Je ne sais pas pourquoi je n'y ai pas pensé, mais ça marche! Merci :)
redood