it-swarm.com.de

Leiten Sie die Ausgabe mit `Sudo` um

Ich habe eine kleine Frage zur Verwendung von Sudo mit Ausgabeumleitung >. Um das IP-Forwrding zu aktivieren, kann jemand den folgenden Befehl verwenden:

echo 1 > /proc/sys/net/ipv4/ip_forward

Wenn Sie diesen Befehl ausführen, wird die Berechtigung verweigert, da dafür Root-Berechtigungen erforderlich sind. Wenn Sie jedoch denselben Befehl mit Sudo ausführen, wird die Berechtigung verweigert. Es scheint, dass die Ausgabeumleitung > nicht die Berechtigungen des vorhergehenden Befehls echo erbt. Ist das richtig?

Als Workaround mache ich:

echo 1 | Sudo tee /proc/sys/net/ipv4/ip_forward

Ist das der beste Weg, es zu tun? Vermisse ich etwas?

Beachten Sie, dass dies ein Beispiel ist und für alle Befehle gilt, die die Ausgabeumleitung verwenden.

30
Khaled

Dein Ansatz mit Sudo tee ist in Ordnung. Eine nette Folge der Verwendung von Sudo tee ist, dass der ausgeführte Befehl vor der Pipe nicht als root ausgeführt wird. Dies ist nützlich, wenn Sie nur die Ausgabe eines Programms benötigen, für das keine Root-Rechte erforderlich sind.

Wenn Sie sich nicht für die Ausgabe des Programms interessieren, das vor der Pipe verwendet wurde (echo 1 in diesem Fall), leiten Sie stdout zu /dev/null um:

echo 1 | Sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null

Das Obige entspricht Sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' mit dem Unterschied, dass echo 1 als root ausgeführt wird.

Wenn Sie eine privilegierte Datei anhängen müssen, können Sie entweder sh -c 'echo 127.0.0.1 local.Host >> /etc/hosts' verwenden oder:

echo 127.0.0.1 local.Host | Sudo tee -a /etc/hosts

Beachten Sie den -a, der für --append steht.

29
Lekensteyn

Eine Lösung ist zu verwenden:

Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

aber dieser erbt keine env-Eigenschaften von der übergeordneten Shell. Sie können ihn also nicht zum Beispiel mit echo $PATH verwenden, um dasselbe Ergebnis zu erzielen, das Sie in Ihrer übergeordneten Shell erzielt hätten (natürlich nur für den Fall, dass Sie Änderungen vornehmen Ihre Pfadeigenschaft).

Mit Sudo -E werden die Umgebungsvariablen beibehalten.

Laut https://wiki.ubuntu.com/DashAsBinSh ist es außerdem besser, sh (ein Symlink zu dash) anstelle von zu verwenden Aufruf mit bash.

Sie könnten dies also folgendermaßen umschreiben:

Sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
8
Michal Bernhard

Normalerweise benutze ich den Trick Sudo bash -c oder mache einfach Sudo -s, um root zu bleiben, und führe dann den Umleitungsbefehl aus.

Der Grund, warum dies nicht funktioniert, ist, dass die Shell zuerst die Umleitung verarbeitet und dann Sudo ausführt. Da Ihre Shell keinen Zugriff auf die Datei hat, schlägt die Umleitung fehl.

6
psusi