gru*_*eer 5 python ssh networking portforwarding
在我的公司,我们目前有一个 REST API,只能通过特定的跳转盒访问。
我想从运行我的 Python 代码的服务器 ssh 到此框,以进行其余调用。
我在下面编写了这段代码,但是当我运行它时,它挂起并且没有执行任何操作:
from sshtunnel import SSHTunnelForwarder
import requests
remote_user = 'me'
remote_host = 'jump.box.net'
remote_port = 22
local_host = '10.30.22.218'
local_port = 443
server = SSHTunnelForwarder(
(remote_host, remote_port),
ssh_username=remote_user,
ssh_private_key_password='mypassword',
ssh_private_key='~/.ssh/mykey',
remote_bind_address=(local_host, local_port),
)
server.start()
r = requests.get(url = 'https://ourinternalendpoint.com/api/stuff',verify=False).content
print(r)
server.stop()
Run Code Online (Sandbox Code Playgroud)
本地主机 IP 实际上是我们的内部端点域的 IP。
我究竟做错了什么?我知道远程主机名是正确的,端口、用户、ssh-ing 的私钥和密码也是正确的。
server.start() 命令也完成。它挂在 get 请求上。
我是在 Linux 服务器上执行此操作的,如果需要,我愿意使用 Bash 为我的 Python 脚本进行端口转发。
我设法解决了这个问题!主要更改是代码:
from sshtunnel import SSHTunnelForwarder
import requests
import paramiko
pkey = paramiko.RSAKey.from_private_key_file(private_key_path, password=private_key_password)
server = SSHTunnelForwarder(
(remote_host, ssh_port),
ssh_username=remote_user,
ssh_private_key=pkey,
remote_bind_address=('internal_url.com', 443),
local_bind_address=('localhost', 1478)
)
server.start()
try:
r = requests.get(url = 'https://internal_url:1478/some/endpoint',verify=False)
finally:
server.stop()`
Run Code Online (Sandbox Code Playgroud)
我还必须添加到 /etc/hosts: 的映射,我必须添加这样的行:
127.0.0.1 internal_url
Run Code Online (Sandbox Code Playgroud)