paramiko SSHClient连接卡住了

时间:2014-11-09 05:26:28

标签: python import connect paramiko

我有3个源代码(主要和从中导入)。

test.py - 只导入文件

import test_child

test_child.py - 导入文件中定义的调用函数

import test_grandchild

test_grandchild.check_sshd()

test_grandchild.py - 定义函数

import paramiko

def check_sshd():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print('checking ssh connection to local host')
    client.connect('127.0.0.1')
    client.close()
    print('finished')

check_ssd()仅用于检查sshd是否在localhost上运行,因此我希望在sshd未运行时发生身份验证,否则会出现套接字错误。 当我运行test_child.py时,结果是我期待的。但是paramiko客户端被卡在了connect()上,我必须终止这个过程。

$ python test.py                                                                        
checking ssh connection to local host
^CTraceback (most recent call last):
  File "test.py", line 4, in <module>
    import test_child
  File "/root/tests/test_child.py", line 6, in <module>
    test_grandchild.check_sshd()
  File "/root/tests/test_grandchild.py", line 10, in check_sshd
    client.connect('127.0.0.1')
  File "build/bdist.linux-x86_64/egg/paramiko/client.py", line 242, in connect
  File "build/bdist.linux-x86_64/egg/paramiko/transport.py", line 342, in start_client
  File "/usr/lib64/python2.7/threading.py", line 621, in wait
    self.__cond.wait(timeout, balancing)
  File "/usr/lib64/python2.7/threading.py", line 361, in wait
    _sleep(delay)
KeyboardInterrupt

我该如何解决这个问题?

CentOS 7上的Paramiko 1.12.4

感谢。

1 个答案:

答案 0 :(得分:0)

Paramiko 使用线程库将任务分发到不同的线程,然后设置事件,然后它们相互通信并返回输出。这里的问题是 test.py ,你只是导入test_child而不是专门调用它的任何函数。

因此,调用 check_sshd()的执行点是 test_child.py 而不是 test.py 。因此未设置线程事件。所以对于这个你要么从同一个文件调用函数,要么你需要专门从test.py调用函数而不是只导入文件。

<强> test.py

import test_child

test_child.check_ssh_connection()

<强> test_child.py

import test_grandchild
def check_ssh_connection():
    test_grandchild.check_sshd()

<强> test_grandchild.py

import paramiko

def check_sshd():
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print('checking ssh connection to local host')
    client.connect('127.0.0.1')
    client.close()
    print('finished') 

希望这可以解决您的问题。