Python实现跨机器隧道打通

场景

有一个机房,机房内的机器与外界网络不通,但是机房提供了一台机器让我们可以访问到机房内的机器,对于这台机器我们称为跳板机。同时提供对外的服务部署在机房外的一台机器上,现在需要访问到跳板机或者机房内机器(ssh)。如图

其中api_server可以免密登录jump_server,jump_server可以免密登录private_server

ssh到jump server

python 复制代码
client = paramiko.SSHClient()
# client.load_system_host_keys()
# 允许连接不在know_hosts文件中的主机
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='jump_server_ip', port=22, username='root', password='pwd')
# 私钥方式
# pkey = paramiko.RSAKey.from_private_key_file(id_rsa_path)  # 私钥
# client.connect(hostname=hostname, port=port, username=username, pkey=pkey)  
stdin, stdout, stderr = client.exec_command('pwd')  # 执行命令
code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
client.close()

ssh到private server

python 复制代码
with sshtunnel.open_tunnel(
    ssh_address_or_host='jump_server_ip',
    ssh_username='root',
    ssh_password='pwd',
    # ssh_pkey='local_id_rda',
    remote_bind_address=('private_server_ip', 22),
    # local_bind_address=('127.0.0.1', 10022)  # 绑定本机10022端口
) as tunnel:
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', password='pwd')
    # pkey = paramiko.RSAKey.from_private_key_file('jump_id_rda')  # 跳板机的私钥
    # client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', pkey=pkey)
    stdin, stdout, stderr = client.exec_command('pwd')
    code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
    client.close()

这里其实相当于将private_server的22端口转发到到本地的一个端口,再利用paramiko连接本地的端口。private_server上并没有配置api_server的公钥,所以不能用api_server的私钥登录。但是jump_server与private_server是可以免密登录的,可以利用jump_server的私钥登录,所以我将jump_server的私钥拷到了api_server上。

相关推荐
码事漫谈19 分钟前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端
Conan在掘金1 小时前
鸿蒙报错速查:arkts-strict-typing Property does not exist on type 'object',object 装函数就炸,根因 + 真解法
后端
颜酱1 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
程序员cxuan2 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
Conan在掘金2 小时前
�鸿蒙报错速查:Cannot find name 'require',禁用 require(),根因 + 真解法
后端
隔窗听雨眠2 小时前
Spring Boot在云原生时代的编程范式革新研究
spring boot·后端·云原生
一朵小花2 小时前
记一次Docker 容器 NFS 文件写入延迟排查过程
后端
FF2501_940228584 小时前
Grid 构建月历网格:7 列模板 + 日期占位算法
后端·华为·harmonyos·鸿蒙系统
神奇小汤圆4 小时前
线程池的 DiscardPolicy 为什么是「静默杀手」?一个生产事故的完整复盘
后端