在 CentOS 上配置 SFTP 权限,通常推荐使用 OpenSSH 自带的 SFTP + Chroot(限制目录) 方式,而不是用 FTP 服务。下面从常见场景给你讲清楚。
useradd sftpuser
passwd sftpuser
mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
mkdir /data/sftp/sftpuser/upload
chown sftpuser:sftpuser /data/sftp/sftpuser/upload
chmod 755 /data/sftp/sftpuser/upload
编辑:
vi /etc/ssh/sshd_config
# Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /data/sftp/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
如果是多个用户:
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
并创建组:
groupadd sftp
usermod -G sftp sftpuser
systemctl restart sshd
sftp sftpuser@服务器IP
✅ 成功
❌ 如果报错:broken pipe / chroot failed
→ 99% 是 Chroot 目录不是 root:root 或权限不对
| 目录 | 所有者 | 权限 |
|---|---|---|
| Chroot 根目录 | root:root | 755 |
| 上传目录 | 用户:用户 | 755/775 |
| 用户主目录 | ❌不能是用户 | 必须是 root |
→ 只能在 upload 目录写,不能在根目录写
→ SFTP 无法单独禁下载,只能限制目录权限
可以:
mkdir /home/sftpuser/.ssh
cp id_rsa.pub /home/sftpuser/.ssh/authorized_keys
chown -R sftpuser:sftpuser /home/sftpuser/.ssh
如果你愿意,可以告诉我:
我可以直接帮你写一份完整可用配置。