使用Go无法连接FTP服务器但FileZilla可正常连接的问题排查
问题分析与修复方案
核心问题
你使用的github.com/jlaffaye/ftp是FTP协议客户端,但你启动的atmoz/sftp容器是SFTP(SSH File Transfer Protocol)服务器,两者底层协议完全不同,这就是连接失败报EOF的根本原因。
FileZilla能成功是因为它支持SFTP协议,你在连接时应该选择了SFTP模式而非普通FTP模式。
修复方案:改用SFTP客户端库
改用支持SFTP的Go库,比如github.com/pkg/sftp,结合SSH客户端建立连接。以下是修改后的代码示例:
package main import ( "log" "time" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" ) func main() { // SSH连接配置 config := &ssh.ClientConfig{ User: "foo", Auth: []ssh.AuthMethod{ ssh.Password("pass"), }, HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 生产环境请勿使用,需验证主机密钥 Timeout: 5 * time.Second, } // 建立SSH连接 sshClient, err := ssh.Dial("tcp", "localhost:22", config) if err != nil { log.Fatalf("SSH连接失败: %v", err) } defer sshClient.Close() // 初始化SFTP客户端 sftpClient, err := sftp.NewClient(sshClient) if err != nil { log.Fatalf("SFTP会话建立失败: %v", err) } defer sftpClient.Close() // 示例:读取upload目录内容 files, err := sftpClient.ReadDir("upload") if err != nil { log.Fatalf("读取目录失败: %v", err) } log.Println("upload目录内容:") for _, f := range files { log.Printf("- %s (大小: %d)", f.Name(), f.Size()) } }
额外调试建议
- 检查容器状态:执行
docker ps确认容器正常运行,执行docker logs <容器ID>查看服务器日志,排查连接异常信息。 - 端口连通性测试:用
nc -zv localhost 22验证端口是否可访问,确认Docker端口映射生效。 - 手动验证SFTP服务:用
ssh foo@localhost -p 22手动连接SSH服务器,确认账号密码正确,确保SFTP服务正常。
内容的提问来源于stack exchange,提问作者user982292
相关产品推荐
相关产品推荐

