在 CentOS 上修复 SFTP 权限问题,通常要从 目录权限、SELinux、SSH 配置、用户配置 四个方面排查。下面按常见场景一步一步来。
如果你使用的是 Chroot SFTP(/etc/ssh/sshd_config 中 ForceCommand internal-sftp),这是最容易出错的地方。
假设配置如下:
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
那么必须满足:
✅ Chroot 目录及其所有上级目录
✅ 正确示例:
chown root:root /data/sftp
chmod 755 /data/sftp
❌ 错误示例(一定失败):
chown sftpuser:sftpuser /data/sftp
chmod 777 /data/sftp
Chroot 目录本身不能写,但你可以建一个子目录:
mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
chmod 755 /data/sftp/upload
登录后只能操作 upload 目录。
SFTP 用户 不需要登录 shell,但也不能是 /bin/false 或 /sbin/nologin 直连 SSH。
查看用户 shell:
grep sftpuser /etc/passwd
通常建议:
sftpuser:x:1001:1001::/data/sftp:/sbin/nologin
✅ 这是正常的
❌ 如果是 /bin/bash 且 Chroot 配置错误,就会失败
编辑配置:
vi /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory /data/sftp
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
或按用户:
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
修改后重启 SSH:
systemctl restart sshd
CentOS 默认开启 SELinux,经常导致 能登录但无法上传/下载。
setenforce 0
如果 SFTP 恢复正常,说明是 SELinux 问题。
如果是 Chroot 目录:
semanage fcontext -a -t ssh_home_t "/data/sftp(/.*)?"
restorecon -Rv /data/sftp
或允许 SFTP 写权限:
setsebool -P ssh_chroot_rw_homedirs on
| 现象 | 原因 |
|---|---|
| 能登录但无法上传 | Chroot 目录权限错误 |
| 直接断开连接 | Chroot 目录不是 root 属主 |
| 提示 broken pipe | SELinux |
| 提示 permission denied | 目录权限 |
| 登录后目录为空 | Chroot 路径错误 |
namei -l /data/sftp
确保:
你可以直接贴出下面信息(不用贴密码):
/etc/ssh/sshd_config 中 SFTP 相关配置ls -ld /data/sftpnamei -l /data/sftpgetenforce 输出我可以精确告诉你是哪一条配置导致的问题。