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

使用goftp库上传文件时遭遇“502 RFC 2228 authentication not implemented”错误

问题:使用goftp上传文件时遇到“502 RFC 2228 authentication not implemented”错误

我尝试用goftp库通过FTP向服务器上传文件,按照GitHub示例写了代码,但运行时一直报错:502 RFC 2228 authentication not implemented。以下是我的代码和错误日志,请问问题出在哪里?

代码

package main
import (
 "crypto/tls"
 "github.com/dutchcoders/goftp"
 "fmt"
 "strings"
 "path/filepath"
 "os"
)
var client *goftp.FTP
func main() {
 // connect to FTP
 client, err := goftp.ConnectDbg("192.168.206.226:21")
 if err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
 defer client.Close()
 config := tls.Config{
  InsecureSkipVerify: true,
  ClientAuth: tls.RequestClientCert,
 }
 if err = client.AuthTLS(&config); err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
 if err := client.Login("aaa", "bbbb"); err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
 // upload new S10 file using FTP
 err = filepath.Walk("c:\\Temp", upload)
 if err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
}
func upload(path string, f os.FileInfo, err error) error {
 if strings.Compare(f.Name(), "S10") == 0 {
  path := strings.TrimSuffix(path, f.Name())
  var file *os.File
  if file, err = os.Open(path); err != nil {
   fmt.Println(err)
   os.Exit(1)
  }
  defer file.Close()
  if err := client.Stor("/sd1/myFile", file); err != nil {
   fmt.Println(err)
   os.Exit(1)
  }
 }
 return nil
}

错误日志

go : 2018/05/09 10:23:28 < 220 192.168.206.226 FTP server (QNXNTO-ftpd 20081216) ready.
At line:1 char:1
+ go run main.go
+ ~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (2018/05/09 10:2...0081216) ready.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

2018/05/09 10:23:28 220 192.168.206.226 FTP server (QNXNTO-ftpd 20081216) ready.
2018/05/09 10:23:28 > AUTH TLS
502 RFC 2228 authentication not implemented.
2018/05/09 10:23:28 < 502 RFC 2228 authentication not implemented.
exit status 1

回答

这个错误的根源很清晰:你的FTP服务器不支持FTPS(基于TLS加密的FTP协议),但你在代码里主动调用了client.AuthTLS()方法,触发了AUTH TLS命令,服务器无法识别这个命令,所以返回了502错误。

核心修复步骤

直接移除代码中所有和AuthTLS相关的逻辑,改用普通FTP方式登录即可:

修改后的main函数:

func main() {
 // connect to FTP
 client, err := goftp.ConnectDbg("192.168.206.226:21")
 if err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
 defer client.Close()

 // 移除AuthTLS相关代码,直接登录
 if err := client.Login("aaa", "bbbb"); err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
 // upload new S10 file using FTP
 err = filepath.Walk("c:\\Temp", upload)
 if err != nil {
  fmt.Println(err)
  os.Exit(1)
 }
}

额外修复:上传函数的逻辑问题

你的upload函数还有个小bug:当找到名为"S10"的文件时,你用strings.TrimSuffix(path, f.Name())得到了文件所在目录,然后去打开这个目录(而不是文件本身),这会导致文件打开失败。同时也应该先处理filepath.Walk传入的错误,避免遍历出错时崩溃:

修改后的upload函数:

func upload(path string, f os.FileInfo, err error) error {
 // 先处理Walk过程中可能出现的错误
 if err != nil {
  return err
 }
 // 跳过目录,只处理文件
 if f.IsDir() {
  return nil
 }
 if strings.Compare(f.Name(), "S10") == 0 {
  // 直接打开文件的完整路径
  file, err := os.Open(path)
  if err != nil {
   fmt.Println(err)
   return err
  }
  defer file.Close()
  if err := client.Stor("/sd1/myFile", file); err != nil {
   fmt.Println(err)
   return err
  }
 }
 return nil
}

这样修改后,应该就能正常连接服务器并完成文件上传了。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:35:16