Entri dalam procfs dikelola oleh kode ad hoc. Kode yang akan menetapkan izin dan kepemilikan pada file di bawah /proc/sys
(proc_sys_setattr
) menolak perubahan izin dan kepemilikan dengan EPERM. Jadi tidak mungkin mengubah izin atau kepemilikan file-file ini, berhenti sepenuhnya. Perubahan seperti itu tidak diterapkan, jadi menjadi root tidak membantu.
Saat Anda mencoba menulis sebagai pengguna non-root, Anda mendapatkan kesalahan izin. Bahkan dengan sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
, Anda mencoba menulis sebagai pengguna non-root:sudo
menjalankan echo
sebagai root, tetapi pengalihan terjadi di shell tempat sudo
dieksekusi, dan shell itu tidak memiliki hak istimewa yang lebih tinggi. Dengan sudo bash -c '… >…'
, pengalihan dilakukan dalam instance bash yang diluncurkan oleh sudo
dan yang dijalankan sebagai root, sehingga penulisan berhasil.
Alasannya hanya root yang harus diizinkan untuk mengatur kernel.core_pattern
sysctl adalah memungkinkan perintah untuk ditentukan dan, karena ini adalah pengaturan global, perintah ini dapat dijalankan oleh pengguna mana pun. Ini sebenarnya kasus untuk semua pengaturan sysctl ke berbagai tingkatan:semuanya adalah pengaturan global, jadi hanya root yang dapat mengubahnya. kernel.core_pattern
hanyalah kasus yang sangat berbahaya.
Di Ubuntu 18.04 saya dapat memperbarui polanya dengan:
sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
Saya juga dapat memperbarui /etc/sysctl.conf
dan tambahkan baris:
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
Namun, meskipun tidak ada baris lain yang mengatur kernel.core_pattern
di /etc/sysctl.conf
atau /etc/sysctl.d/*
, setelah saya mem-boot ulang pola disetel ke nilai default lagi:
$ sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
Ternyata apport
adalah over-menulis setiap perubahan yang saya buat. Saya menghapus apport
dengan sudo apt-get remove apport
dan kemudian perubahan saya digunakan.