You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:10:28