사용자 공간 프로그램은 어디에 로그를 저장해야합니까? 권한없이 실행하려는 스크립트를 작성 중입니다. 스크립트에서

권한없이 실행하려는 스크립트를 작성 중입니다. 스크립트에서 발생한 오류가 일부 로그 파일에 기록되기를 원합니다. 에 쓸 수있는 권한이 없습니다 /var/log. 그리고 나는 내 홈 디렉토리에 하나를 갖고 싶지 않습니다.

사용자 공간 스크립트가 런타임 정보를 기록 할 수있는 위치가 있습니까? /var/log잠재적 인 보안 문제없이 스크립트 로그 정보를 작성 하는 가장 좋은 방법은 무엇입니까 ? 스크립트에 uid / gid를 설정하는 것을 망설입니다.



답변

일반 사용자로 / var / log에 쓸 수는 없지만 syslog 데몬이 요청하면이를 수행합니다. 표준 시스템 로그 (예 /var/log/syslog:)에 메시지를 기록하려면 시스템 에서 4.4BSD 유틸리티를 logger사용할 수 있습니다. 기본적으로 데비안에 설치되어 bsdutils있으며 데비안 파생 패키지에 있습니다.

시스템 로그 를 읽을 수 있는 권한이 필요 하지 않고 스크립트 메시지를 다른 프로그램의 메시지와 혼합 해야한다는 단점이있는 기존의 모든 로그 회전, 유지 관리 및 모니터링 도구 를 활용할 수 있습니다.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

사용 가능한 몇 가지 구성 옵션이 있습니다. 에서 더 많은 내용을 읽을 수 있습니다 man logger.


답변

일반 사용자로서 프로그램을 실행하기로 결정한 경우, 로그의 자연스러운 위치는 홈 디렉토리에 있습니다. 홈 디렉토리는 사용자가 실행하는 프로그램의 로그이든 다른 파일이든 관계없이 모든 파일을 저장하기위한 것입니다.

프로그램이 시스템의 일부로 실행되고 일반적으로 전용 시스템 사용자로 실행되는 경우 로그의 자연스러운 위치는입니다 /var/log. 서브 디렉토리를 작성하고 /var/log/myapp응용 프로그램이 해당 디렉토리에 쓸 수 있도록 적절한 권한을 부여하십시오.

관련성이 있고 운영 체제에서 허용하는 경우 로그 파일을 추가 전용으로 표시하십시오. 오직 루트 만이 이것을 할 수 있습니다. 이는 응용 프로그램이 손상되면 과거의 로그를 지울 수 없으므로 손상에 대한 법 의학적 분석에 매우 유용합니다. 로그를 회전하려면 루트의 개입이 필요 chown합니다. 로그 파일을 더 이상 응용 프로그램, rename로그 파일에서 열 수 없도록 하고 적절한 소유권을 가진 새 추가 전용 파일을 만든 다음 새 빈 파일을 열도록 응용 프로그램에 알리십시오. .

당신은 호출하여 시스템 로그에 대한 응용 프로그램 로그를 만들 수 있습니다 logger(1)또는 syslog(3).


답변

일반적으로 데몬의 경우 로그 파일이 생성되고 root권한이없는 사용자가 쓸 수 있도록 권한이 변경됩니다. logrotate그런 다음 회전 중에 권한을 유지하도록 설정됩니다.

데몬이 아닌 명령 인 경우 /tmp(바람직하게 사용 mktemp) STDOUT에 로그인하고 로그가 어디로 갔는지 사용자에게 알리십시오 .


답변

사용자 공간 프로그램은 기본적으로 로그를 버릴 것으로 예상됩니다. 다양한 프로그램이 원하는 곳에서 로그를 덤프하는 것을 보았습니다. 특히 내 시스템에서는 결코 환영받지 않습니다. 거대해질 때까지는 눈에 띄지 않는 어떤 위치에 쌓이는 경향이 있습니다.

나는 그들에게 명확한 장소가 있다면 선호합니다. 나는 그들을 위해 안정된 장소를 찾으려고 노력하고 있습니다.

내 첫 번째 아이디어는을 사용하는 /var/run/user/$UID/log것이었지만 내 시스템에서는 TMPFS 마운트이거나 충분히 크지 않거나 로그와 함께 사용하기에 적합하다는 것을 알았습니다.

그들을위한 장소를 만드십시오

/ var / run / user를 잘 이해할 수 없기 때문에 사용자 1000을 위해 수동으로 에뮬레이션하기로 선택했습니다.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

이 폴더 내의 구조에 대해 FHS / var / log spc 를 고수하는 것이 좋지만 사양이 자유 형식이므로 준수하지 않아도됩니다.

Logrotate 구성

시스템에서 제공 한이 디렉토리에는 기존 로그 순환이 없습니다. 시스템에 대한 로그 순환을 생성하는 것이 좋습니다.

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

아래는 이전의 / var / run / user / 1000 / log 게시물입니다. 실제로 무엇을하는지 알지 못한다면 추천 할 수 없습니다 (그렇게하면 방법도 알려주십시오!)

어쩌면 다음과 같이 할 수 있지만, 나는 이것이 의미가 있기 때문에 이것을 만들었습니다.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

/ var / log / user / 1000과 통합 :

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log