Vla*_*nov 3 python ssh remote-access ssh-tunnel
我什至不理解(即使在阅读了几篇有关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')
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释:
(我确实尝试阅读文档,但仍然很混乱)
将其视为代理连接。您连接到ssh_tunnel_host:22它,并告诉它从其代理服务器连接<db host>:3306,这意味着客户端db_host访问ssh_tunnel_host您的端口3306 。
您可以指定您希望代理连接可用的本地(对您)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')
Run Code Online (Sandbox Code Playgroud)
客户地址本地。设置一个,或让客户端从中选择并找到其端口tunnel.local_bind_port。
您要ssh_tunnel_host代理回信给您的地址。如果它是服务器服务的本地地址,则IP将是127.0.0.1服务的端口。可能是任何其他IP或ssh_tunnel_hostSSH隧道主机外部不可见的IP 网络中的IP 。
无处。隧道提供了一个本地ip:port代理远程连接。一旦隧道建立,就不需要其他客户端了。只需连接到本地ip:port。