Question

J'ai eu du succès avec les LuaSocket . Fonction TCP, mais je rencontre des problèmes avec son module FTP. J'ai toujours un délai d'attente lorsque j'essaie de récupérer un (petit) fichier. Je peux très bien télécharger le fichier avec Firefox ou ftp en mode passif (sous Ubuntu Dapper Linux).

Je pensais que j’avais peut-être besoin de LuaSocket pour utiliser le FTP passif, mais j’ai trouvé que cela semblait le faire par défaut. Le fichier que je tente de récupérer via FTP est accessible avec un FTP passif via d'autres programmes sur ma machine, mais pas via le mode actif. J'ai trouvé un peu de discussion à propos de " piratage " prise en charge du mode passif dans LuaSocket, et cette discussion implique que les versions ultérieures ont cessé d'utiliser le mode passif, mais ma version semble néanmoins utiliser le mode passif (j'utilise 2.0.1; le plus récent est 2.0.2 et ne semble pas avoir de modifications pertinentes pour mon cas d'utilisation). Je suis un peu confus quant à la manière dont ce message peut concerner ma situation, en partie parce qu'il est très ancien et que la source de LuaSocket ne ressemble plus beaucoup au code de cette discussion.

J'ai résumé mon code à ceci:

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

Cela me donne un délai d'attente. Je l'ai exécuté sous strace sous Linux (comme ptrace sous Solaris). Voici une transcription abrégée:

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)

J'ai essayé de me connecter à un autre site, mais il contient un mot de passe que je ne peux pas publier ici, mais dans ce cas, les résultats étaient légèrement différents ... J'ai obtenu une trace comme ci-dessus, mais avec , sélectionnez () réussissant à la fin, alors ceci:

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)

Comparez cela à la trace de mon " ftp " programme en mode passif (qui fonctionne bien, mais notez qu'il ne définit pas les sockets comme non bloquant comme le fait 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

J'ai donc essayé LuaSocket contre ces deux sites FTP différents avec des échecs différents mais similaires. Je l'ai aussi essayé depuis une autre machine où le FTP actif fonctionne, et ça n'a pas eu plus de chance (probablement parce que LuaSocket utilise toujours le mode passif, à ce que je peux dire en lisant le code source dans socket / ftp.lua ).

Alors, est-ce que quelqu'un ici peut faire fonctionner le LuaSocket deux lignes au sommet? Notez que sur ma machine, le FTP actif sur le site de Dell ne fonctionne pas (je peux me connecter mais dès que je le ls , il se déconnecte), donc si vous voulez que LuaSocket fonctionne, veuillez également indiquer si le FTP actif est activé. sur le site de Dell à partir d'un autre programme fonctionne sur votre ordinateur.

Était-ce utile?

La solution

Hm. Il semble que le problème est que LuaSocket utilise " pasv " en minuscule. Je vais essayer de trouver une solution de rechange.

Hm. Non, ça a l'air assez élégant soudé fermé. Le plus simple est probablement de copier ce fichier particulier à son emplacement équivalent dans une hiérarchie d'un chemin précédent de LUA_PATH. C’est-à-dire (généralement) créer une copie locale du fichier, par exemple. chemin / vers / votre / projet / socket / ftp.lua .

Editez ensuite le fichier local:

-    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"))

Perversement, une expédition de type Navelnaut utilisant getfenv, getmetatable, etc. ne semblait pas en valoir la peine. Je considère que c'est un sérieux problème de design. (de LuaSocket)

Il convient de noter que la RFC0959 utilise des commandes en majuscule. (Probablement parce que cela date de l'ère ASCII 7 bits.)

Autres conseils

Notez que le serveur ne respecte pas la spécification FTP, qui indique que les commandes ne respectent pas la casse. Voir RFC959, section 5.3 "Les codes de commande sont composés de quatre caractères alphabétiques ou moins.      Les caractères alphabétiques majuscules et minuscules doivent être traités      identiquement. Ainsi, l’un des éléments suivants peut représenter la      récupérer la commande:                  RETR RET RET RET RETR RETR "

Ce problème est maintenant résolu. La question et la réponse apportent une aide précieuse.

Luasocket correspond à la RFC 959 (le premier commentaire n’est pas correct à propos des majuscules, voir la section 5.2 de la RFC959)

Au moins, le serveur FTP Microsoft n'est pas conforme. Il pourrait y en avoir d'autres.

La solution consiste à changer pasv en PASV et constitue une solution de contournement pour un serveur sensible à la casse des commandes. Les détails se trouvent sur la liste de diffusion Lua, où les archives seront accessibles sur le Web dans quelques jours.

(modifiez la ligne 59 de ftp.lua)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top