Frage Wie löst man "permission denied" bei Verwendung von sudo mit Umleitung in Bash?


Wenn sudo verwendet wird, um Änderungen an Dateien zuzulassen, erhalte ich regelmäßig die Berechtigung verweigert.

Zum Beispiel ist meine Maus nervös und träge, also möchte ich das Polling deaktivieren:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

Ich werde nach einem Passwort gefragt und bekomme dann:

bash: /etc/modprobe.d/local.conf: Permission denied

Also habe ich versucht, eine vorübergehende Änderung vorzunehmen, um die Abfrage zu deaktivieren, indem ich Folgendes benutze:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

Wiederum reagierte das System mit:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

Irgendwelche Ideen?


115
2017-12-19 04:12


Ursprung




Antworten:


Ausgabeumleitung (über die > Operator) wird von der Shell erledigt, nicht von Echo. Sie müssen sich als root anmelden

sudo -i

Dann können Sie die Umleitung verwenden

echo N> /sys/module/drm_kms_helper/parameters/poll

Ansonsten können Sie bash string mit sudo ausführen

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

124
2017-12-19 04:22



Sie können kein Echo mit Sudo ausführen? Was ist mit dem Ergebnis, das ich bekommen habe: saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi - saji89
Sie können auf Datei schreiben, Echo "etwas"> etwas. Es benutzt Rohr. Das ist das Problem. - shantanu
Ok, wenn das der Fall ist, dann aktualisieren Sie bitte Ihre Antwort, um zu reflektieren, dass das laufende Echo nur in diesem Fall ein Problem ist. - saji89
Sie können die eingebaute Shell nicht einfach ausführen echo wie Sudo, außer du machst sowas sudo bash -c 'echo …'; POSIX-Systeme liefern jedoch in der Regel ein externes echo Befehl wie /bin/echo auf OS X, die sudo ohne rigamarole ausführen kann. Und so kam es dass der echo Befehl, den Sie normalerweise ausführen und die echo Befehl, den Sie mit sudo ausführen, sind wahrscheinlich zwei verschiedene, aber ähnliche Befehle. - kojiro
Wenn das der Fall ist, warum haben die Antworten auf diese Frage Echo geliefert? askubuntu.com/questions/840431/ ... - Harsha


Die Ausgabeumleitung erfolgt durch die Shell von dem der Befehl aufgerufen wurde. Also, alles in Stücke zerbrechen, hier was passiert *:

  • Shell ruft auf sudo echo "options drm_kms_helper poll=N", die ausführt sudo Befehl mit echo "options drm_kms_helper poll=N" Befehlszeile

  • sudo fragt nach einem Passwort, öffnet die Superuser-Shell und ruft sie auf echo "options drm_kms_helper poll=N", die läuft echo Befehl übergeben es "options drm_kms_helper poll=N"

  • Echo, läuft mit root Privilegien, druckt die Zeichenkette auf ihre Standardausgabe.

  • echo Befehl beendet, Superuser Shell-Exits, sudo endet

  • Die Shell, von der der Befehl aufgerufen wurde, sammelt die Ausgabe und versucht sie umzuleiten /etc/modprobe.d/local.conf, die nur von root schreibbar ist. Es wird der Fehler "Berechtigung verweigert" angezeigt.

Für die Möglichkeiten, dies zu beheben, siehe @shantanu Antwort.


(*) - Während die obige Sequenz hilft zu verstehen, warum der Befehl fehlschlägt, passieren die Dinge in Wirklichkeit etwas außerhalb der Reihenfolge: Die ursprüngliche Shell bemerkt die Umleitung und versucht, die Datei zum Schreiben zu öffnen, bevor sie den Befehl aufruft sudo ... Befehl. Wenn das Öffnen der Datei fehlschlägt, ruft die Shell nicht einmal den Befehl auf, der in die Datei schreiben sollte (dank @PanosRontogiannis, um dies zu verdeutlichen).

Hier ist ein kurzer Test:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

Im Test über dem whoami | tee who.txt wollte eine Datei namens erstellen who.txt enthält das Wort "root". Wenn jedoch die Ausgabeumleitung in der aufrufenden Shell fehlschlägt, fehlt auch die Datei "who.txt", da der Befehl nicht aufgerufen wurde.


71
2017-12-19 05:19



Wahrscheinlicher ist, dass sich die Shell selbst "verzweigt" und versucht, /etc/modprobe.d/local.conf zu öffnen, bevor sie versucht, sudo "exec" auszuführen, was bedeutet, dass die ersten 4 Schritte, die Sie beschreiben, nie wirklich passieren, weil die Datei nicht geöffnet werden kann. - Panos Rontogiannis
@PanosRontogiannis: danke, ich habe die Antwort aktualisiert - Sergey


Hinzufügen zu Shantanus Antwort:

... Oder du könntest einen benutzen tee Befehl wie folgt:

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

oder wenn es ein Befehl ist:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

55
2017-12-19 06:50



+1 als Root anmelden ist eine schlechte Idee für die manuelle Arbeit, und a Ja wirklich schlechte Idee für Skriptaufgaben. - l0b0
Ebenfalls, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null wenn Sie nicht wollen, dass es druckt stdout auch. - Fabian Tamp


Ein Ansatz, den ich hier nicht erwähnt habe, ist einfach die gesamte Befehlszeile in einer eigenen Shell auszuführen. Das sudo Die Manpage selbst gibt ein Beispiel für diesen Ansatz:

Um eine Verwendungsliste der Verzeichnisse in der Partition / home zu erstellen. Beachten Sie, dass damit die Befehle in einer Subshell ausgeführt werden, damit die CD- und Dateiumleitung funktioniert.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

13
2017-12-19 13:53





sudo dd of=

So fügen Sie an, wie Sie möchten:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

oder um die Datei von Grund auf neu zu erstellen:

echo inbytes | sudo dd of=outfile

Vorteile:

  • schöner als tee seit Nr /dev/null Umleitung
  • schöner als sh da keine explizite Subshell (aber eine implizite für die Umleitung)
  • dd hat viele mächtige Optionen, z.B. status=progress um den Übertragungsfortschritt zu sehen

Funktioniert, weil sudo stdin an den Befehl weiterleitet.


3
2018-05-28 06:39



Das ist gut. Wir denken an dd So wie wir unsere einstmals großartigen Dateisysteme überschreiben und nicht erkennen, dass es auch für alltägliche Aufgaben ist - und dass andere Befehle als root auch großen Schaden anrichten, wenn sie auf den falschen Dateien / Geräten verwendet werden. Mögen sudo tee, sudo dd wird natürlich auch mit arbeiten hier Streicher, z.B., sudo dd of=outfile <<<'hello world'. [Danke für die Bearbeitung. NB mit sh -c 'cmd', sh ist ein Subprozess, der eine Shell ist, aber nicht wirklich eine Subshell, außer in dem Sinne alle externe Befehle beginnen als eins.] - Eliah Kagan


Eine andere Option ist die Verwendung einer temporären Datei. Dies ist nützlich in einem Bash-Skript.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever

2
2017-07-29 15:51