2016-11-04 102 views
1

我试图在python2.7中使用pymysqlsshtunnel来隧道连接,这样我就可以连接到只能通过堡垒服务器访问的mysql实例。堡垒服务器的主机名为BASTIONIP,该服务器可以连接到MYSQLHOST,没有任何问题。但是,python似乎无法通过隧道连接。下面是我的代码:正确使用SSHTunnel

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 

任何人都可以指出我在做什么错?

+0

'local_bind_address'就在你的合作mputer不在mysql服务器上,尝试将它设置为localhost:'local_bind_address =('localhost',3306)'或'local_bind_address =('127.0.0.1',3306)' – Dalvenjia

+0

我在尝试更改时遇到同样的错误'local_bind_address'设为'localhost','127.0.0.1'或'0.0.0.0'。请注意,这是在运行于'0.0.0.0:8080'的django应用程序中运行的 – user2694306

回答

0

一些谷歌搜索后,我可以找出可能的原因是下面提到:

  1. 不能确定,这是造成_get_local_interfaces试图解决本地主机名和失败(可能只是一个坏的/ etc/hosts文件或东西)

尝试打开为根/etc/hosts文件,并添加一行类似下面

# IP ADDR  HOSTNAME 
192.168.1.1 your_desired_hostname 

和名称应该解决。 更新192.168.1.1与您的IP地址。 Here

  • 另一个分辨率: 替换:
  • local_if = socket.gethostbyname_ex(socket.gethostname())[-1]

    try: 
        local_if = socket.gethostbyname_ex(socket.gethostname())[-1] 
    except: 
        local_if = [] 
    

    Here