Python 选择用于ftp连接的ip地址

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

我有个问题。我的NIC有几个辅助ip地址。 我无法在python中找到ftp库,该库允许选择用于连接ftp服务器的ip地址。 有人知道如何实现它吗?我查看了原始套接字,也没有找到它。 例如,我知道它是在jmeter中为http/https实现的,但出于某种原因,它不是为ftp实现的

非常感谢您的帮助。

如所述,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())
如所述,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中有很多代码