XDG_RUNTIME_DIR
systemctl --user
업무에 필요합니다 .
시스템 사용자 세션을 실행하기 위해 우분투 서버 16.04를 설정했습니다. 이제 이를 관리하려고 할 때 sudo -u $user -i
사용자를 전달하거나 변경할 때 su - $user
환경이 XDG_RUNTIME_DIR
설정되지 않아 작동하지 않는 것을 발견했습니다 systemctl --user
. 그런데 ssh
사용자에게 직접 가보니 제대로 설정되어 있네요.
설명서를 올바르게 이해했다면 libpam-systemd
사용자 세션이 생성될 때 설정되어야 합니다. 사용자 조각이 XDG_RUNTIME_DIR
가리켜야 하는 디렉터리( )가 존재하므로 사용자 조각이 올바르게 시작됩니다 /run/users/$uid
. 예를 들어, 나는 이것을 하드코딩하는 것을 주저합니다. .bash_profile
왜냐하면 그것은 진부해 보이고(유효하긴 하지만) pam이 이를 처리해야 하기 때문입니다.
물론 를 추가할 수도 있지만 XDG_RUNTIME_DIR
그렇게 env_keep
하면 sudoers
sudoing 사용자의 환경만 보존되므로 내가 원하는 것은 아닙니다. 나는 원해요표적사용자 환경.
하지만 제가 정말 알고 싶은 것은 or_set_session_properly를 ssh
사용하는 대신 set_session_properly를 사용하는 이유입니다 .su
sudo -i
답변1
내 Fedora 25 시스템에서 이 문제를 재현했습니다.
소스코드에서 매우 의심스러운 상황을 발견했습니다. https://github.com/systemd/systemd/blob/f97b34a/src/login/pam_systemd.c#L439 평범한 마음으로 쓴 것 같지만 sudo
그렇지 않습니다 sudo -u non-root-user
.
machinectl shell --uid=non-root-user
귀하의 사양에 맞게 작업하십시오.
systemd-run
machinectl 문서에 참조되어 있지만 예상대로 작동하지 않는 것 같습니다.
현재 SELinux를 활성화한 경우 특정 machinectl 명령이 작동하지 않으며 이러한 특정 명령은 활성화할 때까지 작동하지 않았습니다 setenforce 0
. 그러나 나는 SELinux와 함께 작동하기를 원하기 때문에 machinectl이 작동하도록 하는 해결 방법을 시도 중이므로 machinectl shell
시간 초과 의 원인이 될 수 있습니다 .
편집: 이 코드는 다음 이후에 도입된 것 같습니다.이 토론. 분명히 su -
/ sudo -i
작동할 수 있지만 아무도 (아직) 그것을 구현하지 않았습니다.
관련 커밋은https://cgit.freedesktop.org/systemd/systemd/commit/?id=baae0358f349870544884e405e82e4be7d8add9f
답변2
하지만 내가 정말로 알고 싶은 것은 왜 ssh를 사용하여 세션을 올바르게 설정하지만 su 또는 sudo -i를 사용하지 않는 걸까요?
https://github.com/systemd/systemd/issues/7451#issuecomment-346787237
죄송합니다. "su"는 사용자의 신원과 몇몇 다른 프로세스의 자격 증명을 일시적으로 변경하는 데 사용되는 도구입니다. 완전히 새로운 로그인 세션을 여는 도구가 아닙니다. 새 로그인 세션에는 잘 정의된 원래 설정이 있으며 다른 세션에서 아무것도 상속받지 않지만 "su" uid 변경은 실제로 그렇게 하지 않습니다. 대부분의 실행 환경은 MAC 컨텍스트와 같이 실질적이고 명백하지 않은 방식으로 상속됩니다. 감사 컨텍스트, cgroup 컨텍스트, 네임스페이스 컨텍스트, 예약, 타이머 세분성...
완전히 새로운 세션을 원한다면 "machinectl login" 또는 "machinectl shell"과 같은 것을 사용하십시오. 이는 실제로 호출에서 숨겨진 프로세스 속성이 없는 완전히 깨끗하고 독립적이며 분리된 환경을 제공합니다. 어딘가에서 누출되고 있습니다.
로그인 세션은 대부분 감사 세션 개념과 연결되어 있으며 감사 세션은 "su"의 영향을 받지 않습니다. 실제로는 "봉인됨"으로 정의됩니다. 즉, 프로세스가 세션에 한 번 들어가면 해당 세션과 영원히 함께 유지됩니다. 프로세스도 마찬가지입니다. 즉, 새 세션을 얻는 유일한 방법은 세션의 일부가 아닌 PID 1(또는 이와 유사한 것)에서 분기하는 것입니다.
즉, "su"를 통해 호출한 내용은 "loginctl"에 잘 표시되지만 원래 로그인한 원래 세션의 일부로 남아 있습니다. 원래 세션 ID에서 "loginctl status"를 호출하여 이를 확인할 수 있습니다(echo $XDG_SESSION_ID로 확인할 수 있음).
답변3
sudo -E bash
올바르게 실행 하면 XDG_RUNTIME_DIR
.
답변4
여전히 솔루션을 원하는 경우 sudo -i
pam 모듈을 설치하여 XDG_RUNTIME_DIR
.Pam_xdg.
귀하의 배포판에 이 패키지가 있을 가능성은 거의 없으므로 pam_xdg
이 모듈을 설치하려면 직접 설치 방법을 알아내야 합니다. 저는 Gentoo를 사용하고 있으며 모듈을 설치하는 ebuild를 생성했지만 아직 출시하지 않았습니다. 왜냐하면 내 오버레이에 마무리해야 할 개발 커밋이 너무 많기 때문입니다. 이 답변은 업로드되면 업데이트하겠습니다.
pam 모듈을 올바르게 설치한 후 다음 행을 추가하십시오 /etc/pam.d/sudo-i
.
session optional pam_xdg.so
원하는 경우 required
대신 지정하십시오 .optional
이 모듈은 기본 XDG 값을 생성하려고 시도 pam_systemd.so
하며 단지 machinectl shell
.