Paramiko没有关闭SSH连接 - 多线程

时间:2016-02-24 14:59:36

标签: python multithreading python-2.7 ssh paramiko

我正在使用paramiko发起ssh个关联。看来,在运行我的脚本时,一旦建立了连接,它们就不会被关闭。相反,直到TIME_WAIT在连接终止之前耗尽。我知道TIME_WAIT代表等待足够的时间来确保远程TCP收到其连接终止请求的确认。

这是我的代码:

#!/usr/local/bin/python2.7
import sys, os, string, threading
import paramiko

paramiko.util.log_to_file("paramiko.log")

cmd = "hostname"

outlock = threading.Lock()

def workon(host):

    ssh = paramiko.SSHClient()
    key = paramiko.RSAKey.from_private_key_file("./key")
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(host, username='user', pkey=key)
    stdin, stdout, stderr = ssh.exec_command(cmd)

    with outlock:
        result = stdout.readlines()
        print "{0}".format(hostname[0])
        ssh.close()

def main():

    with open('./ip_list') as ip:
        hosts = ip.read().splitlines()

    threads = []
    for h in hosts:
        t = threading.Thread(target=workon, args=(h,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

if __name__ == "__main__":
    main()

也许这是正常行为但我想确定。在数百个IP地址上运行时,在脚本完成后,有大量的套接字在服务器上保持打开几分钟。

令我困惑的是,套接字在连接时获得ESTABLISHED,并在之后转到TIME_WAIT - 即使我没有调用close()方法。这是预期的行为吗?我是否应该打扰调用close()方法?有没有“更好”的方法呢?

1 个答案:

答案 0 :(得分:1)

TIME_WAIT是您在干净地关闭连接时应该去的状态。因此,你应该等待,以确保对方看到'你的FIN/ACK。当你突然退出而没有打电话给close()时,同样会在清理时发生。

直接使用套接字,您可以立即关闭连接并立即使用'释放资源(如果这是您想要的),但不建议按documentation进行。实际上会发生的事情是,在套接字上调用close()并没有真正关闭套接字,而是等待GC清理它。结果,RST/ACK数据包被发送到另一方。因此,它将继续使用资源,直到GC关闭,连接才能正常关闭。