ftp - LuaSocket FTP 总是超时

标签 ftp lua luasocket passive-mode

我已经成功使用 LuaSocket 的 TCP 工具,但我在使用它的 FTP 模块时遇到了问题。尝试检索(小)文件时,我总是超时。我可以在被动模式下使用 Firefox 或 ftp 下载文件(在 Ubuntu Dapper Linux 上)。

我想可能是我需要LuaSocket来使用被动FTP,但后来我发现它似乎默认这样做了。我试图通过 FTP 检索的文件可以通过我机器上的其他程序使用被动 FTP 访问,但不能通过主动模式访问。我发现 some talk 关于将被动模式支持“破解”到 LuaSocket 中,并且该讨论暗示后来的版本停止使用被动模式,但我的版本似乎仍然使用被动模式(我正在使用 2.0.1;最新的是 2.0.2 并且没有似乎有与我的用例相关的任何更改)。我对那篇文章与我的情况有何关系感到有点困惑,部分原因是它非常古老,而且 LuaSocket 的源代码现在与该讨论中的代码几乎没有相似之处。

我已经将我的代码归结为:

local ftp = require "socket.ftp"
ftp.TIMEOUT = 10
print(ftp.get("ftp://ftp.us.dell.com/app/dpart.txt"))

这让我超时。我在 Linux 上的 strace 下运行它(与 Solaris 上的 ptrace 相同)。这是一个删节的成绩单:

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
recv(3, "230-Welcome to the Dell FTP site."..., 8192, 0) = 971
send(3, "pasv\r\n", 6, 0)               = 6
recv(3, 0x8089a58, 8192, 0)             = -1 EAGAIN (Resource temporarily unavailable)
select(4, [3], NULL, NULL, {9, 999934}) = 0 (Timeout)

我尝试连接到另一个网站,但它有一个密码,我不能在这里发布,但在那种情况下,结果略有不同......我得到了与上面类似的跟踪,但使用了 select() 最后成功,然后是:

recv(3, "227 Entering Passive Mode (123,456,789,0,12,34)\r\n", 8192, 0) = 49
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
fcntl64(4, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
connect(4, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("123.456.789.0")}, 16) = -1 EINPROGRESS (Operation now in progress)
select(5, [4], [4], NULL, {9, 999694})  = 0 (Timeout)

将此与被动模式下我的“ftp”程序的跟踪进行比较(它工作正常,但请注意它不会像 LuaSocket 那样将套接字设置为非阻塞):

socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 6
write(5, "PASV\r\n", 6)                 = 6
read(3, "227 Entering Passive Mode (123,456,789,0,12,34)\r\n", 1024) = 51
connect(6, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("123.456.789.0")}, 16) = 0

因此,我针对这两个不同但相似的失败尝试了 LuaSocket。我还在另一台主动 FTP 工作的机器上尝试过它,但它在那里没有更好的运气(大概是因为 LuaSocket 总是使用被动模式,从我通过阅读 socket/ftp.lua 中的源代码可以看出)。

那么这里的任何人都可以使顶部的 LuaSocket 两行工作吗?请注意,在我的机器上,到戴尔网站的事件 FTP 不起作用(我可以连接,但只要我这样做 ls 它就会断开连接),所以如果你让 LuaSocket 工作,请注意是否事件 FTP从另一个程序访问 Dell 的网站可以在您的机器上运行。

最佳答案

嗯。看起来问题是 LuaSocket 使用小写的“pasv”。我将尝试找出解决方法。


嗯。不,它看起来非常优雅地焊接关闭。最简单的做法可能是将 那个特定文件 复制到 LUA_PATH 中较早路径的层次结构中的等效位置。也就是说,(通常)制作文件的本地副本,例如path/to/your/project/socket/ftp.lua.

然后编辑本地文件:

-    self.try(self.tp:command("user", user or USER))
+    self.try(self.tp:command("USER", user or USER))
-        self.try(self.tp:command("pass", password or PASSWORD))
+        self.try(self.tp:command("PASS", password or PASSWORD))
-    self.try(self.tp:command("pasv"))
+    self.try(self.tp:command("PASV"))
-    self.try(self.tp:command("port", arg))
+    self.try(self.tp:command("PORT", arg))
-    local command = sendt.command or "stor"
+    local command = sendt.command or "STOR"
-    self.try(self.tp:command("cwd", dir))
+    self.try(self.tp:command("CWD", dir))
-    self.try(self.tp:command("type", type))
+    self.try(self.tp:command("TYPE", type))
-    self.try(self.tp:command("quit"))
+    self.try(self.tp:command("QUIT"))

相反,使用 getfenv、getmetatable 等的 navelnaut 探险似乎并不值得。我认为这是一个严重的设计问题。 (LuaSocket 的)

值得注意的是 RFC0959使用全大写命令。 (可能是因为它来自 7 位 ASCII 时代。)

关于ftp - LuaSocket FTP 总是超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210371/

相关文章:

lua - V-REP 的 Lua `tonumber` 在 Linux 上返回 nil

java - 适用于 Android 的 LuaJava?

Lua Socket : How to send asynchronous http. 请求?

LuaLanes 和 LuaSockets

windows - 如何在 luasocket 3 中使用 Lua 5.2

php - 如何从命令行同步 FTP 目录?

java - 使用 java ftp 检查 mainfame 上是否存在数据集

c - fptd 0.17 和目录访问

Ant FTP 任务失败 : java.net.SocketException

events - 5秒内按任意键