Python 选择用于ftp连接的ip地址
我有个问题。我的NIC有几个辅助ip地址。 我无法在python中找到ftp库,该库允许选择用于连接ftp服务器的ip地址。 有人知道如何实现它吗?我查看了原始套接字,也没有找到它。 例如,我知道它是在jmeter中为http/https实现的,但出于某种原因,它不是为ftp实现的 非常感谢您的帮助。如所述,Python3标准库中的FTP客户端允许将指定为元组。除非源具有已知或静态端口,否则将端口号设置为零应选择下一个可用端口。以文档为例:Python 选择用于ftp连接的ip地址,python,networking,ftp,ip,Python,Networking,Ftp,Ip,我有个问题。我的NIC有几个辅助ip地址。 我无法在python中找到ftp库,该库允许选择用于连接ftp服务器的ip地址。 有人知道如何实现它吗?我查看了原始套接字,也没有找到它。 例如,我知道它是在jmeter中为http/https实现的,但出于某种原因,它不是为ftp实现的 非常感谢您的帮助。如所述,Python3标准库中的FTP客户端允许将指定为元组。除非源具有已知或静态端口,否则将端口号设置为零应选择下一个可用端口。以文档为例: from ftplib import FTP sou
from ftplib import FTP
source = ('192.168.1.100', 0)
destination = '172.16.1.1'
with FTP(destination, source_address=source) as ftp:
ftp.login()
print(ftp.dir())
如所述,Python3标准库中的FTP客户机允许将指定为元组。除非源具有已知或静态端口,否则将端口号设置为零应选择下一个可用端口。以文档为例:
from ftplib import FTP
source = ('192.168.1.100', 0)
destination = '172.16.1.1'
with FTP(destination, source_address=source) as ftp:
ftp.login()
print(ftp.dir())
正如我提到的,标准python ftp库有一个参数。但是,它不适用于Python2,您显然需要它 因此,我建议对python2.7进行以下修改。这就是复制粘贴
source\u address
参数的python3实现,并对其进行调整以使其工作。丑陋但是
import ftplib
import socket
class FTP(ftplib.FTP):
# KLUDGE, MANUAL BACKPORT OF source_address
# => REMOVE WHEN MOVING TO PYTHON3
def __init__(self, *args, **kwargs):
self.source_address = kwargs.pop("source_address", None)
super(FTP, self).__init__(*args, **kwargs)
def connect(self, host='', port=0, timeout=-999, source_address=None):
if host != '':
self.host = host
if port > 0:
self.port = port
if timeout != -999:
self.timeout = timeout
if source_address is not None:
self.source_address = source_address
self.sock = socket.create_connection((self.host, self.port), self.timeout,
self.source_address)
self.af = self.sock.family
self.file = self.sock.makefile('rb')
self.welcome = self.getresp()
return self.welcome
def ntransfercmd(self, cmd, rest=None):
size = None
if self.passiveserver:
host, port = self.makepasv()
conn = socket.create_connection((host, port), self.timeout,
self.source_address)
try:
if rest is not None:
self.sendcmd("REST %s" % rest)
resp = self.sendcmd(cmd)
if resp[0] == '2':
resp = self.getresp()
if resp[0] != '1':
raise ftplib.error_reply, resp
except:
conn.close()
raise
else:
sock = self.makeport()
try:
if rest is not None:
self.sendcmd("REST %s" % rest)
resp = self.sendcmd(cmd)
if resp[0] == '2':
resp = self.getresp()
if resp[0] != '1':
raise ftplib.error_reply, resp
conn, sockaddr = sock.accept()
if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
conn.settimeout(self.timeout)
finally:
sock.close()
if resp[:3] == '150':
size = ftplib.parse150(resp)
return conn, size
这就像猴子打补丁一样难看。它应该会起作用。如果您使用它,请记录此恐怖事件,以便在您移动到python3时将其删除。正如我提到的,标准python ftp库有一个参数。但是,它不适用于Python2,您显然需要它 因此,我建议对python2.7进行以下修改。这就是复制粘贴
source\u address
参数的python3实现,并对其进行调整以使其工作。丑陋但是
import ftplib
import socket
class FTP(ftplib.FTP):
# KLUDGE, MANUAL BACKPORT OF source_address
# => REMOVE WHEN MOVING TO PYTHON3
def __init__(self, *args, **kwargs):
self.source_address = kwargs.pop("source_address", None)
super(FTP, self).__init__(*args, **kwargs)
def connect(self, host='', port=0, timeout=-999, source_address=None):
if host != '':
self.host = host
if port > 0:
self.port = port
if timeout != -999:
self.timeout = timeout
if source_address is not None:
self.source_address = source_address
self.sock = socket.create_connection((self.host, self.port), self.timeout,
self.source_address)
self.af = self.sock.family
self.file = self.sock.makefile('rb')
self.welcome = self.getresp()
return self.welcome
def ntransfercmd(self, cmd, rest=None):
size = None
if self.passiveserver:
host, port = self.makepasv()
conn = socket.create_connection((host, port), self.timeout,
self.source_address)
try:
if rest is not None:
self.sendcmd("REST %s" % rest)
resp = self.sendcmd(cmd)
if resp[0] == '2':
resp = self.getresp()
if resp[0] != '1':
raise ftplib.error_reply, resp
except:
conn.close()
raise
else:
sock = self.makeport()
try:
if rest is not None:
self.sendcmd("REST %s" % rest)
resp = self.sendcmd(cmd)
if resp[0] == '2':
resp = self.getresp()
if resp[0] != '1':
raise ftplib.error_reply, resp
conn, sockaddr = sock.accept()
if self.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
conn.settimeout(self.timeout)
finally:
sock.close()
if resp[:3] == '150':
size = ftplib.parse150(resp)
return conn, size
这就像猴子打补丁一样难看。它应该会起作用。如果您使用它,请将此恐怖记录下来,以便在您移动到python3时将其删除。我认为不存在这样的库。在.NET中,如果您是客户机,则无法选择要通过哪个连接进行连接。只需调用Connect,您就可以通过“活动连接”退出。标准python ftp库有一个参数。@事实证明,它没有后端口到python 2I,我认为这样的库不存在。在.NET中,如果您是客户机,则无法选择要通过哪个连接进行连接。只需调用Connect,您就可以通过“活动连接”退出。标准python ftp库有一个参数。@事实证明,它并没有后端口到python 2nice answer,只是python 3吗?只是选中了它,python 2中不支持源地址(回答很好,只是Python3吗?只是检查了一下,Python2不支持源地址((注意:我刚刚修复了导入,如果你在我编辑之前复制粘贴,请再次复制)它起到了作用,但我不确定我们是否转移到Python3,Python2中有很多代码(注意:我刚刚修复了导入,如果您在我编辑之前复制粘贴,请再次复制)它起到了作用,但我不确定我们是否转移到Python3,Python2中有很多代码