通过SSH隧道的MySQL连接 - 如何指定其他MySQL服务器?

时间:2013-08-22 06:41:12

标签: mysql ssh-tunnel

我有大约50个数据库都设置在不同的主机名,要求我通过SSH隧道连接到它们。

例如:

  • ssh.example.com

  • 上的SSH主机
  • MySQL主持人mysql1.example.com

我已经设法使用autossh(运行Debian的Web服务器)创建隧道,但我似乎无法弄清楚如何连接到SSH隧道之外的特定MySQL主机名。

键入lsof -i -n | egrep '\<ssh\>'确认隧道正在运行(将端口3307发送到ssh.example.com端口3306)

所以当我尝试mysql -h 127.0.0.1 -P 3307时,我会拒绝连接。不太奇怪,因为它不是MySQL服务器。

我向你们提问:

如何在创建SSH隧道后指定mysql1.example.com主机?我试过到处寻找,但似乎无法弄明白。

5 个答案:

答案 0 :(得分:98)

解决了!当创建隧道本身时,就是连接到正确的服务器 - 应该看到那个来了。

ssh -f user@ssh.example.com -L 3307:mysql1.example.com:3306 -N

然后mysql -h 127.0.0.1 -P 3307按预期工作。 :)

答案 1 :(得分:14)

我有一个关于如何使用SSH隧道连接到MySQL的好博客。这是非常好的解释here

连接SSH隧道的命令:

ssh -L [listening port]:[REMOTE_MYSQL_HOST]:[REMOTE_MYSQL_PORT] [SSH_USER]@[SSH_HOST]

连接MySQL的命令:

localhost:[listening port]

答案 2 :(得分:6)

如果您无法直接访问mysql-server,则可以使用jump-server

在您的计算机上,您将(ssh)连接到跳转服务器,然后从那里连接到mysql-server

使用ssh- tunneling可以避免这种情况。

假设你的

       jump server is `jump-ip`
       mysql server is `mysql-ip`
       your machine is `machine-ip`

只需打开ssh客户端(Windows中的Putty或linux / ios中的终端)。

类型:

    ssh -L [local-port]:[mysql-ip]:[mysql-port] [jump-server-user]@[jump-ip]

在此之后,您可以使用localhostlocal-port直接访问远程计算机上的mysql-server。

EG。在这种情况下,你的Jdbc url访问mysql数据库将是

jdbc:mysql://localhost:[local-port]/[database-name]

答案 3 :(得分:2)

我使用此命令

为数据库创建了一个隧道
ssh  -L 10000:localhost:3306  user@<ip addess to connect DB> -N -f

-L是本地主机端口,它是用户定义的,可以提供任何端口号

介于0到65535之间。保留0到1023。

您是否对服务器使用基于密钥的身份验证

提到这样的关键。

ssh -i <path of the private key>  -L 10000:localhost:3306  user@<ip addess to connect DB> -N -f

答案 4 :(得分:0)

如果你使用 Python,你可以尝试这样的事情:

from sshtunnel import SSHTunnelForwarder
import mysql.connector

server = SSHTunnelForwarder(
    ('aXXXXXX.ftp.XXhost.XXX'),
    ssh_password="XXXXXX",
    ssh_username="XXX_X",
    remote_bind_address=('aXXXXXX.mysql.XXhost.XXX', 3306)
)

server.start()

conn2 = mysql.connector.connect(
        host='127.0.0.1',
        port=server.local_bind_port,
        user='XXXXXX',
        passwd='XXXXXX',
        db='XXXXXX'
    )

# test

print(conn2)
cursor = conn2.cursor()     # get the cursor
cursor.execute("SHOW TABLES")    # execute 'SHOW TABLES' (but data is not returned)
print(cursor.fetchall())

# do something useful

server.stop()