我有大约50个数据库都设置在不同的主机名,要求我通过SSH隧道连接到它们。
例如:
ssh.example.com
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
主机?我试过到处寻找,但似乎无法弄明白。
答案 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]
在此之后,您可以使用localhost
和local-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()