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上。

相关推荐
mldong28 分钟前
主办先挂起,收齐意见再拍板:jeeflow 的动态会签
后端·架构
CQU_JIAKE8 小时前
11.7[高体】
java·后端·spring
Csvn9 小时前
认识 Nginx
后端·nginx
红尘散仙9 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
特立独行的猫A10 小时前
我给女儿写了个打字练习:一边敲键盘,一边把小学英语单词记牢
java·后端·python
陈随易10 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
金銀銅鐵11 小时前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
IT_陈寒14 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala14 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程