Der Befehl sudo mit dem Gleichheitszeichen (=) wird für die Umgebungsvariable verwechselt

1

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!

redood
quelle
cd / tmp; Sudo bla bla?
Mcalex
Ich würde versuchen, mit dem üblichen Doppelstrich das --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.
mpy
mclex - eine gute Idee, aber für einige Befehle muss cdsudo verwendet werden, da nicht privilegierte Benutzer sonst nicht auf das Verzeichnis zugreifen können.
Redood
mpy - Ich habe deine Idee nicht gründlich getestet (da ich bereits die Antwort von daBeamer befolgt habe), aber mit einem einfachen Test scheint es auch zu funktionieren. Danke
redood

Antworten:

0

Versuchen Sie , einen Shell-Befehl über auszuführen,sudo anstatt ihn direkt zu übergeben. Zum Beispiel machen Sie so etwas wie:

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

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 sudoVerwendung des -iFlags, da dadurch die dem rootBenutzer auf einem bestimmten System zugewiesene Shell ausgeführt wird. Darüber hinaus werden mögliche Probleme mit Login-Ressourcendateien des rootBenutzers 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.

daBeamer
quelle
Ich bin mir nicht sicher, warum ich nicht daran gedacht habe, aber es funktioniert! Danke :)
redood