为什么编辑 core_pattern 受到限制?

为什么编辑 core_pattern 受到限制?

这个问题与安装了 abrt-hook-cpp 的核心文件在哪里?

当我尝试为故意崩溃的程序生成核心文件时,起初核心文件生成似乎受到 abrt-ccpp 的阻碍。所以我尝试/proc/sys/kernel/core_pattern用vim手动编辑:

> sudo vim /proc/sys/kernel/core_pattern

当我尝试保存文件时,vim 报告了以下错误:

"/proc/sys/kernel/core_pattern" E667: Fsync failed

我以为这是权限问题,于是尝试更改权限:

> sudo chmod 666 /proc/sys/kernel/core_pattern
chmod: changing permissions of '/proc/sys/kernel/core_pattern\': Operation not permitted

最后,基于这个帖子,我尝试过这个:

>sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'

这有效。

基于工作解决方案,我也尝试了这些,但失败了:

> 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

问题

为什么编辑、chmoding 和将echo输出重定向到文件/proc/sys/kernel/core_pattern都失败,并且只有指定的调用sudo bash...能够覆盖/编辑文件?

问题

具体来说,关于上述失败尝试中的调用尝试sudo:为什么失败?我认为sudo使用 root 权限执行后续命令,我认为这可以让你在 Linux 中执行任何操作。

答案1

procfs 中的条目由临时代码管理。将设置/proc/sys(下的文件的权限和所有权) 的代码proc_sys_setattr) 拒绝使用 EPERM 更改权限和所有权。因此不可能更改这些文件的权限或所有权,完全停止。此类更改尚未实施,因此成为 root 并没有帮助。

当您尝试以非 root 用户身份写入时,您会收到权限错误。即使使用sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern,您也尝试以非 root 用户身份进行编写:以 root 身份sudo运行echo,但重定向发生在sudo执行的 shell 中,并且该 shell 没有提升的权限。使用sudo bash -c '… >…',重定向是在由 root 启动sudo并以 root 身份运行的 bash 实例中执行的,因此写入成功。

只允许 root 设置kernel.core_patternsysctl 的原因是它允许指定命令,并且由于这是全局设置,因此任何用户都可以执行该命令。事实上,所有 sysctl 设置都不同程度地存在这种情况:它们都是全局设置,因此只有 root 可以更改它们。kernel.core_pattern只是一个特别危险的案例。

答案2

在 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覆盖了我所做的任何更改。我卸载apportsudo apt-get remove apport,然后使用了我的更改。

答案3

在 Ubuntu 16.04 LTS 上,

 sudo bash -c 'echo /home/user/foo/core.%e.%p > /proc/sys/kernel/core_pattern'

失败了

No such file or directory

我必须跑

sudo sysctl -w kernel.core_pattern=/home/user/foo/core.%e.%p

相关内容