Paramiko检查SSH服务器的登录超时

时间:2015-10-23 14:30:29

标签: python paramiko

我想知道如果用户没有登录,我的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确实如此,我想进入登录界面。

Login Screen

我想检查服务器关闭连接所需的时间。

enter image description here

有没有办法通过paramiko这样做?

1 个答案:

答案 0 :(得分:1)

您不一定需要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

您甚至可以通过使用try_catch覆盖No authentication methods available来删除self.sshobj._auth的第一个NOP。以下是对第一个变体的一些更改:

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触发器就像交换横幅时的服务器端套接字读取超时一样。因此,您只需要建立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")

非paramiko变体更加准确。