Wenn ich sudo verwende, um Änderungen an Dateien zuzulassen, wird mir regelmäßig die Berechtigung verweigert.
Zum Beispiel ist meine Maus unruhig und träge, deshalb 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 erhalte dann:
bash: /etc/modprobe.d/local.conf: Permission denied
Daher habe ich versucht, eine vorübergehende Änderung vorzunehmen, um die Abfrage zu deaktivieren.
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
Das System antwortete erneut mit:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
Irgendwelche Ideen?
command-line
bash
sudo
Jack
quelle
quelle
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
als sudo ausführen , es sei denn, Sie tun etwas Ähnlichessudo bash -c 'echo …'
. POSIX-Systeme stellen jedoch in der Regel einen externenecho
Befehl bereit, z. B./bin/echo
unter OS X, den sudo ohne rigamarole ausführen kann. Daher sind derecho
Befehl , den Sie normalerweise ausführen, und derecho
Befehl, den Sie mit sudo ausführen, wahrscheinlich zwei verschiedene, aber ähnliche Befehle.Die Ausgabeumleitung erfolgt über die Shell, von der aus der Befehl aufgerufen wurde . Also, brechen Sie alles in Stücke, hier, was passiert *:
Shell ruft auf
sudo echo "options drm_kms_helper poll=N"
, diesudo
Befehl mit derecho "options drm_kms_helper poll=N"
Befehlszeile ausführtsudo fragt nach einem Passwort, öffnet die Superuser-Shell und ruft auf
echo "options drm_kms_helper poll=N"
, wodurch derecho
Befehl ausgeführt wird, der sie übergibt"options drm_kms_helper poll=N"
echo wird mit
root
Berechtigungen ausgeführt und druckt die Zeichenfolge auf die Standardausgabe.echo
Befehl wird beendet, Superuser-Shell wirdsudo
beendet , beendetDie Shell, von der aus der Befehl aufgerufen wurde, sammelt die Ausgabe und versucht sie umzuleiten.
/etc/modprobe.d/local.conf
Diese kann nur von root geschrieben werden. Es wird der Fehler "Berechtigung verweigert" ausgegeben.Informationen zur Behebung dieses Problems finden Sie unter @shantanu answer.
(*) - Während die obige Sequenz hilft zu verstehen, warum der Befehl fehlschlägt, passieren die Dinge in Wirklichkeit etwas in der falschen Reihenfolge: Die ursprüngliche Shell bemerkt die Umleitung und versucht, die Datei zum Schreiben zu öffnen, bevor sie den
sudo ...
Befehl aufruft . Wenn das Öffnen der Datei fehlschlägt, ruft die Shell nicht einmal den Befehl auf, der in die Datei schreiben sollte (danke an @PanosRontogiannis für diesen Hinweis).Hier ist ein kurzer Test:
Im obigen Test
whoami | tee who.txt
wurde eine Dateiwho.txt
mit dem Namen "root" erstellt. Wenn jedoch die Ausgabeumleitung in der aufrufenden Shell fehlschlägt, fehlt auch die Datei "who.txt", da der Befehl nicht aufgerufen wurde.quelle
Hinzufügen zu Shantanus Antwort:
... Oder Sie könnten einen
tee
Befehl wie diesen verwenden:oder wenn es eine Befehlsausgabe ist:
quelle
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
wenn Sie nicht möchten, dass es auch gedruckt wirdstdout
.Ein Ansatz, den ich hier nicht gesehen habe, besteht darin, einfach die gesamte Befehlszeile in einer eigenen Shell auszuführen. Die
sudo
Manpage selbst gibt ein Beispiel für diesen Ansatz:quelle
Eine andere Möglichkeit ist die Verwendung einer temporären Datei. Dies ist in einem Bash-Skript nützlich.
quelle
sudo dd of=
So hängen Sie an, wie Sie möchten:
oder um die Datei von Grund auf neu zu erstellen:
Vorteile:
tee
da keine/dev/null
umleitungsh
da keine explizite subshell (aber eine implizite für die umleitung)dd
hat viele leistungsstarke Optionen, z. B.status=progress
um den Übertragungsfortschritt zu sehenFunktioniert, weil sudo stdin an den Befehl weiterleitet.
quelle
dd
wie wir unsere einst so tollen Dateisysteme überschreiben und nicht erkennen, dass dies auch für alltägliche Aufgaben gedacht ist - und dass andere Befehle als root ebenfalls großen Schaden anrichten, wenn sie auf den falschen Dateien / Geräten verwendet werden. Wiesudo tee
,sudo dd
wird natürlich auch mit der Arbeit hier Strings , zum Beispielsudo dd of=outfile <<<'hello world'
. [Danke für die Bearbeitung. NB withsh -c 'cmd'
,sh
ist ein Subprozess, der eine Shell ist, aber nicht wirklich eine Subshell, außer in dem Sinne, dass alle externen Befehle als eins beginnen.]