我有3个源代码(主要和从中导入)。
import test_child
import test_grandchild
test_grandchild.check_sshd()
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
感谢。
答案 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')
希望这可以解决您的问题。