추가 읽기

추가 읽기

내 아치 서버에서는 홈 디렉토리의 사용자로 제한되도록 설정했습니다. 난 달린다:

useradd -m -s /bin/bash username그리고passwd username

나는 읽었다이 위키 기사...

각 사용자가 시작 시 노드 서버를 실행하도록 하려면 systemd 사용자 서비스를 사용해야 한다고 생각합니다. 그래서 사용자 계정에 로그인 su username하고 다음을 포함하는 파일을 만들었습니다 ~/.config/systemd/user/serve.service.

[Unit]
Description=One of the servers

[Service]
ExecStart=/usr/bin/node /home/username/server.js

[Install]
WantedBy=default.target

그런 다음 나는 달렸고 systemctl --user enable serve.service그 응답은 다음과 같습니다.Failed to connect to bus: Permission denied

내가 이해한 systemctl --user ...바로는 루트가 아닌 사용자로 명령을 실행해야 합니다.

그렇다면 이 구성에서 내가 놓치고 있는 것은 무엇입니까?

답변1

그래서 사용자 계정에 로그인했습니다.su username

아니요, 그렇지 않습니다.

로그인하지 않으셨습니다. 특권을 강화하고 있습니다.기존 로그인 세션그리고 su username.

systemctl--user옵션은 사용자별 데스크탑 버스를 찾고, 사용자별 데스크탑 버스 데몬에 의해 관리되며, systemd이 버스를 통해 사용자별 서비스를 관리하는 사용자별 인스턴스와 통신합니다.

su로그인 메커니즘이 아님. 효과가있다기존에대화형 로그인 세션. 해당 세션 내에서 프로세스에는 사용자별 런타임 디렉터리의 위치( XDG_RUNTIME_DIR), 사용자별 데스크톱 버스의 위치( ) 및 X 서버의 위치( ) DBUS_SESSION_BUS_ADDRESS와 같은 기타 정보를 알려주는 환경 변수가 있습니다 .DISPLAY

특히 동일한 경로를 DBUS_SESSION_BUS_ADDRESS암시적으로 참조하거나 명시적으로 이름을 지정할 수 있습니다 . XDG_RUNTIME_DIR경로는 일반적으로 /run/user/1001/busDesktop Bus Agent의 액세스 소켓과 유사합니다(예: 사용자 ID가 1001이라고 가정).

이러한 변수는 변경되지 않습니다 su. .pkexec

결과적으로 su로그인 세션에서 두 번째 사용자에 연결하는 경우 systemctl해당 두 번째 사용자로 실행하면 첫 번째 사용자의 개인 디렉터리에 있는 Desktop Bus Agent 액세스 소켓에 연결을 시도하게 됩니다. 사용자 1002(예를 들어 두 번째 사용자에 대한 사용자 ID 선택)는 /run/user/1001그 안에 있는 어떤 것도 액세스할 수 없습니다. xe가 디렉터리에 대한 읽기+실행 액세스 권한을 갖고 있더라도 xe는 /run/user/1001/bus사용자 1001 권한에만 액세스 권한을 부여하므로 해당 디렉터리에 액세스할 수 없습니다.

물론, 이것은아니요올바른 데스크탑 버스 브로커와 상담하여 시작하십시오. 너랑 소통하고 싶니?두번째사용자의 데스크탑 버스는 이를 통해 프록시되고 두 번째 사용자의 사용자별 인스턴스에 도달합니다 systemd.

간단한 해결책은 su이러한 환경 변수를 두 번째 사용자 계정에 적합한 환경 변수로 설정하여 두 번째 사용자의 데스크탑 버스를 가리키는 것입니다.

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus su 사용자 이름 -c 'systemctl --user'

물론 이 경우 편리한 도구를 사용하여 설정하면 userenv해당 버스 주소를 수동으로 입력할 필요가 없습니다.

su 사용자 이름 -c 'userenv --set-dbus systemctl --user'

추가 읽기

관련 정보