iT邦幫忙

0

Python使用多線程sshtunnel是否能重複使用tunnel

  • 分享至 

  • xImage

各位好 請教各位Python使用多線程sshtunnel問題
先說明場景
20台設備需要先ssh到跳板機在ssh到設備做取資訊
並設定分批一次10台
利用多線程,使用sshtunnel連接跳板機再搭配netmiko連接設備
因為線程結束10台sshtunnel也會隨之關閉
換下一批10台在建立新的sshtunnel
代表20台設備跳板機會有20個session連接
想請教是否有保留第一次sshtunnel建立的10個通道
後續每批的線程可以直接使用這10個通道做後續netmiko連接設備的方法

以下附上簡化版程式碼

from netmiko import ConnectHandler     
from sshtunnel import open_tunnel                                  
import threading

def ssh_telnet():
    with open_tunnel( ##使用sshtunnel建立通道
                    ssh_address_or_host = (sship, sshport),
                    ssh_username = sshuser,
                    ssh_password = sshwd,
                    remote_bind_address=(ip, 22)
                   ) as tunnel:
                    try:
                        session = ConnectHandler()##這裡是使用netmiko連接設備
                        ##這裡執行連接設備的工作##
                        
                        
                                               
                        
if __name__ == '__main__':
    threads = []
    start_time = time.time()
    for i in range(10):
        thread = threading.Thread(target=ssh_telnet,)
        thread.start()
        threads.append(thread)
    
    for thread in threads:
        thread.join()
        
    print('完成')
    os.system("pause")

目前還未找到有相關資料,如有想法或者資訊
先謝謝各位的分享

dashuai iT邦新手 5 級 ‧ 2024-01-28 18:08:17 檢舉
避免每次創建新線程時都重新建立到跳板機的SSHTunnel連接。 為了解决這個問題,您可以考慮將SSHTunnel實例作為全域變數存儲,並在每個線程中複用這個已建立的通道。
下麵是一個簡化後的示例,展示了如何創建一個全域的SSHTunnel實例並供多個線程共亯使用:
from sshtunnel import SSHTunnelForwarder
from netmiko import ConnectHandler
import threading
import time
import os

# 初始化全局SSHTunnelForwarder对象
global_tunnel = None

def establish_tunnel():
global global_tunnel
if not global_tunnel:
global_tunnel = SSHTunnelForwarder(
ssh_address_or_host=(sship, sshport),
ssh_username=sshuser,
ssh_password=sshwd,
remote_bind_address=(ip, 22)
)
global_tunnel.start()

def ssh_telnet(device_info):
# 确保SSHTunnel已经建立
establish_tunnel()

with global_tunnel.open_channel() as channel:
try:
device_connection = ConnectHandler(ssh_channel=channel)
# 在这里执行连接设备的工作
...
finally:
device_connection.disconnect()

if __name__ == '__main__':
devices = [...] # 存储设备信息的列表
threads = []

# 建立SSHTunnel
establish_tunnel()

for info in devices:
thread = threading.Thread(target=ssh_telnet, args=(info,))
thread.start()
threads.append(thread)

for thread in threads:
thread.join()

# 关闭全局SSHTunnel
global_tunnel.stop()

print('完成')
os.system("pause")
謝謝提供方法,我再來測試看看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答