procfs のエントリは、アドホック コードによって管理されます。 /proc/sys
の下のファイルにパーミッションと所有権を設定するコード (proc_sys_setattr
) は、EPERM による権限と所有権の変更を拒否します。したがって、これらのファイルのパーミッションまたは所有権を完全に変更することはできません。そのような変更は実装されていないため、root であっても役に立ちません。
root 以外のユーザーとして書き込もうとすると、権限エラーが発生します。 sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern
でも 、root 以外のユーザーとして書き込もうとしています:sudo
echo
を実行します ルートとして、しかしリダイレクトは sudo
からのシェルで発生します が実行され、そのシェルには昇格された特権がありません。 sudo bash -c '… >…'
で 、リダイレクトは sudo
によって起動される bash インスタンスで実行されます これは root として実行されるため、書き込みは成功します。
kernel.core_pattern
の設定を root だけに許可する必要がある理由 sysctl は、コマンドを指定できるようにすることです。これはグローバル設定であるため、このコマンドはどのユーザーでも実行できます。実際、これはさまざまな程度のすべての sysctl 設定に当てはまります。これらはすべてグローバル設定であるため、ルートのみが変更できます。 kernel.core_pattern
特に危険なケースです。
Ubuntu 18.04 では、次のようにパターンを更新できます:
sudo bash -c 'echo "/data/app_crash/%t.%e.core.%p" > /proc/sys/kernel/core_pattern'
/etc/sysctl.conf
も更新できます 次の行を追加します:
kernel.core_pattern = /data/app_crash/%t.%e.core.%p
ただし、 kernel.core_pattern
を設定する行は他にありませんが、 /etc/sysctl.conf
で または /etc/sysctl.d/*
、再起動後、パターンは再びデフォルト値に設定されます:
$ sudo sysctl -a | grep kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P
apport
であることが判明しました 私が行った変更を上書きしていました。 apport
をアンインストールしました sudo apt-get remove apport
で その後、私の変更が使用されました。