Ubuntu 16.04.3 LTS chrooted SSH/SFTP环境下用户无法改密码求助
解决Chrooted SSH/SFTP用户无法修改密码(
passwd: Cannot determine your user name)的问题 这个报错的核心原因是passwd命令在chroot环境里无法读取到你的用户身份信息,或者缺少必要的依赖文件/环境变量。下面是一步步的排查和解决方法:
1. 确保Chroot环境包含用户的账号信息文件
passwd需要从/etc/passwd和/etc/group读取你的用户名、UID、GID等核心信息,所以必须把这些文件里的对应条目复制到chroot环境中:
假设你的chroot根目录是/home/chroot,目标用户名为sftpuser,执行以下命令:
# 复制用户的passwd条目到chroot环境 grep sftpuser /etc/passwd >> /home/chroot/etc/passwd # 复制用户所属组的group条目到chroot环境 grep sftpuser /etc/group >> /home/chroot/etc/group
注意:如果用户属于多个组(比如sudo组),要把所有相关组的条目都复制过去。
2. 检查并补充passwd依赖的库文件
passwd是动态链接的二进制文件,chroot环境里可能缺少它需要的系统库。先在主机系统上查看passwd依赖的库:
ldd /usr/bin/passwd
你会看到类似这样的输出:
linux-vdso.so.1 => (0x00007ffeefbfe000) libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f8b3a6d6000) libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f8b3a4c8000) libpam_misc.so.0 => /lib/x86_64-linux-gnu/libpam_misc.so.0 (0x00007f8b3a2c4000) libaudit.so.1 => /lib/x86_64-linux-gnu/libaudit.so.1 (0x00007f8b3a09a000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8b39cd0000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8b39acc000) libcap-ng.so.0 => /lib/x86_64-linux-gnu/libcap-ng.so.0 (0x00007f8b398c7000) /lib64/ld-linux-x86-64.so.2 (0x00007f8b3a90e000)
把这些库文件(除了linux-vdso.so.1,这是内核提供的虚拟库)复制到chroot环境对应的目录下,比如:
cp /lib/x86_64-linux-gnu/libcrypt.so.1 /home/chroot/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libpam.so.0 /home/chroot/lib/x86_64-linux-gnu/ # 按同样的方式复制所有其他需要的库文件
3. 手动设置必要的环境变量
有时候chroot后的shell没有加载USER、LOGNAME这些环境变量,导致passwd无法识别你的用户名。可以先手动设置这些变量再尝试修改密码:
export USER=$(whoami) export LOGNAME=$USER passwd
如果这样能解决问题,可以把这些变量添加到chroot环境下用户的~/.bashrc或者~/.profile文件里,让每次登录自动加载。
4. 检查文件权限
确保chroot环境下的/etc/passwd和/etc/group文件权限正确,应该是所有用户可读:
chmod 644 /home/chroot/etc/passwd chmod 644 /home/chroot/etc/group
完成以上步骤后,重新登录chroot用户,再执行passwd命令应该就能正常修改密码了。
内容的提问来源于stack exchange,提问作者user795630
相关产品推荐
相关产品推荐

