在 CentOS 上修复 SFTP 报错,需要先明确报错现象和日志,不同错误原因修复方式不同。下面我按常见报错类型 + 对应解决方案给你梳理,你可以对照使用。
在服务器上执行:
# 查看 SSH / SFTP 日志
journalctl -u sshd -n 50
# 或
tail -n 50 /var/log/secure
客户端连接时加 -v:
sftp -v user@ip
Connection closed / broken pipe原因:sshd 配置错误或 chroot 设置不当
检查 & 修复
vi /etc/ssh/sshd_config
确认包含:
Subsystem sftp internal-sftp
如果写成了:
Subsystem sftp /usr/libexec/openssh/sftp-server
且用了 ChrootDirectory,必须改为 internal-sftp
重启:
systemctl restart sshd
Permission denied (publickey,password)原因:用户被禁止登录或密码认证关闭
检查
grep -E "PasswordAuthentication|PermitRootLogin" /etc/ssh/sshd_config
修复
PasswordAuthentication yes
PermitRootLogin no # 建议普通用户
systemctl restart sshd
chroot directory fails报错示例
fatal: bad ownership or modes for chroot directory
原因
755修复
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
mkdir /home/sftpuser/upload
chown sftpuser:sftpuser /home/sftpuser/upload
sshd_config 示例:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
Write failed: Broken pipe(上传失败)原因
检查
df -h
getenforce
修复
# 临时关闭
setenforce 0
# 或允许 sftp 写
setsebool -P ssh_chroot_rw_homedirs on
No such file or directory(sftp-server 缺失)报错
subsystem request for sftp failed
修复
rpm -q openssh-server
yum reinstall openssh-server -y
# 防火墙
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
# 端口
ss -tlnp | grep ssh
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
用户:
useradd -g sftp -s /sbin/nologin sftpuser
你可以直接把具体报错内容贴出来(客户端 + /var/log/secure),我可以精准定位并给修复命令。