读取SSH协议bann时出现常规SSH错误

2024-09-30 05:22:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用kivy编写pythonui来使用fabric管理一些远程机器。由于我不能在Windows10上使用fabric的并行实现(请参见here),所以我希望使用并行ssh来实际执行并行远程操作。这个问题似乎是由库之间的交互引起的,而不是它们中任何一个的问题。在

我已尝试按建议手动加载私钥here

from fabric.api import execute
import pssh
from pssh.utils import load_private_key

hosts = ['192.168.0.2']
private_key = load_private_key('C:/Users/democracy/.ssh/id_rsa')
pssh_client = pssh.ParallelSSHClient(hosts, user='XXX', password='YYY', pkey=private_key)
output = pssh_client.run_command('whoami', sudo=True)
pssh_client.join(output)
for host in output:
    for line in output[host]['stdout']:
        print("Host %s - output: %s" % (host, line))

以上代码将导致以下回溯:

^{pr2}$

如果我在fabric之前导入pssh,那么上面的代码可以工作。不幸的是,如果我这么做的话,我的kivy界面上的任何按钮(在后台线程中启动任何操作)似乎永远都会被按下。如果我在按下按钮后进入控制台并发送一个键盘中断,kivy停止阻塞并开始清理,但是在退出之前从按钮按下执行命令。发送此中断时的stacktrace如下:

[INFO   ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "machine_control_ui.py", line 7, in <module>
 DemocracyControllerApp().run()
   File "C:\environments\democracy\lib\site-packages\kivy\app.py", line 828, in run
 runTouchApp()
   File "C:\environments\democracy\lib\site-packages\kivy\base.py", line 504, in runTouchApp
 EventLoop.window.mainloop()
   File "C:\environments\democracy\lib\site-packages\kivy\core\window\window_sdl2.py", line 659, in mainloop
 self._mainloop()
   File "C:\environments\democracy\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop
 EventLoop.idle()
   File "C:\environments\democracy\lib\site-packages\kivy\base.py", line 339, in idle
 Clock.tick()
   File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 553, in tick
 current = self.idle()
   File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 533, in idle
 usleep(1000000 * sleeptime)
   File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 717, in usleep
 _usleep(microseconds, self._sleep_obj)
   File "C:\environments\democracy\lib\site-packages\kivy\clock.py", line 395, in _usleep
 _kernel32.WaitForSingleObject(obj, 0xffffffff)
 keyboardInterrupt

*** BUTTON PRESS OPERATION OUTPUTS HERE ***

```

如果能深入了解为什么会发生这种情况,以及我如何避免这种情况,我将不胜感激。我可以研究其他并行ssh解决方案(尽管我认为使用paramiko的任何东西都会有相同的问题),或者手动启动每个主机的一个线程来实现并行操作(这可能有它自己的一系列令人头痛的问题),但是如果有可行的解决方案,我更愿意使用并行ssh库。在

我在python3和windows10上使用并行ssh0.92.2。在


Tags: inpyoutputlibpackageslinesitewindow
1条回答
网友
1楼 · 发布于 2024-09-30 05:22:19

docs-

parallel-ssh uses gevent’s monkey patching to enable asynchronous use of the Python standard library’s network I/O.

Make sure that ParallelSSH imports come before any other imports in your code. Otherwise, patching may not be done before the standard library is loaded which will then cause ParallelSSH to block.

If you are seeing messages like This operation would block forever, this is the cause.

Monkey patching is only done for the clients under pssh.pssh_client and pssh.ssh_client for parallel and single host clients respectively.

New native library based clients under pssh.pssh2_client and pssh.ssh2_client do not perform monkey patching and are an option if monkey patching is not suitable. These clients will become the default in a future major release - 2.0.0.

由于monkey patching用于您正在使用的客户机,因此应用程序中threadingsocket等模块的其他用法也将被修补为使用gevent,这意味着它们不再在本机线程中运行,而是在co-routine/greenlet中运行。在

这就是后台线程操作在同一线程(而不是新线程)上以greenlet运行时阻塞的原因。在

1.2.0起,基于libssh2而不是paramiko的新客户机可用,它不使用monkey patching:

from pssh.pssh2_client import ParallelSSHClient

<..>

然后,应用程序的其余部分可以按原样使用标准库。在

相关问题 更多 >

    热门问题