使用EC2作为跳转服务器在Python中访问远程

问题描述 投票:0回答:1

更新帖子

我正在尝试使用 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

注:

  1. 钥匙上没有密码
  2. 我尝试指定一个空密码
  3. 跳线盒所在的安全组允许来自我的 IP 地址的 SSH 流量。
  4. 我可以通过 SSH 成功连接到跳转服务器:
    ssh -i "***.pem" ec2-user@ec2-**-***-***-***.compute-1.amazonaws.com
python amazon-web-services boto3 paramiko ssh-tunnel
1个回答
0
投票

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
似乎不是有效/可路由的主机名。

© www.soinside.com 2019 - 2024. All rights reserved.