【问题标题】:Using socket.py to make a List request towards the FTP server and get file list使用 socket.py 向 FTP 服务器发出 List 请求并获取文件列表
【发布时间】:2021-03-03 01:44:05
【问题描述】:

我需要向特定的 FTP 服务器发出请求并发出 LIST/NLST 请求以获取所有文件的列表(我想至少从当前目录开始),而不使用像 ftplib 这样的库,只使用套接字。 py。这是我的看法(ip、用户名和密码实际上已经填好了,如果可能的话,我宁愿不分享):

    port = 21
    ip = ""
    buff_size = 1024
    username = ""
    password = ""
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((ip, port))
    print(s.recv(buff_size).decode())
    s.send("USER {}\r\n".format(username).encode())
    print(s.recv(buff_size).decode())
    s.send("PASS {}\r\n".format(password).encode())
    print(s.recv(buff_size).decode())
    s.send("PASV\r\n".encode())
    print(s.recv(buff_size).decode())
    s.send("LIST\r\n".encode())
    print(s.recv(buff_size).decode())
    s.send("QUIT\r\n".encode())
    print(s.recv(buff_size).decode())

控制台的响应是:

220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
227 Entering Passive Mode (xx,xxx,xxx,xx,138,136).
425 Failed to establish connection.
221 Goodbye

在 227 和 425 代码之前大约需要 1 分钟的时间,然后才能进入 425。 我尝试了很多不同的东西(我也尝试了主动模式而不是被动模式,但我不明白我如何获得端口,我试图暴力破解它并从中获取所有可能的端口组合两个字节都为 0 到 255(变量 a 和 b),但无济于事)

s.send("PORT {}\r\n".format("xx,xxx,xxx,xx,"+str(a)+","+str(b)).encode())

但我对可能是什么原因一无所知。我不知道原因是网络/设置还是代码。 Ftplibs 似乎可以正确完成工作(我首先使用 ftplib 编写了一个应用程序只是为了测试给定的服务器),所以我认为这是代码,也许是关于安全的事情(就像我从控制台应用程序而不是从浏览器做的那样,我应该将请求作为一个发送,但我不知道它是如何完成的) 以防万一我尝试在没有路由器的情况下切换到不同的(移动)网络,结果是一样的(这与我的 ISP 或路由器无关)。防火墙也为此关闭。系统是Windows 10,我用的是PyCharm

【问题讨论】:

  • 我没有阅读规范本身,我已经阅读了针对该工作建议的培训手册,其中以 ftp 规范作为其来源。如果建议是阅读规范,我是否做错了什么?
  • 嗯。好的,我可能完全误解了 FTP,我会阅读原始规范并可能会更新帖子,谢谢。
  • 我阅读了一些规范,并且,据我了解 PASV 命令它返回给我主机的 IP 和连接的端口。我试图通过创建一个新的套接字然后发送 LIST 请求来连接它,但再一次无济于事(我的意思是,我什至无法连接)。但是,如果这个算法不正确,我怎么连接到它?将 LIST 请求发送到新套接字是否正确?
  • 我想通了,LIST 响应有效。我正在向端口 20 发送请求并从 21 读取响应。我需要发送到 21 并从 20 读取。有没有办法标记在堆栈 oveflow 或类似的东西上解决的问题?

标签: python sockets request ftp ftp-client


【解决方案1】:

我想通了,LIST 响应有效。我正在向端口 20 发送请求并从 21 读取响应。我需要发送到 21 并从 20 读取。 现在代码如下:

port = 21
ip = ""
buff_size = 1024
username = ""
password = ""

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
print(s.recv(buff_size).decode())

s.send("USER {}\r\n".format(username).encode())
print(s.recv(buff_size).decode())

s.send("PASS {}\r\n".format(password).encode())
print(s.recv(buff_size).decode())

s.send("PASV\r\n".encode())
str = s.recv(buff_size).decode()
print(str)
str = str.split(',')
lport = str[-1].replace(').\r\n','')
hport = str[-2]
newport = int(hport)*256+int(lport)

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.connect((ip, newport))

def message_data_send(command):
    s1.send(("{}".format(command)+"\r\n").encode())
    print(s.recv(buff_size).decode())

def message_command_send(command):
    s.send(("{}".format(command)+"\r\n").encode())
    print(s.recv(buff_size).decode())
    if command=='NLST':
        print(s.recv(buff_size).decode())
        print(s1.recv(buff_size).decode())
    if command=='LIST':
        s.recv(buff_size).decode()
        print(s1.recv(buff_size).decode())
message_command_send('LIST')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2016-12-29
    • 2018-05-12
    • 2020-04-18
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多