chpasswd는 chroot 디렉토리에 변경 사항을 적용합니다.

chpasswd는 chroot 디렉토리에 변경 사항을 적용합니다.

내 컴퓨터에 해당 버전이 debootstraped있고 비밀번호를 변경하고 싶습니다.wheezyArchlinuxroot

echo "root:toor" | chpasswd --root /home/containers/wheezy/

하지만 오류가 발생합니다.

chpasswd: PAM: Permission denied

root내 로컬 사용자에서는 잘 작동합니다( --root옵션 없음).

man페이지에는 다음 사항이 명확하게 명시되어 있습니다.

-R, --root CHROOT_DIR
CHROOT_DIR 디렉터리에 변경 사항을 적용하고 CHROOT_DIR 디렉터리의 구성 파일을 사용합니다.

그럼 내가 뭘 잘못하고 있는 걸까요? 어떻게 PAM참여하나요? 다른 방법이 있나요?

편집하다

# echo "root:toor" | sudo strace -f -efile,execve chpasswd --root /home/containers/wheezy/

아래는 불평을 시작하는 출력입니다 chpasswd.

open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_GB.utf8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_GB/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/Linux-PAM.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_GB.utf8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_GB/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/shadow.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
chpasswd: PAM: Permission denied
+++ exited with 1 +++

편집 2

chpasswd대상 컨테이너에 예상되는 파일이 다음을 제외한 다른 많은 언어로 찾을 수 있음 을 발견했습니다 .영어:

# find /usr/share/locale/ -iname '*Linux-PAM.mo*'
/usr/share/locale/hu/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/zh_CN/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/it/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/zu/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/ko/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/or/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/nl/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/sk/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/ja/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/da/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/uk/LC_MESSAGES/Linux-PAM.mo
...
/usr/share/locale/pt_BR/LC_MESSAGES/Linux-PAM.mo
/usr/share/locale/ta/LC_MESSAGES/Linux-PAM.mo

참고: 대상 컨테이너 와 동일한 기대치는 en_GB무엇 chpasswd입니까 ? uk..

필요한 파일이 포함된 것으로 보이는 패키지를 다시 설치해 보았습니다.

apt-get install --reinstall libpam-runtime login locales locales-all

그러나 그것은 전혀 도움이 되지 않습니다.

편집 3

대상 컨테이너에서 실행 하면 strace다음 파일을 찾지 않습니다.

# echo "root:toor2" | strace -f -e open chpasswd --root /
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/libpam.so.0", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libpam_misc.so.0", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libcrypt.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY) = 3
open("/proc/filesystems", O_RDONLY)     = 3
open("/etc/pam.d/chpasswd", O_RDONLY)   = 3
open("/etc/pam.d/common-password", O_RDONLY) = 4
open("/lib/x86_64-linux-gnu/security/pam_unix.so", O_RDONLY) = 5
open("/etc/ld.so.cache", O_RDONLY)      = 5
open("/lib/x86_64-linux-gnu/libnsl.so.1", O_RDONLY) = 5
open("/lib/x86_64-linux-gnu/security/pam_deny.so", O_RDONLY) = 5
open("/lib/x86_64-linux-gnu/security/pam_permit.so", O_RDONLY) = 5
open("/etc/pam.d/other", O_RDONLY)      = 3
open("/etc/pam.d/common-auth", O_RDONLY) = 4
open("/etc/pam.d/common-account", O_RDONLY) = 4
open("/etc/pam.d/common-password", O_RDONLY) = 4
open("/etc/pam.d/common-session", O_RDONLY) = 4
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/nsswitch.conf", O_RDONLY)    = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/libnss_compat.so.2", O_RDONLY) = 3
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/libnss_nis.so.2", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/passwd", O_RDONLY)           = 3
open("/etc/.pwd.lock", O_WRONLY|O_CREAT|O_CLOEXEC, 0600) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = 4
open("/dev/urandom", O_RDONLY)          = 4
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/passwd", O_RDONLY)           = 4
open("/etc/nshadow", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
open("/etc/shadow", O_RDONLY)           = 5
open("/etc/localtime", O_RDONLY)        = 4
Process 7760 attached
Process 7759 suspended
Process 7759 resumed
Process 7760 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

편집 4

Debian Jessie마지막으로 동일한 컨테이너에서 동일한 명령을 실행했습니다.일했다. 이 경우 는 다른 구현으로
해결되었습니다 .WheezyArchlinuxchpasswd

내 생각에 이 문제에 대한 가장 좋은 휴대용 솔루션은 다음과 같습니다.@petercordes:

echo 'root:toor' | chroot /home/containers/wheezy/ /usr/sbin/chpasswd

답변1

Selinux/Ubuntu 대안이 될 수 있습니다.

selinux를 올바르게 사용하는 방법에 대한 훌륭한 비디오: https://www.youtube.com/watch?v=bQqX3RWn0Yw

저는 우분투(의복인 것 같아요?) 전문가가 아니기 때문에 도움을 드릴 수 없습니다.

답변2

PAM에는 비밀번호 강도 확인과 같은 작업을 수행하는 방식인 비밀번호 변경이 포함됩니다. passwordPAM 구성의 항목은 수행되는 작업을 제어합니다.

이 경우 내 가설은 Arch와 Debian 사이에 이상한 상호 작용이 있다는 것입니다. 당신은 Arch를 실행하고 있으며 chpasswd, 많은 작업(주로 공유 라이브러리 로드)을 수행한 다음 Wheezy 컨테이너로 이동하여 구성을 조정하려고 시도합니다.

--root내 생각에 당신은 그 옵션을 포기 chpasswd하고 chroot그 앞에 콜을 하는 것만으로도 훨씬 더 나은 행운을 얻을 수 있다고 생각합니다.

또한 완전성을 위해루트로 실행하세요 chpasswd. 그렇죠? (웃다)

관련 정보