gpt4 book ai didi

python-3.x - 如何使用套接字连接到 FTP 服务器?

转载 作者:行者123 更新时间:2023-12-03 11:52:53 29 4
gpt4 key购买 nike

我正在尝试创建一个简单的 FTP 客户端,但不知何故无法建立 FTP 连接。

我使用了以下代码:

import socket 
sock = socket.socket()
sock.connect(('localhost', 21))
data = 'USER adm\r\n'.encode()
sock.send(data)
print('Close')
sock.close()

我尝试连接的 FTP 服务器的日志如下所示:

(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> Connected on port 21, sending welcome message...
(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> 220-FileZilla Server 0.9.60 beta
(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> 220-written by Tim Kosse (tim.kosse@filezilla-project.org)
(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> 220 Please visit https://filezilla-project.org/
(048507)01.05.2018 06:00:03 - (not logged in) (127.0.0.1)> disconnected.



我尝试发送 USER adm命令,但在日志中找不到它。如何使用套接字建立与 FTP 服务器的成功连接?

最佳答案

有几个可能的时间问题。

FTP 是一种“服务器先说话”的协议(protocol)。您在日志中看到的 220 横幅是由服务器在接受连接后立即发送的。客户端应该在发送任何命令之前阅读该横幅。 (如果你得到任何不是 220 的数字代码,服务器就不愿意说话。)

出于测试目的,我建议您从服务器读取并将您读取的任何内容打印到标准输出。您的服务器的 220 横幅是多行 FTP 响应的示例,其中数字代码后跟第一行的连字符,最后一行是空格。您应该继续阅读,直到在数字代码后出现一行空格。

如果您不这样做,只需发送 USER连接完成后,您会立即说话。根据您的客户端代码运行的速度,服务器可能会在预期命令之前收到命令,这可以解释为什么它没有响应。

另一个可能的问题是您在发送 USER 后立即关闭连接。 ,无需等待响应。服务器也可能会注意到这一点。即使它没有尝试检测奇怪的客户端行为,它也可能在尝试发送响应时收到写入错误,这可以解释为什么它没有正常记录。

伪代码中 FTP 客户端的整体结构是

connect
read response (banner)
while not done:
send command
read response
send QUIT
read response
close

(这忽略了真正有趣的部分,即管理数据连接,但您还没有做到这一点)。

对于您只想到达 USER 的测试,您至少需要:
connect
read banner
send USER
read response
close

(跳过 QUIT 可能不会造成任何伤害)

请注意,允许服务器对任何命令返回多行响应,包括 USER ,因此您应该始终检查数字代码后的空格。编写一个子程序来读取单个 FTP 响应并在每个命令之后调用它是一个好主意。

关于python-3.x - 如何使用套接字连接到 FTP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50117522/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com