목표: 모든 사용자가 시작할 수 있는 시스템 서비스를 설치합니다. 문제는 사용자 서비스를 sudo
설치(사용)하는 단계로 활성화(아니요) 하는 것입니다 sudo
.
에 서비스 파일을 넣었습니다 /etc/systemd/user/
. 이것은 필수입니다 sudo
.
그러면 sudo systemctl --user enable my_service
작동하지 않습니다. 슈퍼유저는 사용자를 위해 서비스를 활성화할 수 없으며 오직 사용자만 그렇게 할 수 있습니다.
sudo make install
문제: 이 서비스를 내 프로젝트의 일부로 설치하고 싶습니다 . sudo
서비스 파일을 복사하기 위해 여기에 필요합니다 /etc/systemd/user/
. 이 설치 단계에서 사용자 서비스도 활성화하여 사용자가 활성화하지 않고도 시작할 수 있도록 하고 싶습니다.
내가 생각할 수 있는 솔루션은 다음과 같습니다.
- 이후에 설치 프로그램이 추가 활성화 단계를 수행해야 합니다(Sudo 없이)
sudo make install
. - 설치 단계의 일부로 활성화 단계를 실행하고
sudo -E -u $USER systemctl...
.required 를 사용하여-E
도달합니다DBUS_SESSION_BUS_ADDRESS
(사용자의 systemctl에 필요함). 문제는 설치 명령도 필요하다는 점인데-E -u $USER
, 이는 이례적이다. - 실패하면 사용자에게
enable
서비스를 실행하라는 메시지가 표시됩니다.start
- 어떻게든 해당 단계에 대한 권한을 포기합니다
enable
. 방법을 모르겠습니다.
이것이 일반적인 사용 사례가 되어야 할 것 같습니다. 사람들은 일반적으로 이 문제를 어떻게 해결합니까?
답변1
모든 사용자를 위한 systemd 사용자 서비스 설치
모든 사용자를 위한 systemd 사용자 서비스를 설치하려면 .service
아래 나열된 폴더 중 하나에 유닛 파일을 배치 하면 됩니다.사용자 단위 검색 경로존재하다man systemd.unit(5)
. 중요한 것은:
/etc/systemd/user/*
(일반적으로 시스템 관리자가 사용하도록 고안됨)/usr/lib/systemd/user/*
(일반적으로 설치된 패키지에서 사용될 것으로 예상됩니다)
sudo
이러한 서비스 파일을 이러한 폴더에 설치하려면 일반적으로 /root 권한이 필요합니다 .
모든 사용자에 대해 시스템 사용자 서비스 활성화
모든 사용자에 대해 서비스를 활성화하려면 /root 권한이 필요한 --global
with 와 같은 systemctl 플래그를 사용할 수 있습니다.systemctl --global enable
sudo
--global
활성화 및 비활성화와 함께 사용하면 전역 사용자 구성 디렉터리에서 작동하여 모든 사용자의 향후 모든 로그인에 대해 전역적으로 장치 파일을 활성화하거나 비활성화합니다.
에서 가져옴
man systemctl(1)
systemctl preset
대신 사용systemctl enable
사용을 고려해 볼 수도 있습니다.systemctl preset
바꾸다 systemctl enable
. systemctl enable
없는 한 과 동일하게 작동합니다 .시스템 기본 파일disable my-service.service
이 경우 교체됩니다 라는 줄이 있습니다 systemctl disable
.
이를 통해 사용자/관리자는 서비스를 자동으로 활성화할지 여부를 결정할 수 있습니다. 예를 들어 Fedora에는 disable *
기본값이 있으므로 Fedora의 모든 시스템 서비스는아니요설치 중에 기본적으로 활성화됩니다.
그런데 일반적으로 systemd 서비스는 프로젝트의 Makefile이 아니라 패키지 관리자에 의해 설치/활성화됩니다.
예를 들어 .deb
Debian/Ubuntu용 서비스 파일을 이미 생성한 경우 systemd 사용자 서비스 파일을 추가하고 활성화하는 것은 sudo apt install ./my-deb
패키지에 이름이 지정된 파일을 생성하는 것만큼 간단합니다. debian/my-package.user.service
그 다음에dh_installsystemduser
패키지를 설치할 때 자동으로 설치 및 활성화는 물론 제거/비활성화도 처리합니다.
답변2
모든 사용자 또는 특정 사용자에 대해 특정 "sudo-less" 명령 실행을 활성화하면 이를 달성할 수 있습니다. 문제의 명령은 다음과 같습니다 systemctl enable <my_service>
. 지침을 따르기 전에 이 기사를 읽어 보시기 바랍니다 $ man 5 sudoers
.
이 작업은 두 가지 방법으로 수행할 수 있습니다.
/etc/sudoers
특정 명령을 사용하여 편집하십시오:$ sudo visudo
. 참고: 엉망으로 만들면 호스팅이 손상되거나 액세스할 수 없게 될 수도 있습니다sudo
. 편집할 내용은 아래와 같습니다.- 파일 만들기:
$ sudo visudo -f /etc/sudoers.d/my_service
내용은 나중에 자세히 설명하겠습니다. 이는 위의 직접 수정만큼 미묘하다는 점에 유의하세요/etc/sudoers
./etc/sudoers.d/
파일을 편집하는 것보다 삭제/etc/sudoers
하면sudo
시스템 업데이트 프로세스 전반에 걸쳐 지속되는 정책 수정이 생성된다는 이점이 있습니다 .sudoers
편집할 내용은 다음과 같습니다.
ALL <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>
이 경우 (사용자)는 를 사용하지 않고도 ALL
호스트에서 명령을 실행(및 실행)할 수 있습니다 .<your_host_name>
sudo
한 명의 사용자에 대해서만 이 작업을 수행하려면 ALL
해당 사용자 이름을 바꾸십시오. 둘 다 아닌 경우(즉, ALL
하나의 사용자 이름이 아니라 여러 사용자 이름) 사용자 별칭을 만들어 sudo-less cmd를 실행할 수 있는 권한이 있는 사용자 이름을 집계합니다. 이 경우 추가한 한 줄은 두 줄이 됩니다.
User_Alias <systserv_enable_users> = Kamela, bkd12, Oliver, Gauthier
<systserv_enable_users> <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>
이 줄이나 다음 줄을 직접 추가하려면 /etc/sudoers
다음 줄 위에 추가하세요.
@includedir /etc/sudoers.d
HTH.