调试 Linux 上的 SFTP(基于 SSH 的文件传输)通常从服务端和客户端两个方向入手。下面按“从简单到深入”的方式给你一份实用调试指南。
SFTP 依赖 sshd:
systemctl status sshd
# 或
service ssh status
确保服务是 active (running)。
默认端口是 22:
telnet server_ip 22
# 或
nc -vz server_ip 22
如果不能连通,检查:
sftp -v user@host
更详细:
sftp -vvv user@host
重点看:
sftp> 提示符不要直接杀掉生产 sshd,用调试模式另起一个:
/usr/sbin/sshd -p 2222 -d
然后从客户端连接:
sftp -P 2222 user@host
-d 表示 debug 模式(单连接)
-D 表示不 daemon 化(持续运行)
日志会直接打印在终端,能清楚看到:
编辑:
/etc/ssh/sshd_config
确认:
Subsystem sftp internal-sftp
或:
Subsystem sftp /usr/lib/openssh/sftp-server
常见限制示例:
Match User sftpuser
ChrootDirectory /data/sftp
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
修改后:
sshd -t # 校验配置
systemctl restart sshd
如果使用 ChrootDirectory:
chown root:root /data/sftp
chmod 755 /data/sftp
用户实际目录:
mkdir /data/sftp/upload
chown sftpuser:sftpuser /data/sftp/upload
journalctl -u sshd -f
或:
tail -f /var/log/auth.log # Debian/Ubuntu
tail -f /var/log/secure # CentOS/RHEL
常见错误:
Permission deniedbad ownership or modes for chrootsubsystem request failed| 现象 | 可能原因 |
|---|---|
| 连不上 | 防火墙 / 端口 / sshd 未运行 |
| 能 SSH 不能 SFTP | subsystem 配置错误 |
| 登录后立刻断开 | ForceCommand / Chroot 错误 |
| 写文件失败 | 目录权限不对 |
| 公钥登录失败 | authorized_keys 权限错误 |
# 服务端
/usr/sbin/sshd -p 2222 -d
# 客户端
sftp -P 2222 -vvv testuser@127.0.0.1
如果你愿意,可以告诉我:
我可以直接帮你定位具体配置。