更新帖子
我正在尝试使用 pymsql 游标对象访问远程服务器并下拉数据。该远程服务器位于供应商的 AWS 帐户上,可通过与我公司的公共子网之一的 Transit Gateway 连接进行访问。我拥有 SQL Server 实例的凭据,我有一个已列入白名单的 EC2,并且远程网络具有允许连接的访问规则。使用此 EC2,我可以成功执行 ELT python 代码并带来我需要的数据。
我现在想做的是使用 EC2 作为跳转服务器从本地计算机连接到远程 sql 服务器,但收到错误。在从https://stackoverflow.com/users/850848/martin-prikryl对我的原始帖子进行评论反馈后,我被引导至https://stackoverflow.com/users/850848/martin-prikryl。当我尝试实现此代码时失败。第一部分是通过以下方式初始化堡垒主机:
from sshtunnel import SSHTunnelForwarder
private_key_path = 'c:\\Users\\*****\\Documents\\****.pem'
private_key = paramiko.RSAKey(filename=private_key_path)
print("Before SSHTunnelForwarder")
with SSHTunnelForwarder(
'bastion_host',
ssh_username="ec2-user", ssh_pkey=private_key,
remote_bind_address=('**.***.***.***', 22),
ssh_private_key_password="") as bastion:
print("Inside SSHTunnelForwarder")
bastion.start()
以下内容打印到终端:
2023-12-20 12:00:39,390|错误|密钥 C:\Users****/.ssh\id_ed25519 需要密码 在使用 SSHTunnelForwarder 之前
2023-12-20 12:00:41,698|错误|无法解析 bastion_host 的 IP 地址,正在中止!
并引发以下异常:
---------------------------------------------------------------------------
BaseSSHTunnelForwarderError Traceback (most recent call last)
Cell In[9], line 9
5 private_key = paramiko.RSAKey(filename=private_key_path)
7 print("Before SSHTunnelForwarder")
----> 9 with SSHTunnelForwarder(
10 'bastion_host',
11 ssh_username="ec2-user", ssh_pkey=private_key,
12 remote_bind_address=('**.***.***.***', 22),
13 ssh_private_key_password="") as bastion:
14 print("Inside SSHTunnelForwarder")
15 bastion.start()
File c:\Users\USERNAME\pyenvironments\DataEng\Lib\site-packages\sshtunnel.py:1608, in SSHTunnelForwarder.__enter__(self)
1606 def __enter__(self):
1607 try:
-> 1608 self.start()
1609 return self
1610 except KeyboardInterrupt:
File c:\Users\USERNAME\pyenvironments\DataEng\Lib\site-packages\sshtunnel.py:1331, in SSHTunnelForwarder.start(self)
1329 self._create_tunnels()
1330 if not self.is_active:
-> 1331 self._raise(BaseSSHTunnelForwarderError,
1332 reason='Could not establish session to SSH gateway')
1333 for _srv in self._server_list:
1334 thread = threading.Thread(
1335 target=self._serve_forever_wrapper,
1336 args=(_srv, ),
1337 name='Srv-{0}'.format(address_to_str(_srv.local_port))
1338 )
File c:\Users\USERNAME\pyenvironments\DataEng\Lib\site-packages\sshtunnel.py:1174, in SSHTunnelForwarder._raise(self, exception, reason)
1172 def _raise(self, exception=BaseSSHTunnelForwarderError, reason=None):
1173 if self._raise_fwd_exc:
-> 1174 raise exception(reason)
1175 else:
1176 self.logger.error(repr(exception(reason)))
BaseSSHTunnelForwarderError: Could not establish session to SSH gateway
注:
ssh -i "***.pem" ec2-user@ec2-**-***-***-***.compute-1.amazonaws.com
sshtunnel
在~/.ssh
文件夹中发现了另一个密钥并尝试使用。由于密钥已加密,并且您未指定任何密码,因此连接失败。我认为这是图书馆的错误行为。
要解决此问题,请将
host_pkey_directories
设置为空列表,以避免 sshtunnel
自动尝试 ~/.ssh
文件夹中的按键。
with SSHTunnelForwarder(
'bastion_host',
ssh_username="ec2-user", ssh_pkey=private_key,
remote_bind_address=('**.***.***.***', 22),
ssh_private_key_password="",
host_pkey_directories=[]) as bastion:
从其他错误消息来看,
bastion_host
似乎不是有效/可路由的主机名。