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!
--
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.cd
soit dans sudo, car un utilisateur non privilégié ne pourra pas accéder au répertoire autrement.Réponses:
Essayez d’ exécuter une commande shell en passant
sudo
plutôt que directement. Par exemple, faites quelque chose comme: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'
sudo
utilisation de l'-i
indicateur car cela exécutera le shell attribué à l'root
utilisateur sur un système donné. En outre, tout problème potentiel lié aux fichiers de ressources de connexion de l'root
utilisateur 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.la source