Záznamy v procfs jsou spravovány ad hoc kódem. Kód, který by nastavil oprávnění a vlastnictví souborů pod /proc/sys
(proc_sys_setattr
) odmítá změny oprávnění a vlastnictví s EPERM. Takže není možné změnit oprávnění nebo vlastnictví těchto souborů, tečka. Takové změny nejsou implementovány, takže být root nepomůže.
Při pokusu o zápis jako uživatel bez oprávnění root se zobrazí chyba oprávnění. I s sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
, pokoušíte se zapsat jako uživatel bez oprávnění root:sudo
běží echo
jako root, ale k přesměrování dojde v shellu, ze kterého sudo
je spuštěn a tento shell nemá žádná zvýšená oprávnění. S sudo bash -c '… >…'
, přesměrování se provádí v instanci bash, kterou spouští sudo
a který běží jako root, takže zápis proběhne úspěšně.
Důvod, proč pouze root musí mít povoleno nastavit kernel.core_pattern
sysctl spočívá v tom, že umožňuje zadat příkaz, a protože se jedná o globální nastavení, může tento příkaz provést kterýkoli uživatel. To je ve skutečnosti případ všech nastavení sysctl v různé míře:všechna jsou globální nastavení, takže je může změnit pouze root. kernel.core_pattern
je jen zvlášť nebezpečný případ.
Na Ubuntu 18.04 mohu aktualizovat vzor pomocí:
sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
Mohu také aktualizovat /etc/sysctl.conf
a přidejte řádek:
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
I když však nejsou žádné další řádky nastavení kernel.core_pattern
v /etc/sysctl.conf
nebo /etc/sysctl.d/*
, po restartu se vzor znovu nastaví na výchozí hodnotu:
$ sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
Ukázalo se, že apport
přepsal všechny změny, které jsem provedl. Odinstaloval jsem apport
s sudo apt-get remove apport
a poté byly použity mé změny.