问题描述
我有一个使用 github.com/jlaffaye/ftp
库从远程服务器获取 FTP 文件的 go 服务器。
我首先获得连接
conn,err := ftp.DialTimeout(cfg.Host+cfg.Port,time.Second*15)
if err != nil {
return nil,fmt.Errorf("ftp dial error: %v",err)
}
之后,我尝试登录
err = conn.Login(cfg.Username,pwd)
if err != nil {
return nil,fmt.Errorf("ftp login error: %v",err)
}
我在本地运行时登录成功。 在查看
的输出时也证实了这一点 code,msg,err := c.cmd(StatusLoggedIn,"PASS %s",password)
log.Printf("pass,code %d,msg %s,err %v",code,err)
if err != nil {
return err
}
来自 \vendor\github.com\jlaffaye\ftp\ftp.go
下我的供应商 pkg
输出为
2021/06/16 23:12:45 pass,code 230,msg User xxxx logged in,err <nil>
在运行部署在亚马逊 ECS 上的相同服务时,
\vendor\github.com\jlaffaye\ftp\ftp.go
下的 vendored pkg 的输出变为
2021/06/16 20:24:28 pass,code 0,err EOF
有人可以推荐一个可能导致这种情况的想法吗?
解决方法
从亚马逊 ECS 运行时似乎无法访问 ftp 服务器,因为 ec2 机器的 IP 地址未在 ftp 服务器中列入白名单。
使用 telnet
来自我们 VPN 后面的本地机器
# telnet ftp.xxxxxxxxx.net 21
Trying xx.xxx.xxx.xxx...
Connected to xxxxxxxxxxx.net.
Escape character is '^]'.
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [xx.xxx.xxx.xxx]
USER xxxx
331 Password required for xxxx
PASS xxxxxxxxx
230 User xxx logged in
来自不同 VPC 中的 EC2 机器
Connected to ftp.xxxxxxxxxxxx.net.
Escape character is '^]'.
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [xx.xxx.xxx.xxx]
USER xxxx
331 Password required for xxxx
PASS xxxxxxxx
Connection closed by foreign host.