Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正确使用SSHTunnel_Python_Ssh Tunnel_Pymysql - Fatal编程技术网

Python 正确使用SSHTunnel

Python 正确使用SSHTunnel,python,ssh-tunnel,pymysql,Python,Ssh Tunnel,Pymysql,我试图在python2.7中使用pymysql和sshtunnel来隧道我的连接,这样我就可以连接到只能通过bastion服务器访问的mysql实例。bastion服务器的主机名为BASTIONIP,该服务器可以毫无问题地连接到MYSQLHOST。然而,python似乎无法通过隧道进行连接。下面是我的代码: with sshtunnel.SSHTunnelForwarder( (BASTIONIP, 22), ssh_username='d

我试图在python2.7中使用
pymysql
sshtunnel
来隧道我的连接,这样我就可以连接到只能通过bastion服务器访问的mysql实例。bastion服务器的主机名为
BASTIONIP
,该服务器可以毫无问题地连接到
MYSQLHOST
。然而,python似乎无法通过隧道进行连接。下面是我的代码:

    with sshtunnel.SSHTunnelForwarder(
            (BASTIONIP, 22),
            ssh_username='dataengineer',
            ssh_pkey="/Users/USERNAME/.ssh/id_rsa",
            remote_bind_address=(MYSQLHOST, 3306),
            local_bind_address=(MYSQLHOST, 3306)
    ) as tunnel:
        self.DB = {'con': pymysql.connect(host=MYSQLHOST,
                                          user=USERNAME,
                                          passwd=PASSWORD,
                                          db=DBNAME,
                                          port=tunnel.local_bind_port,
                                          charset='utf8',
                                          autocommit=True)}
        self.DB['cursor'] = self.DB['con'].cursor(pymysql.cursors.DictCursor)
但是,当我尝试连接时,出现以下错误:

  File "/Library/Python/2.7/site-packages/sshtunnel.py", line 1378, in _get_local_interfaces
    local_if = socket.gethostbyname_ex(socket.gethostname())[-1]
gaierror: [Errno 8] nodename nor servname provided, or not known

有人能指出我做错了什么吗?

在谷歌搜索之后,我可以找出以下可能的原因:

  • 不确定,这是由于_get_local_接口试图解析本地主机名,但失败了(可能只是一个坏的/etc/hosts文件或其他东西)
  • 尝试以root
    /etc/hosts
    文件的形式打开,并添加一行,如下所示

    # IP ADDR      HOSTNAME
    192.168.1.1    your_desired_hostname
    
    名称应该是解析的。 使用您的ip地址更新
    192.168.1.1

  • 另一项决议: 替换:
  • local\u if=socket.gethostbyname\u ex(socket.gethostname())[-1]


    在谷歌搜索之后,我可以找出以下可能的原因:

  • 不确定,这是由于_get_local_接口试图解析本地主机名,但失败了(可能只是一个坏的/etc/hosts文件或其他东西)
  • 尝试以root
    /etc/hosts
    文件的形式打开,并添加一行,如下所示

    # IP ADDR      HOSTNAME
    192.168.1.1    your_desired_hostname
    
    名称应该是解析的。 使用您的ip地址更新
    192.168.1.1

  • 另一项决议: 替换:
  • local\u if=socket.gethostbyname\u ex(socket.gethostname())[-1]

    就像一个符咒

    In [1]: from sshtunnel import SSHTunnelForwarder
       ...:     ...: 
       ...:     ...: with SSHTunnelForwarder(
       ...:     ...:     ('xx.xx.xx.xx', 22),
       ...:     ...:     ssh_username='deploy',
       ...:     ...:     ssh_pkey='~/.ssh/id_rsa',
       ...:     ...:     remote_bind_address=('127.0.0.1', 3306),
       ...:     ...:     local_bind_address=('0.0.0.0', 3307)
       ...:     ...: ) as tunnel:
       ...:     ...:     print('pass')
       ...: 
       ...:     
    pass
    
    工作起来很有魅力

    In [1]: from sshtunnel import SSHTunnelForwarder
       ...:     ...: 
       ...:     ...: with SSHTunnelForwarder(
       ...:     ...:     ('xx.xx.xx.xx', 22),
       ...:     ...:     ssh_username='deploy',
       ...:     ...:     ssh_pkey='~/.ssh/id_rsa',
       ...:     ...:     remote_bind_address=('127.0.0.1', 3306),
       ...:     ...:     local_bind_address=('0.0.0.0', 3307)
       ...:     ...: ) as tunnel:
       ...:     ...:     print('pass')
       ...: 
       ...:     
    pass
    

    local\u bind\u address
    在您的计算机上而不是mysql服务器上,请尝试将其设置为localhost:
    local\u bind\u address=('localhost',3306)
    local\u bind\u address=('127.0.0.1',3306)
    当我尝试将
    local bind\u address
    更改为
    localhost
    时,也会出现相同的错误,
    127.0.0.1
    0.0.0.0
    。请注意,这是在运行于
    0.0.0:8080
    local\u bind\u address
    上的django应用程序中运行的,而不是在mysql服务器上,请尝试将其设置为localhost:
    local\u bind\u address=('localhost',3306)
    local\u bind\u address=('127.0.1',3306)
    当我尝试将
    本地绑定地址
    更改为
    localhost
    127.0.0.1
    0.0.0
    时,我遇到了相同的错误。请注意,这是在运行于
    0.0.0.0:8080