服务器SFTP配置教程:从创建用户到连接验证
SFTP 是在 SSH 加密通道上传输文件的协议,服务器只要运行了 SSH 服务,通常就具备 SFTP 能力,不需要额外装软件。
下面这套流程适合希望在 Linux 服务器上给某个用户开放文件上传下载、同时把他限制在指定目录内的场景。
操作前请确认你有 root 或 sudo 权限,并且已经能通过 SSH 登录服务器。
先想清楚要限制到哪一层目录
SFTP 配置里最容易出错的地方是目录权限。
如果打算用 ChrootDirectory 把用户锁在某个目录里,这个目录本身必须属于 root,并且其他用户不能有写权限,否则 SSH 会拒绝登录。
常见的做法是:
- 给 SFTP 单独建一个用户组,例如
sftpgroup - 给用户指定一个家目录,例如
/data/sftp/user1 - 家目录归
root所有,权限设为755 - 在家目录下再建一个可写子目录,例如
upload,归该 SFTP 用户所有
这样用户登录后落在自己的家目录,只能进入 upload 等子目录写入,无法跳出这个范围。
创建用户和目录
以下命令以 CentOS、Ubuntu、Debian 等常见发行版为例,路径可按需替换。
# 创建 SFTP 用户组
groupadd sftpgroup
# 创建用户,禁止其通过 SSH 登录 shell,仅用于 SFTP
useradd -g sftpgroup -d /data/sftp/user1 -s /sbin/nologin user1
# 设置登录密码
passwd user1
接着创建目录并调整归属:
mkdir -p /data/sftp/user1/upload
chown root:root /data/sftp/user1
chmod 755 /data/sftp/user1
chown user1:sftpgroup /data/sftp/user1/upload
chmod 755 /data/sftp/user1/upload
这里的关键是:家目录归 root,可写目录归用户。
如果家目录被用户自己拥有,chroot 会失败。
修改 sshd_config 开启 SFTP 子系统
编辑 SSH 配置文件:
vi /etc/ssh/sshd_config
先确认或添加全局的 SFTP 子系统配置。
多数系统默认已有这一行,不要重复添加:
Subsystem sftp internal-sftp
然后在文件末尾追加针对用户组的匹配规则:
Match Group sftpgroup
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication yes
说明几个配置项的作用:
ChrootDirectory /data/sftp/%u:%u会自动替换成用户名,把用户限制在自己的家目录ForceCommand internal-sftp:强制该用户只能使用 SFTP,不能执行普通命令AllowTcpForwarding no和X11Forwarding no:关闭端口转发和图形转发,减少风险PasswordAuthentication yes:允许密码登录,如果你只用密钥登录,可以按实际情况调整
保存后检查语法并重启 SSH 服务:
sshd -t
systemctl restart sshd
sshd -t 没有输出通常表示配置语法正确。
重启前建议保留一个已登录的 SSH 会话,避免配置写错后无法远程登录。
用客户端连接验证结果
在本地电脑上用 SFTP 客户端连接,命令行方式如下:
sftp user1@服务器IP
连接成功后执行 pwd,应该显示 /,这代表用户被限制在自己的家目录中。
再执行 ls,应能看到 upload 目录。
进入并尝试上传文件:
cd upload
put 本地文件路径
ls
如果文件出现在列表里,说明读写都正常。
图形客户端如 FileZilla、WinSCP 也可以用相同的主机、端口、用户名和密码连接,协议选择 SFTP。
常见报错和避坑说明
连接失败时,优先查看服务器日志:
tail -f /var/log/secure # CentOS/RHEL 系
tail -f /var/log/auth.log # Debian/Ubuntu 系
几种高频情况:
- 提示
Write failed: Broken pipe或直接断开:多半是ChrootDirectory指向的目录权限不对,确认它归 root 且没有 group/other 写权限 - 登录后无法上传:可写目录的属主或权限不对,确认
upload目录归该用户所有 - 连接被拒绝:检查 SSH 服务是否重启成功、防火墙是否放行 22 端口
- 用户仍能登录 shell:确认
-s /sbin/nologin已设置,且ForceCommand internal-sftp生效
另外,修改 sshd_config 前建议先备份原文件,例如 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak,出问题时能快速回滚。
几个常见疑问
SFTP 和 FTP 有什么区别? SFTP 走 SSH 加密通道,默认端口 22,传输内容加密;
传统 FTP 明文传输,需要额外配置。
安全性上 SFTP 更省心。
能不能让多个用户共用同一个目录? 可以,但要小心权限。
多用户共享时通常需要设置组权限或使用 ACL,否则容易出现互相覆盖或无法写入的问题。
为什么用户登录后看不到自己上传的文件? 检查是否进错了目录。
chroot 后用户看到的根目录其实是服务器上的家目录,上传前先用 pwd 确认当前位置。
一定要用 internal-sftp 吗? 较新版本的 OpenSSH 推荐用 internal-sftp,它不依赖外部程序,配置更简单。
旧写法 sftp-server 也还能用,但新环境优先选前者。
整体流程就是建用户、配权限、改 SSH、测连接四步。
每一步做完都验证一下结果,比一次性改完再排查要省事得多。
如果你的服务器同时跑着网站或数据库,改 sshd_config 时格外留意不要影响到现有 SSH 登录方式。