簡體   English   中英

並行SSH-在特定時間后如何關閉ssh通道?

[英]Parallel-SSH - how to close ssh channel after a certain time?

好的,所以這個問題的答案很可能就是“停止使用parallel-ssh,並使用netmiko / paramiko編寫您自己的代碼。而且,已經升級到python3。”

但是,這是我的問題:我正在使用parallel-ssh嘗試一次命中多達80台設備。 眾所周知,這些設備不可靠,在提供一兩行輸出后有時會凍結。 然后,parallel-ssh代碼掛起了幾個小時,使腳本運行良好,直到我將其殺死為止。 一個周末后,我跳到運行腳本的VM上,看到一份工作被困了52個小時。

我的第一個代碼的相關部分,即掛起的代碼:

from pssh.pssh2_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

我嘗試的下一件事情是channel_timout選項,因為如果要花費超過4分鍾的時間來獲取命令輸出,那么我知道設備凍結了,我需要繼續並在腳本中稍后循環:

from pssh.pssh_client import ParallelSSHClient
def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, channel_timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return result

這個版本實際上從未連接任何東西。 有什么建議嗎? 我沒有找到除channel_timeout以外的任何內容,以嘗試在一定時間后終止ssh會話。

該代碼在函數內創建一個客戶端對象,然后將包含遠程通道的run_command的輸出返回到SSH服務器。

由於client對象永遠不會由函數返回,因此它超出了范圍,並由Python關閉了連接所收集的垃圾。

嘗試在封閉的連接上使用遠程通道將永遠無法進行。 如果捕獲滯留腳本的堆棧跟蹤,則很可能是使用遠程通道或連接掛起的。

更改代碼以使客戶端保持活動狀態。 理想情況下,客戶端也應被重用。

from pssh.pssh2_client import ParallelSSHClient

def remote_ssh(ip_list, ssh_user, ssh_pass, cmd):
  client = ParallelSSHClient(ip_list, user=ssh_user, password=ssh_pass, timeout=180, retry_delay=60, pool_size=100, allow_agent=False)
  result = client.run_command(cmd, stop_on_errors=False)
  return client, result

在跳到無法解決問題的結論之前,請確保您了解代碼在哪里出了問題,即捕獲有關堆棧懸掛位置的堆棧跟蹤。 相同的代碼執行相同的操作將破壞相同的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM