내가 실행하는 프로세스는 때때로 코어 파일을 생성하며 파일에는 다음과 같은 파일 권한이 있습니다.
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
이것은 나에게 효과적입니다. 600 대신 644를 사용하여 모든 사람이 파일을 읽을 수 있게 만듭니다. 읽고 나서와트 댓글.
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(첫 번째 매개변수)만 수신하기 때문에 실패합니다.echo 1; echo 2
또한 실패하고1;
에코echo
됩니다2
. 고양이를 잡을 수 없도록 사용되거나&&
필요한|
것에도 동일하게 적용됩니다.>
레드햇에서 추천하는절대 경로에 스크립트를 만듭니다.
~에서man 5 core
- 프로그램은 절대 경로 이름(또는 루트 디렉터리 /에 대한 상대 경로 이름)을 사용하여 지정해야 하며 "|" 문자 바로 뒤에 와야 합니다.
- 프로세스는 현재 작업 디렉터리를 루트 디렉터리로 시작합니다. 원하는 경우 %P 지정자와 함께 제공된 값을 사용하여 /proc/[pid]/cwd를 덤프 프로세스 위치로 변경하여 덤프 프로세스의 작업 디렉터리를 변경할 수 있습니다.
- 커널 5.3.0부터 파이프라인 템플릿은 템플릿 매개변수가 확장되기 전에 매개변수 목록으로 공간 분할됩니다.