在 CentOS 上使用 SFTP 报错 是很常见的问题,原因可能来自 SSH 服务配置、权限、防火墙、SELinux、用户设置 等。下面我按「常见报错场景 → 原因 → 解决办法」给你一个实用排查清单。
systemctl status sshd
如果没启动:
systemctl start sshd
systemctl enable sshd
默认 SFTP 走 SSH(22 端口):
telnet IP 22
# 或
ssh user@IP
Connection closed / Connection reset by peer可能原因
解决
/etc/ssh/sshd_configSubsystem sftp internal-sftp
或
Subsystem sftp /usr/libexec/openssh/sftp-server
/usr/bin/bash
不能是 /sbin/nologin(除非用 chroot)
查看:
grep 用户名 /etc/passwd
修改:
usermod -s /bin/bash 用户名
systemctl restart sshd
Permission denied (publickey,password)可能原因
解决
grep PasswordAuthentication /etc/ssh/sshd_config
应为:
PasswordAuthentication yes
重启 sshd
检查用户是否被锁:
passwd -S 用户名
典型配置
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
必须满足
chown root:root /data/sftp
chmod 755 /data/sftp
用户目录:
mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
否则会:
fatal: bad ownership查看:
getenforce
临时关闭测试:
setenforce 0
如果好了,说明是 SELinux 问题:
setsebool -P ssh_chroot_rw_homedirs on
restorecon -Rv /data/sftp
firewall-cmd --list-all
确保 22 端口开放:
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
tail -f /var/log/secure
常见关键字:
Accepted passwordfatalpermission deniedchrootuseradd -m sftpuser
passwd sftpuser
usermod -s /bin/bash sftpuser
systemctl restart sshd
如果你能把具体报错信息贴出来(客户端报错 + /var/log/secure 日志),我可以直接帮你精确定位 ✅