为什么使用 google cloud shell 的 ftp 站点上的 wget 会在 PASV 处超时?

为什么使用 google cloud shell 的 ftp 站点上的 wget 会在 PASV 处超时?

这里有三个非常简单的 shell 命令:

wget 'ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/Dataset_Documentation/NHIS/2016/samadult_layout.pdf'

wget 'ftp://ftp.ibge.gov.br/Censos/Censo_Demografico_2010/Resultados_Gerais_da_Amostra/Microdados/1_Atualizacoes_20160311.txt'

wget ftp://ftp.cs.ru.nl/pub/robots.txt

尝试从政府 FTP 站点提取数据。PASV然后它们就挂了。下面的截图。我需要更改一些设置吗?谢谢!

在此处输入图片描述

在此处输入图片描述

答案1

看来 Google Cloud Shell 仅允许传出端口80(HTTP),443(HTTPS),8080(有时用于 HTTP 代理),22(SSH)和21(FTP 控制通道)。也许还有其他一些端口,但绝对不是无限制的开放出站访问。

不幸的是,这对于成功的 FTP 连接来说还不够 - FTP 在单独的 TCP 连接上传输数据,该连接可以由客户端发起(被动模式)或由服务器(主动模式)。这两种方法好像都不起作用。

解决此问题的一种方法是通过 HTTP 或 HTTPS 下载文件。当然,前提是这些协议可用。例如,上一个示例中的文件可以这样检索:https://ftp.cs.ru.nl/robots.txt来自 Google Cloud Shell。

另一种方法是在端口 8080 上设置 HTTP/FTP 代理,例如在小型计算实例安装squid包上,并使用该代理下载文件。如下所示:

export ftp_proxy=http://your-instance:8080/
wget ftp://ftp.cs.ru.nl/pub/robots.txt

第三个选择显然是将 FTP 文件下载到本地机器,并通过 HTTPS 上的某些文件存储服务提供它们。

不幸的是,FTP 似乎无法从云 shell 运行,无论是主动模式还是被动模式。您必须使用上述方法之一来解决这个问题。

祝你好运:)

答案2

由于 FTP 协议的不良性质以及它如何破坏 TCP:http://slacksite.com/other/ftp.html

尝试--no-passive-ftp向 wget 添加选项,如果服务器配置为使用主动 FTP - 它可能会有所帮助。

我怀疑,其中一些服务器未配置为接受被动 FTP 或跟踪 TCP 连接之间的路由器,但未按要求识别和跟踪 FTP 连接。事实上,我能够从我的站点使用被动 FTP 进行这些操作,因此 - 问题出在 GC 和这些站点之间的某个地方。

答案3

编辑:我没有在问题标题中看到“Cloud Shell”,快速测试表明 Cloud Shell 确实不起作用。下面的答案涵盖了没有任何问题的普通情况。


事实上,它是有效的。

成功截图

以上内容来自合法的 GC 实例,在本例中是 Google 为每个 Google 帐户提供的无限制免费 GC 实例。

最初我考虑你是否编辑了网络设置。你可能没有。

然后我意识到……等等,如果你还没有,你的实例可能仍然在动态 IP 上,这可能是原因!如果你的 IP 是动态的,谷歌可能会做一些中央国家机关事务管理局可以。但不确定。

我的实例当然是使用静态 IP,这是免费的。进入VPC 网络,创建一个新的 IP 地址,返回到实例,单击该实例(您必须停止它),然后在网络接口设置新 IP。如果我没记错的话,这就是我所做的。

警告。Google 对未使用的静态 IP 收取 10c/小时的费用。您会希望立即将其与实例关联起来。

IP 地址信息:https://cloud.google.com/compute/docs/ip-addresses/

价格信息:https://cloud.google.com/compute/pricing

相关内容