通过 ssh 隧道访问远程数据库 (Python 3)
Access remote DB via ssh tunnel (Python 3)
我无法理解(即使在阅读了几篇专门介绍 ssh tunelling 的文章之后)此脚本中 CLI ssh 命令的哪些参数。
基本上我必须连接到某个服务器(我称之为 'ssh_tunnel_host:22'),而不是使用此隧道连接到 db_host。
with SSHTunnelForwarder(
('ssh_tunnel_host', 22),
ssh_username="ssh_username",
ssh_pkey="/somepath/id_rsa",
local_bind_address=('0.0.0.0', 1234),
remote_bind_address=('127.0.0.1', 3306)
) as tunnel:
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('127.0.0.1', 1234)
db_connection = pymysql.connect(host=db_host, port=3306, db='mysql', user='user',
password='password', charset='utf8mb4')
谁能给我解释一下:
- 什么是 local_bind_address - 是我的本地地址还是 ssh_tunnel_host 本地地址?哪里可以知道IP和端口?
- 取决于前面的问题 - remote_bind_address 是什么 - 它是 ssh_tunnel_host 还是 db_host 的地址?哪里可以知道这些IP和端口?
- 我应该在哪里连接 client.connect()?本地绑定还是远程绑定?
(我确实尝试阅读文档,但它仍然一团糟)
将其视为代理连接。你连接到 ssh_tunnel_host:22
并告诉它从它的 <db host>:3306
代理连接,这意味着 db_host
上的端口 3306 被 ssh_tunnel_host
访问给你,客户端。
您可以指定您希望代理连接可用的本地(给您)ip:port,或者让客户端选择一个免费的。省略 local_bind_address
会执行后者。
然后您连接到您的本地端口,该端口实际上是 remote_bind_address:3306
的代理。
local_bind_address
<-> ssh_tunnel_host
<-> remote_bind_address
代码应该是:
db_host = '<address reachable only by ssh_tunnel_host>'
with SSHTunnelForwarder(
('ssh_tunnel_host', 22),
ssh_username="ssh_username",
ssh_pkey="/somepath/id_rsa",
remote_bind_address=(db_host, 3306)
) as tunnel:
port = tunnel.local_bind_port
db_connection = pymysql.connect(
host='127.0.0.1', port=port, db='mysql', user='user',
password='password', charset='utf8mb4')
客户端地址本地。要么设置一个,要么让客户端从tunnel.local_bind_port
.
中选择并找到它的端口
您希望 ssh_tunnel_host
代理回给您的地址。如果它是服务器服务的本地服务,IP 将为 127.0.0.1
和服务端口。它很可能是任何其他 IP 或 ssh_tunnel_host
网络中在 SSH 隧道主机外部不可见的 IP。
无处可寻。隧道提供了一个代理远程连接的本地ip:port。一旦隧道启动,就不需要其他客户端了。只需连接到本地 ip:port.
我们的情况很相似,在尝试连接到 MS Sqlserver 数据库之前,我厌倦了确保 SSH 隧道已启动和 运行。所以我们有一个远程服务器 (ip1),我们在上面安装了一个带有 MSSqlserver 的 docker。当然,当您登录该服务器时,您可以将 docker ip 转发到该机器上的本地主机。因此,如果您是 'inside' ip1,则可以作为本地主机访问服务器。
所有版本的 MS Sqlserver 强制端口 1433 作为访问端口。
所以你有 ip1->localhost:1433->MSSqlserver
所以SSH使用简单的SSH user@ip1创建了一个访问ip1的隧道,但是你需要在远程服务器上转发localhost:1433才能像在本地一样运行。
from sshtunnel import SSHTunnelForwarder
import values
server = SSHTunnelForwarder(
(values.remote_server_ip, values.remote_server_port),
ssh_username=values.remote_server_username,
ssh_pkey=values.rsa_path+values.rsa_file,
ssh_private_key_password=values.rsa_passphrase,
remote_bind_address=(values.private_server_ip, values.private_server_port),
local_bind_address=(values.db_server_ip, values.db_server_port) )
try:
server.start()
except:
print("trouble connecting to the tunnel. we will asume it is already up")
else:
print("server is started and on port ",server.local_bind_port) # show assigned local port
在这里做一些工作
然后
try:
server.stop()
except:
print("could not stop the server. assume it is already down")
else:
print("stopped the server successfully")
和 values.py 包含
的值
remote_server_ip = "....remote ip...."
remote_server_port = 22
private_server_ip = "localhost"
private_server_port = 1433
db_server_ip = "localhost"
db_server_port = 1433
remote_server_username = "...."
rsa_passphrase = "...."
rsa_path = "˜/.ssh/"
rsa_file = "id_rsa"
我无法理解(即使在阅读了几篇专门介绍 ssh tunelling 的文章之后)此脚本中 CLI ssh 命令的哪些参数。 基本上我必须连接到某个服务器(我称之为 'ssh_tunnel_host:22'),而不是使用此隧道连接到 db_host。
with SSHTunnelForwarder(
('ssh_tunnel_host', 22),
ssh_username="ssh_username",
ssh_pkey="/somepath/id_rsa",
local_bind_address=('0.0.0.0', 1234),
remote_bind_address=('127.0.0.1', 3306)
) as tunnel:
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('127.0.0.1', 1234)
db_connection = pymysql.connect(host=db_host, port=3306, db='mysql', user='user',
password='password', charset='utf8mb4')
谁能给我解释一下:
- 什么是 local_bind_address - 是我的本地地址还是 ssh_tunnel_host 本地地址?哪里可以知道IP和端口?
- 取决于前面的问题 - remote_bind_address 是什么 - 它是 ssh_tunnel_host 还是 db_host 的地址?哪里可以知道这些IP和端口?
- 我应该在哪里连接 client.connect()?本地绑定还是远程绑定?
(我确实尝试阅读文档,但它仍然一团糟)
将其视为代理连接。你连接到 ssh_tunnel_host:22
并告诉它从它的 <db host>:3306
代理连接,这意味着 db_host
上的端口 3306 被 ssh_tunnel_host
访问给你,客户端。
您可以指定您希望代理连接可用的本地(给您)ip:port,或者让客户端选择一个免费的。省略 local_bind_address
会执行后者。
然后您连接到您的本地端口,该端口实际上是 remote_bind_address:3306
的代理。
local_bind_address
<-> ssh_tunnel_host
<-> remote_bind_address
代码应该是:
db_host = '<address reachable only by ssh_tunnel_host>'
with SSHTunnelForwarder(
('ssh_tunnel_host', 22),
ssh_username="ssh_username",
ssh_pkey="/somepath/id_rsa",
remote_bind_address=(db_host, 3306)
) as tunnel:
port = tunnel.local_bind_port
db_connection = pymysql.connect(
host='127.0.0.1', port=port, db='mysql', user='user',
password='password', charset='utf8mb4')
客户端地址本地。要么设置一个,要么让客户端从
tunnel.local_bind_port
. 中选择并找到它的端口
您希望
ssh_tunnel_host
代理回给您的地址。如果它是服务器服务的本地服务,IP 将为127.0.0.1
和服务端口。它很可能是任何其他 IP 或ssh_tunnel_host
网络中在 SSH 隧道主机外部不可见的 IP。无处可寻。隧道提供了一个代理远程连接的本地ip:port。一旦隧道启动,就不需要其他客户端了。只需连接到本地 ip:port.
我们的情况很相似,在尝试连接到 MS Sqlserver 数据库之前,我厌倦了确保 SSH 隧道已启动和 运行。所以我们有一个远程服务器 (ip1),我们在上面安装了一个带有 MSSqlserver 的 docker。当然,当您登录该服务器时,您可以将 docker ip 转发到该机器上的本地主机。因此,如果您是 'inside' ip1,则可以作为本地主机访问服务器。
所有版本的 MS Sqlserver 强制端口 1433 作为访问端口。
所以你有 ip1->localhost:1433->MSSqlserver
所以SSH使用简单的SSH user@ip1创建了一个访问ip1的隧道,但是你需要在远程服务器上转发localhost:1433才能像在本地一样运行。
from sshtunnel import SSHTunnelForwarder
import values
server = SSHTunnelForwarder(
(values.remote_server_ip, values.remote_server_port),
ssh_username=values.remote_server_username,
ssh_pkey=values.rsa_path+values.rsa_file,
ssh_private_key_password=values.rsa_passphrase,
remote_bind_address=(values.private_server_ip, values.private_server_port),
local_bind_address=(values.db_server_ip, values.db_server_port) )
try:
server.start()
except:
print("trouble connecting to the tunnel. we will asume it is already up")
else:
print("server is started and on port ",server.local_bind_port) # show assigned local port
在这里做一些工作 然后
try:
server.stop()
except:
print("could not stop the server. assume it is already down")
else:
print("stopped the server successfully")
和 values.py 包含
的值remote_server_ip = "....remote ip...."
remote_server_port = 22
private_server_ip = "localhost"
private_server_port = 1433
db_server_ip = "localhost"
db_server_port = 1433
remote_server_username = "...."
rsa_passphrase = "...."
rsa_path = "˜/.ssh/"
rsa_file = "id_rsa"