모든 서비스에 대해 전역 환경 변수를 설정하는 방법은 무엇입니까?

모든 서비스에 대해 전역 환경 변수를 설정하는 방법은 무엇입니까?

DefaultEnvironment=in 을 사용하면 가능하다는 것을 보았습니다 /etc/systemd/system.conf. 그러나 표현식 확장을 사용할 수 있는지 잘 모르겠습니다 PATH=$PATH:/whatever/path.

그렇다면 글로벌 기본 서비스 환경은 어떻게 설정해야 할까요?그리고표현 확장?

답변1

PATH장치에서 쉘 명령을 호출하는 경우 설정이나 다른 위치에 대한 다른 답변이 작동할 수 있습니다 . /etc/environment그러나 다음을 실행하려고 하면:

ExecStart=mycommand

mycommand그리고 에서 내보내 려고 하면 $PATH작동하지 않습니다. 이러한 문제를 해결하는 systemd데는 사용되지 않습니다 . $PATH컴파일 타임에 정의된 경로 목록을 사용합니다.

~에서시스템 서비스:

명령이 전체(절대) 경로가 아닌 경우 컴파일 타임에 결정된 고정 검색 경로를 사용하여 전체 경로로 확인됩니다. 검색된 디렉토리에는 분할 /usr/bin/ 및 /bin/ 디렉토리를 사용하는 시스템의 /usr/local/bin/, /usr/bin/, /bin/, 분할 bin/ 및 /bin/ 디렉토리를 사용하는 시스템의 /usr/local/bin/이 포함됩니다. sbin/ sbin/ 해당 디렉토리. 따라서 실행 파일이 "표준" 디렉터리에 있는 경우에만 실행 파일 이름을 사용하는 것이 안전하고, 다른 경우에는 절대 경로를 사용해야 합니다. 모호함을 피하기 위해 절대 경로를 사용하는 것이 좋습니다. 팁: 이 검색 경로를 쿼리할 수 있습니다 systemd-path search-binaries-default.

모범 사례는 Exec*=필드를 사용할 때 절대 경로를 사용하는 것입니다. 이렇게 하면 필요성이 없어지고 $PATH누군가 몰래 다른 곳에 바이너리를 추가하더라도 서비스 동작이 변경되지 않습니다 /usr/local/bin. 일반적으로 템플릿이 아닌 서비스는 동적(로컬 환경에 따라 콘텐츠나 의도를 변경하도록 설계)으로 설계되지 않았습니다.

답변2

이를 수행할 수 있는 장소가 여러 군데 있습니다.

systemd 매뉴얼 페이지는 시도하는 방식으로 경로에 추가할 수 있음을 나타내지 않습니다. 또한 다른 메커니즘이 경로를 대체하여 system.conf에서 값을 지울 수 있습니다. 또한 경로가 비어 있는 경우 이 방법으로 경로에 추가하려고 하면 경로에 "."로 변환되는 빈 디렉터리가 남게 되며 경로에 현재 디렉터리를 포함하는 것은 안전한 취약점으로 간주됩니다. , 어쨌든 이것은 아마도 나쁜 생각일 것입니다.

systemd를 사용하고 있으므로 아마도 pam_env도 사용하고 있을 것입니다. 이 도구는 및 에서 환경 변수를 설정하며 /etc/environment이러한 /etc/security/pam_env.conf변수는 변수 대체를 지원하지만 보안 취약점에 대한 위의 참고 사항을 참조하세요.

글로벌 서비스에 대한 변수를 설정하고 싶다고 하셨습니다. 그러나 쉘용으로 설정하려는 경우 /etc/profile.d/sh, bash, zsh 및 아마도 다른 것(csh는 아님)에서 작동하는 것을 추가할 수 있습니다. 이 디렉터리에 있는 스크립트는 원본이며 경로가 이미 설정되어 있으므로 추가해도 안전합니다. 그러나 이는 로그인 쉘에서만 작동할 수 있습니다.

관련 정보