我已将 sftp 用户 chroot 到 /var/www,并且我希望他们能够自动移动到他们的目录中。我发现这个答案对我帮助很大:Chroot SFTP-可以允许用户写入当前(chroot)目录。但我想将用户移动到他或她的主目录(=/= 用户的名称)(这是 var/www 的子目录)。我试过:
Match Group sftpusers
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /var/www
ForceCommand internal-sftp -d %h
但我明白fatal: percent_expand: unknown key %h [postauth]
。
编辑:我发现那%d
是用户目录,但它似乎不起作用,因为它是根据 /var/www 来寻找它的。
答案1
据我了解,您面临的问题是 internal-sftp 调用是在 chroot 到位后发生的,因此 %h(以及尝试的 %d)正在 chroot 内扩展。即使您的用户居住在/var/www/$USERNAME
,使用 %d 也会自然地指示 internal-sftp 用尽/var/www/var/www/$USERNAME
。
%u 应该可以解决这个问题:
Match Group sftpusers
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /var/www
ForceCommand internal-sftp -d /%u
因此将告诉 internal-sftp 运行名为 的目录/$USERNAME
。由于此调用是在 chroot 建立之后发生的,因此它应该取消引用/var/www/$USERNAME
chroot 之外的内容。
正如评论中所讨论的,由于您的用户名和主目录名称不同,一种解决方法是使用上述配置,然后为每个用户创建一个 /var/www/USERNAME 并将 /var/www/USERNAME 绑定到 /var/www/CURRENT_HOMEDIR_NAME,如下所示:
mkdir /var/www/USERNAME; mount -o bind /var/www/USERNAME /var/www/CURRENT_HOMEDIR_NAME
。
现在,/var/www 下将为每个用户名提供两个目录,但其中一个目录将简单地指向另一个目录 - internal-sftp 将按预期工作,并且任何需要以 /var/www/CURRENT_NAME 身份访问主目录的内容都不会中断。