2016-11-04 99 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