使用Renci.SshNet连接SFTP切换目录时出现“No such file”错误
问题分析与解决方案
核心原因:ChrootDirectory的路径映射逻辑
配置ChrootDirectory /media/FileServer后,SFTP用户sftpuser登录后的根目录(/)会被映射到服务器的/media/FileServer目录。也就是说:
- 用户看到的
/就是服务器上的/media/FileServer - 用户环境中不存在
/media/FileServer这个路径,因此执行ChangeDirectory("/media/FileServer/")必然报错
修正代码
不需要切换到/media/FileServer,直接操作当前根目录即可。如果需要访问/media/FileServer下的子目录,直接使用子目录的相对或绝对路径(相对于用户的根目录):
var dir = sftp.ListDirectory(sftp.WorkingDirectory); foreach (var dirEntry in dir) { Console.Out.WriteLineAsync(dirEntry.FullName); } // 当前工作目录就是服务器的/media/FileServer,无需切换 // 示例:访问/media/FileServer下的uploads子目录 // sftp.ChangeDirectory("/uploads/");
权限配置的正确要求
sshd对Chroot目录有强制权限规则:
- Chroot目录(
/media/FileServer)必须由root:root拥有 - 权限必须为
755(不能是777或其他包含w权限给组/其他用户的设置)
你之前将目录所有者改为sftpuser后出现的连接中断错误,就是违反了这个规则,服务器日志的bad ownership or modes for chroot directory提示也明确说明了这一点。
实现用户可写入的目录结构
如果需要让sftpuser拥有写入权限,不要修改Chroot根目录的权限,而是在/media/FileServer下创建子目录,将子目录的所有者改为sftpuser:
# 创建子目录 sudo mkdir /media/FileServer/uploads # 修改子目录所有者为sftpuser及其组 sudo chown sftpuser:sftp_users /media/FileServer/uploads # 设置子目录权限(确保用户可读写) sudo chmod 755 /media/FileServer/uploads
这样用户登录后就能看到/uploads目录,并正常进行读写操作。
内容的提问来源于stack exchange,提问作者Nicolas Vanruysseveldt
相关产品推荐
相关产品推荐

