You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:51:14