systemctl --user
데스크톱 사용자에게는 잘 작동하는 것 같습니다.
dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0
하지만 www-data 사용자로 동일한 명령을 실행할 때 예상치 못한 응답을 받았습니다.
dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null
Failed to connect to bus: No such file or directory
www-data@dev-VirtualBox:~$ echo $?
1
여기서 어떻게 활성화하나요 systemctl --user
?
우분투 16.04 실행
답변1
이것사용자 인스턴스당systemd는 로그인 프로세스(PAM)의 Hook을 통해 시작되며 pam_systemd
일반 가상/실제 터미널 로그인과 SSH 등을 통한 원격 로그인에 사용됩니다.
로그인하지 않으셨습니다. 특권을 강화하고 있습니다.기존 로그인 세션그리고 sudo su www-data
. (그런데 이것은 중복됩니다. 슈퍼유저로 명령을 실행할 필요 없이 sudo -u www-data
바로 시작됩니다 www-data
.) 아직 후크를 호출하지 않았습니다.
따라서 www-data
systemd의 사용자별 인스턴스는 아직 시작되지 않았으며 systemctl --user
대화할 항목을 찾을 수 없습니다.
수동으로 시작할 수 있습니다.
%sudo install -d -o www-data /run/user/`id -u www-data` % sudo systemctl start user@`id -u www-data`
(잘못된 순서로 수행한 경우 서비스를 중지하고 올바른 순서로 실행하십시오. 잘못된 순서로 실행하면 결국 빈 런타임 디렉토리가 발생하고 D-Bus 및 기타 소켓 파일이 누락되지만 서비스는 실행 중입니다. 클라이언트와 절대 통신하지 않습니다).
한 가지 까다로운 점은 다른 계정의 권한으로 데스크톱 버스 클라이언트 프로그램을 실행할 때 다른 계정의 데스크톱 버스 에이전트와 통신할 수 DBUS_SESSION_BUS_ADDRESS
있도록 변수를 변경해야 한다는 것입니다.systemctl
% sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user
이것이 쉬운 방법입니다. 보다 정교한 접근 방식은 후크가 sudo
호출 되도록 PAM 구성을 조정하는 것입니다 pam_systemd
. 그러나 XDG_RUNTIME_DIR
특히 환경 변수와 관련하여 원하지 않는 부작용이 있을 수 있습니다. 발생한 효과를 견딜 수 있다고 확신하는 경우 에만 이 pam_systemd
대안을 시도하십시오 sudo
.
추가 읽기
- 조나단 데보인 폴라드(2014).사용자 권한을 제거하기 위해 su를 남용하지 마십시오.. 일반적인 답변.
- Lennart Petlinget al. (2017).
pam_systemd
.시스템 매뉴얼 페이지. freedesktop.org.
답변2
그래서 마침내 잃어버린 퍼즐 조각을 찾았습니다. @JdeBP의 훌륭한 팁 덕분에 다음 사항을 확인할 수 있었습니다.
- systemd --user가 www-data를 위해 실행 중입니다.
- 우분투에서는 DBUS_SESSION_BUS_ADRESS가 무시되는 것 같습니다.
- XDG_RUNTIME_DIR이 설정되지 않았습니다.
"/run/user/$UID"를 내보내도록 XDG_RUNTIME_DIR을 설정하면 문제가 해결되었습니다.
예상되는 동작을 얻기 위해 따라야 할 단계는 다음과 같습니다.
% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in
답변3
이것은 매우 추악한 해결 방법입니다.
말했듯이 질문은 다음과 같습니다.
로그인하지 않으셨습니다. 기존 로그인 세션의 권한을 강화하고 있습니다 [...]
그러니 "그냥" 로그인하세요...
서버에 있는 경우 터미널을 사용해야 합니다. 같은 질문을 해야겠어요, 그러나 마침내 발견했습니다. 해결책은 매우 간단합니다. 다음 명령을 실행하여 사용자로 전환하면 됩니다(각각 해당 사용자로 적절한 셸을 실행).
$ sudo machinectl shell --uid www-data
sudo loginctl enable-linger www-data
부팅 시 실행되도록 서비스 등을 시작하려는 경우에도 여전히 유용합니다. 그렇지 않으면 해당 사용자가 "로그인"된 경우에만 실행됩니다.
답변4
에서 언급했듯이여기에 댓글이 있습니다.systemctl
, 사용자로 실행할 수 있는 관련 Ubuntu 패키지가 누락되었을 수 있습니다. 나에게 일어난 일입니다. 수리하다:
apt install libpam-systemd
실행할 수 있어야 하는 사용자로 SSH를 통해 다시 로그인합니다
systemctl --user
. 따라서 루트로 수행하지 마십시오.
이제 echo $XDG_RUNTIME_DIR
추가 단계 없이 작동하며 다음과 같이 표시됩니다.
$ echo $XDG_RUNTIME_DIR
/run/user/1012
우분투 18.04 LTS가 출시되었습니다.