Ich versuche, verschiedene Befehle über sudo auszuführen , wobei das Gleichheitszeichen ( = ) Teil des Befehls ist. Unter bestimmten Umständen scheint sudo dieses Zeichen für die Einstellung und die Umgebungsvariable zu verwechseln.
Ich sehe das in 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...
Dies ist ein Problem für mich, wenn ich zum Beispiel versuche, einen Befehl auszuführen wie:
sudo -i "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"
Es geht tatsächlich in eine Root-Shell, anstatt den Befehl auszuführen, da der Befehl falsch interpretiert wird. Ich sehe das in 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
Wie Sie sehen, wird der Befehl fälschlicherweise als Versuch interpretiert, ENV zu setzen.
Wenn ich das vorhergehende entferne cd /tmp;
, funktioniert es. Für einige meiner Sachen muss ich jedoch zuerst einen CD- Befehl oder ähnliches ausführen .
Dies scheint auf das Gleichheitszeichen zurückzuführen zu sein, das sudo glauben lässt, ich setze ENV. Wenn ich das Gleichheitszeichen entferne (dh entferne -D dfs.replication=2
), funktioniert es und wird korrekt protokolliert:
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
Meine Frage lautet also: Wie kann ich dieses = Zeichen maskieren und / oder den Befehl als ganzen Befehl von sudo lesen lassen, anstatt zu glauben , dass ein Gleichheitszeichen eine Umgebungsvariable setzt?
Vielen Dank!
--
Parsen von Befehlszeilenargumenten zu stoppen:sudo -i -- "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"
(Ich habe kein System mit sudo install zur Hand, damit ich es selbst testen kann). Wenn es funktioniert, schreibe ich gerne eine Antwort.cd
sudo verwendet werden, da nicht privilegierte Benutzer sonst nicht auf das Verzeichnis zugreifen können.Antworten:
Versuchen Sie , einen Shell-Befehl über auszuführen,
sudo
anstatt ihn direkt zu übergeben. Zum Beispiel machen Sie so etwas wie:Natürlich ist dies ein albernes Beispiel, da man es einfach ausführen könnte
sudo ls -al /root
, aber hoffentlich bringt es den Punkt rüber.Das Ausführen eines Shell-Befehls ist weitaus expliziter als das Übergeben eines Befehls an die
sudo
Verwendung des-i
Flags, da dadurch die demroot
Benutzer auf einem bestimmten System zugewiesene Shell ausgeführt wird. Darüber hinaus werden mögliche Probleme mit Login-Ressourcendateien desroot
Benutzers vermieden.Bash (oder Ihre bevorzugte Shell) sollte den
=
Charakter korrekt analysieren . Ich habe dies auf Vollständigkeit geprüft und bin auf keine Probleme gestoßen. Wenn dies nicht der=
Fall ist, schließen Sie es einfach mit einem vorangestellten\
Zeichen ab.quelle