~/.config/systemd/user
일부 X 기능이 필요한 사용자 서비스가 있습니다 (일부 페인팅 및 이미지 처리 기능이 필요함). 단위 파일은 다음과 같습니다.
[Unit]
Description=A Sample Service
After=network.target display-manager.service
[Service]
Type=simple
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/afshar/.Xauthority"
ExecStart=/home/afshar/myService.AppImage
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
다음을 통해 성공적으로 활성화되었습니다.
systemctl --user daemon-reload
systemctl --user enable --now MyService
또한 사용자가 로그인할 때까지 사용자 로그아웃 및 시스템 시작 시 서비스가 계속 실행되도록 사용자 지연 기능을 활성화했습니다.
loginctl enable-linger
X에 의존하지 않으면 모든 것이 예상대로 작동합니다. 그러나 X가 필요한 일부 기능이 서비스에 추가되면 사용자가 로그인하기 전에는 서비스가 시작되지 않고 사용자가 로그아웃하면 종료됩니다. 사용자 세션이 없기 때문에(또는 다른 문제가 있을 수 있음) 느린 사용자가 X에 액세스할 수 없는 것 같습니다. 로그인하기 전에 X를 시작해야 하는 사용자 서비스를 얻으려면 어떻게 해야 합니까?
답변1
X 디스플레이에 대한 유효한 X 세션 쿠키는 사용자가 afshar
로그인할 때까지 /home/afshar/.Xauthority
포함되지 않습니다 . 이전 로그인의 이전 쿠키가 포함될 수 있지만 X 서버가 로그아웃 시 재설정되고 새 세션 쿠키가 생성되면 이 쿠키는 유효하지 않게 됩니다.
루트가 아닌 사용자에게 가능한 액세스 권한을 부여합니다.
즉, 어떤 방식으로든 로그인 화면에 영향을 미칠 수 있는 구성 요소는 보안에 민감한 구성 요소가 되며 로그인 화면에 시스템 관리자 수준 구성이 있어야 합니다. 일반 사용자 권한만으로는 이 작업을 수행할 수 없습니다. 그렇지 않으면 큰 보안 허점이 있을 것입니다. 즉, 로그인 대화 상자의 무결성이 의문시되고 시스템이 사용자를 서로로부터 완전히 보호할 수 없게 됩니다.
마찬가지로, 사용자가 GUI에 로그인할 때 사용자 프로세스가 새 X 세션 쿠키의 복사본을 얻도록 자동으로 허용하는 것은 afshar
해당 사용자의 보안을 위반하는 것입니다.not_afshar
서비스의 주요 부분과 통신하기 위해 D-Bus나 다른 메커니즘을 사용하는 별도의 구성 요소로 X 기능이 필요한 부분을 구현해야 할 수도 있습니다. 그런 다음 로그인 X 서버 초기화 스크립트 전에 해당 구성 요소의 인스턴스를 시작하여 로그인 화면에서 해당 작업을 수행할 수 있습니다(루트 또는 일부 전용 응용 프로그램 사용자로 실행). 그런 다음 사용자가 로그인하면 해당 구성 요소가 사라지고 사라지게 할 수 있습니다. 사용자 세션이 구성 요소의 다른 인스턴스를 시작할 수 있도록 합니다(로그인한 사용자로 실행).
이를 위해서는 필요할 때 연결을 다시 설정할 수 있도록 기본 서비스가 X 기능 구성 요소의 종료 및 다시 시작을 처리할 수 있어야 합니다.