使用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
相关产品推荐
相关产品推荐

