我想知道如果用户没有登录,我的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这样做?
答案 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变体更加准确。