我正在尝试为我的服务器创建一个新的 SFTP 帐户。当我按照以下说明操作时确切地,则一切正常:https://www.thegeekstuff.com/2012/03/chroot-sftp-setup/
我可以guestuser
通过 与用户建立联系,浏览我的主目录,然后从进入sftp
上一级。incoming
/sftp/guestuser
我甚至可以将ChrootDirectory
中的值/etc/ssh/sshd_config
具体更改为/sftp/guestuser
,而不是实现%u
参数。因此,硬编码的目录名称可以正常工作。
ChrootDirectory
但从那时起,如果我所做的只是将我的组的更改sftpusers
为我实际网站在的目录/var/www/www.example.com
,那么我将无法sftp
再通过该用户的命令进行连接。 shell 输出:
远程主机关闭了与 www.example.com 的连接。无法读取数据包:对端重置了连接
我当然这么做了:
- 确保我的目录
incoming
中有该文件夹/var/www/www.example.com
/var/www/www.example.com
将和的所有权设置/var/www/www.example.com/incoming
为guestuser:sftpusers
/
尝试通过执行以下操作将用户的主目录设置为usermod guestuser -d /
该/sftp/guestuser
目录(它工作的目录)归所有root:root
,因此的权限/var/www
是否开启root:root
并不重要(?)
为什么我无法更改新 SFTP 用户的主目录?
更新
我可以将目录更改为:
/sftp
/
/var
/var/www
这些都有效。但是一旦再进入/var/www
,例如/var/www/test
,它就不起作用了。我尝试从原始目录名称中删除点www.example.com
,但没有什么效果。
这也不是关于子目录层数的限制,因为/sftp/guestuser/incoming
这样也可以。使用新目录进行测试则/web/www.example.com
不行。
答案1
好的,我终于找到原因了。我为ChrootDirectory
用户定义的目录必须归所有root
。
如果我希望我的用户能够上传东西(这显然他无法在根拥有的目录中做到这一点),那么我需要在其中创建一个子目录,并在-d
创建或编辑用户时通过参数将该目录设置为他的主目录。
如果所有权在任何时候发生变化,使得ChrootDirectory
归属于尝试通过 ftp 进入的用户,则该broken pipe
消息将再次出现。将所有权更改回root
,用户即可再次连接。