簡體   English   中英

Paramiko檢查SSH服務器的登錄超時

[英]Paramiko check login timeout of SSH Server

我想看看如果用戶未登錄,ssh服務器關閉連接需要多長時間。

我到目前為止有什么

self.sshobj = paramiko.SSHClient()
self.sshobj.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.sshobj.connect("192.168.0.1", port=22, username="test", password="test")
self.channel = self.sshobj.invoke_shell()

但是問題是我不想登錄,而sshobj.connect卻要登錄,我想進入登錄屏幕。

登入畫面

我想檢查服務器關閉連接需要多長時間。

在此處輸入圖片說明

有什么辦法可以通過paramiko做到這一點嗎?

您不一定需要paramiko來檢查LoginGraceTime但是由於您特別要求它:

注意: banner_timeout只是對等ssh橫幅響應的超時。
注: timeout實際上是一個套接字讀取超時, none是無超時。 使用此設置檢查的超時時間。

self.sshobj = paramiko.SSHClient()
self.sshobj.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    self.sshobj.connect("192.168.0.1", port=22, look_for_keys=False, timeout=None, banner_timeout=5)
except paramiko.ssh_exception.SSHException, se:
    # paramiko raises SSHException('No authentication methods available',) since we did not specify any auth methods. socket stays open.
    pass
ts_start = time.time()
try:
    self.channel = self.sshobj.invoke_shell()
except EOFError, e:
    # EOFError is raised when peer terminates session.
    pass
print time.time()-ts_start

您甚至No authentication methods available通過使用NOP覆蓋self.sshobj._auth來擺脫第一個try_catch for No authentication methods availableNo authentication methods available 以下是對第一個變體的一些更改:

def noauth(username, password, pkey, key_filenames, allow_agent,
       look_for_keys, gss_auth, gss_kex, gss_deleg_creds, gss_host): pass
...
sshobj._auth = noauth
sshobj.connect("192.168.0.1", port=22, look_for_keys=False, timeout=None, banner_timeout=5)
...

但是,正如最初提到的,您甚至不需要paramiko來測試此超時,因為一旦交換橫幅, LoginGraceTime就會像服務器端套接字讀取超時LoginGraceTime觸發。 因此,您只需要建立一個TCP連接,發送一個偽造的ssh標語,然后等到遠端斷開連接:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.0.1", 22))
s.sendall("SSH-2.0-MyPythonSSHProbingClient")
s.settimeout(5*60)  # hard-limit
print s.recv(500)   # remote banner
ts_start = time.time()
if not s.recv(100):
    # exits when remote site closes connection, or raises socket.timeout when hard-limit is hit.
    print time.time()-ts_start
else:
    raise Exception("whoop, something's gone wrong")

non-paramiko變體甚至更准確。

暫無
暫無

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

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