CentOS 上 SFTP 连接失败 原因很多,一般可以按下面思路一步步排查。下面我按最常见 → 较少见给你梳理,并给出对应的解决办法。
在客户端执行:
sftp user@服务器IP
常见错误:
✅ 如果改过端口:
sftp -P 2222 user@IP
SFTP 依赖 sshd
systemctl status sshd
如果没运行:
systemctl start sshd
systemctl enable sshd
systemctl status firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
✅ 如果改过端口:
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
getenforce
如果是 Enforcing,可能限制 SFTP 目录。
setenforce 0
如果此时能连,说明是 SELinux 问题。
✅ 正确做法(不关闭 SELinux):
setsebool -P ssh_chroot_rw_homedirs on
vim /etc/ssh/sshd_config
确认:
Subsystem sftp internal-sftp
⚠️ 如果看到:
Subsystem sftp /usr/libexec/openssh/sftp-server
一般也没问题,但如果路径不存在会失败。
修改后重启:
systemctl restart sshd
passwd -S 用户名
vim /etc/ssh/sshd_config
检查是否有:
DenyUsers 用户名
DenyGroups 用户名
如果你是 密钥登录失败:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
修改后重启 sshd。
tail -f /var/log/secure
常见错误示例:
Permission deniedBad ownership or modes for directoryConnection closed by remote host| 错误提示 | 原因 |
|---|---|
| Connection refused | sshd 没启动 / 防火墙 |
| Connection timeout | 防火墙 / IP 不对 |
| Permission denied | 密码 / 权限 / SELinux |
| broken pipe | 网络 / 配置问题 |
| Received message too long | shell 输出导致 |
systemctl status sshd
firewall-cmd --list-all
getenforce
tail -f /var/log/secure
如果你愿意,可以把 具体报错信息(客户端 + /var/log/secure)贴出来,我可以直接帮你定位是哪一步出问题。