Diese Frage steht im Zusammenhang mit Wo ist die Kerndatei mit installiertem abrt-hook-cpp? .
Während ich versuchte, eine Core-Datei für ein absichtlich abstürzendes Programm zu generieren, schien die Generierung der Core-Datei zunächst durch abrt-ccpp behindert zu werden. Also habe ich versucht, /proc/sys/kernel/core_pattern
manuell zu bearbeiten mit vim:
> sudo vim /proc/sys/kernel/core_pattern
Als ich versuchte, die Datei zu speichern, meldete vim diesen Fehler:
"/proc/sys/kernel/core_pattern" E667: Fsync failed
Ich dachte, das sei ein Berechtigungsproblem, also habe ich versucht, die Berechtigungen zu ändern:
> sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern': Operation not permitted
Schließlich habe ich basierend auf diesem Beitrag Folgendes versucht:
>sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'
Das hat funktioniert.
Basierend auf der funktionierenden Lösung habe ich auch diese ausprobiert, die fehlgeschlagen sind:
> echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
>
> sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
-bash: /proc/sys/kernel/core_pattern: Permission denied
Frage :
Warum diese Bearbeitung, chmod
ing und Umleitung von echo
Ausgabe in die Datei /proc/sys/kernel/core_pattern
alles fehlgeschlagen, und nur der notierte Aufruf von sudo bash...
konnte die Datei überschrieben/bearbeitet werden?
Frage :
Insbesondere bezüglich der Versuche, sudo
aufzurufen bei den gescheiterten Versuchen oben:Warum sind sie gescheitert? Ich dachte sudo
führte den folgenden Befehl mit Root-Rechten aus, von denen ich dachte, dass Sie unter Linux alles tun können.
Akzeptierte Antwort:
Einträge in procfs werden per Ad-hoc-Code verwaltet. Der Code, der Berechtigungen und Besitzrechte für die Dateien unter /proc/sys
festlegen würde (proc_sys_setattr
) lehnt Änderungen von Berechtigungen und Eigentumsrechten mit EPERM ab. Es ist also nicht möglich, die Berechtigungen oder den Besitz dieser Dateien zu ändern, Punkt. Solche Änderungen werden nicht implementiert, also hilft es nicht, root zu sein.
Wenn Sie versuchen, als Nicht-Root-Benutzer zu schreiben, erhalten Sie einen Berechtigungsfehler. Sogar mit sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
, versuchen Sie, als Nicht-Root-Benutzer zu schreiben:sudo
führt echo
aus als root, aber die Umleitung erfolgt in der Shell, von der aus sudo
ausgeführt wird und diese Shell keine erhöhten Rechte hat. Mit sudo bash -c '… >…'
, wird die Umleitung in der Bash-Instanz durchgeführt, die von sudo
gestartet wird und die als root ausgeführt wird, sodass das Schreiben erfolgreich ist.
Der Grund:Nur root muss berechtigt sein, das kernel.core_pattern
zu setzen sysctl besteht darin, dass ein Befehl angegeben werden kann, und da dies eine globale Einstellung ist, kann dieser Befehl von jedem Benutzer ausgeführt werden. Dies ist in der Tat für alle sysctl-Einstellungen in unterschiedlichem Maße der Fall:Sie sind alle globale Einstellungen, sodass nur root sie ändern kann. kernel.core_pattern
ist nur ein besonders gefährlicher Fall.