我运行的进程有时会生成核心文件,并且该文件具有以下文件权限:
server:~ # ls -l /mnt/process/core/core_segfault
-rw------- 1 root root 245760 Dec 2 11:29 /mnt/process/core/core_segfault
问题是只有root
用户可以打开它进行调查,而我希望有权访问它的每个人都能够阅读它,而无需我总是手动设置权限。
我怎样才能将默认权限设置为类似-RW-RW-RW-?
答案1
由于核心文件包含进程崩溃时的完整内存布局,因此它们可能包含敏感信息。因此,创建核心文件时,其所有权设置为进程崩溃时的 uid,并且权限设置相当严格。没有可以轻易更改的设置。
然而,你什么能要做的是将kernel.core_pattern
sysctl 设置设置为程序(必须以管道字符 开头|
)。当核心文件生成时,内核将调用该程序,而不是将其转储到磁盘。该程序应该能够生成具有您想要的权限的核心文件。
执行此操作的程序示例有systemd-coredump
和apport
。
答案2
这对我有用:它使每个人都可以读取该文件,644 而不是 600。阅读后沃特评论。
sudo bash -c 'echo "|/usr/bin/env tee /proc/%P/cwd/core.%h.%e.%p" \
> /proc/sys/kernel/core_pattern'
细节
如果您想扩展该解决方案,请阅读下面的限制。要对您的脚本进行故障排除,请使用dmesg
以下位置查看内核日志$LINUX/fs/coredump.c::do_coredump
请注意,引号已从 core_pattern 命令中删除,该命令的所有参数均以空格分隔,因此我无法运行多个命令:
bash -c "echo 1; echo 2"
将失败,因为它只接收回显(第一个参数)echo 1; echo 2
也会失败,回显1;
、echo
和2
。使用&&
或|
甚至所需的内容也是如此>
,因此您无法猫。红帽推荐在绝对路径中创建脚本。
从man 5 core
- 必须使用绝对路径名(或相对于根目录的路径名 /)指定程序,并且必须紧跟在“|”之后特点。
- 该进程以其当前工作目录作为根目录开始。如果需要,可以通过使用 %P 说明符提供的值通过 /proc/[pid]/cwd 更改为转储进程的位置来更改转储进程的工作目录。
- 从内核 5.3.0 开始,在扩展模板参数之前,管道模板会按空格分割成参数列表。