我想sftp
在 Ubuntu 服务器上创建仅对一个特定文件夹具有读/写权限的用户帐户。我希望此用户有权通过 传输文件到我的服务器sftp
。我的服务器托管在 Digital Ocean 上。
我已经关注本教程在 Digital Ocean 上,它似乎完全符合我的要求,但我却被困住了Step 4
。
步骤 4 建议你尝试这个命令:
ssh sammyfiles@localhost
结果应该是:
Error message
This service allows sftp connections only.
Connection to localhost closed.
相反,我的结果是:
packet_write_wait: Connection to 207.154.238.143 port 22: Broken pipe
Connection closed
接下来它指示运行这个,这显然应该可以工作:
sftp sammyfiles@localhost
结果应该是:
SFTP prompt
Connected to localhost.
sftp>
但我得到的却是:
forge@BitCloud:~$ sftp misjah@localhost
misjah@localhost's password:
packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
Couldn't read packet: Connection reset by peer
如果我想sftp
从外部与这个新创建的用户联系,我会收到同样的消息:
prmbair:~ primozrome$ sftp [email protected]
[email protected]'s password:
packet_write_wait: Connection to 207.154.238.143 port 22: Broken pipe
Connection closed
prmbair:~ primozrome$
我究竟做错了什么?
评论更新:
问题似乎出在sshd_config
-ChrootDirectory
行。如果我使用,ChrootDirectory %h
那么 sftp 到用户主目录就可以正常工作,但如果我使用ChrootDirectory /home/user/uploads
(仅限于一个文件夹),那么:
packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe.
Couldn't read packet: Connection reset by peer.
任何想法?
答案1
从https://man.openbsd.org/sshd_config
ChrootDirectory 指定在认证后 chroot(2) 到的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组件是否都是 root 拥有的目录,并且其他任何用户或组都无法写入。
我遇到了同样的问题,解决方案是避免使用用户主目录中的目录,因为 /home/user 目录不应归 root 所有,而是在 /var/sftp/uploads 等目录中创建一个目录,其中 /var/sftp/ 由 root 所有,而 /var/sftp/uploads 由 sftp 用户所有。然后我可以在 uploads 中 chroot sftp 用户。
ChrootDirectory /var/sftp
在 /etc/ssh/sshd_config 中
答案2
我认为权利方面存在错误...
ls -l
您能向我们展示一下目录中该命令的返回结果/var/sftp
吗?
我认为/var/sftp
有 755 个权限,但不是/var/sftp/uploads
因为chmod
如果我们不告诉它,命令不是递归的,所以您必须输入:(
sudo chmod 755 -R /var/sftp
递归的 -R 参数)。使用-R
,中的所有子目录/var/sftp
都将拥有 755 个权限。
你能尝试一下吗?
祝你好运 !
答案3
要解决此问题,您不仅需要更改文件夹的权限,还需要确保将文件夹所有者设置为 root。您可以使用以下命令实现此目的:sudo chown root:root /var/sftp
sudo chmod 755 /var/sftp