Paramiko的SSH客户端:避免多个连接

时间:2016-01-18 19:19:26

标签: python linux ssh kivy paramiko

我试图在Kivy中做一个简单的应用程序,其中不同的设备可以使用SSH连接到使用OpenSSH的Linux服务器来读取和写入txt文件。 作为一个简单的应用程序,我的想法只是避免多个SSH连接,因此我在limits.conf中编辑了文件/etc/security,添加了一行:

   user    hard    maxlogins    1

通过这种方式,我可以避免2个设备同时写入同一个文件。如果测试与Putty或与另一个Android SSH客户端的连接一切正常(我一次只能有一个连接)但是如果我使用Paramiko我会得到一个奇怪的行为:我可以同时拥有多个连接! 这是我的代码:

# main.py

import kivy
kivy.require("1.9.0")
__version__ = "0.1"

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import paramiko

class RootWidget(BoxLayout):

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    def open_ssh(self):
        try:
            self.ssh.connect("192.168.0.200", 22, "user", "password", timeout = 1)
            self.sftp = self.ssh.open_sftp()
            self.ids.output.text = "SSH On"
        except:
            self.ids.output.text = "TX/RX Error"

    def close_ssh(self):
        self.sftp.close()
        self.ssh.close()
        self.ids.output.text = "SSH Off"

class ParamikoApp(App):

    def build(self):
        root = RootWidget()            
        return root

if __name__ == "__main__":
    ParamikoApp().run()


# paramiko.kv 

<RootWidget>:
    orientation: "vertical"

    Label:
        id: output

    BoxLayout:
        Button:
            id: open_button
            text: "Open SSH"
            on_press: root.open_ssh()

        Button:
            id: close_button
            text: "Close SSH"
            on_press: root.close_ssh()

所以我的问题是: 我的连接代码中缺少某些内容,或者Paramiko的工作方式与标准SSH客户端不同? 我还尝试使用MaxSessions文件中的sshd_config设置和Paramiko中的set_keepalive参数,但没有幸运..

1 个答案:

答案 0 :(得分:0)

  

通过这种方式,我可以避免2个设备同时写入同一个文件。

我认为你需要退一步思考你真正试图解决的问题。我可以想到有数百到数千种不同的方式让多个客户端记录数据。这是一个完全解决的问题。但这些方式都不涉及&#34;单用户SSH&#34;。您可能会找到&#34;答案&#34;对于你今天的问题,明天你肯定会遇到另一个障碍。

行业标准是让您的客户端与您的服务器通信HTTPS。你应该有充分的理由反对这里的流程。 Web服务器比SSH服务器更具可扩展性,更简单,更灵活。如果您便宜,您可以从Lets Encrypt获得免费证书。

您可以一次解决一个问题&#34;在许多层面上存在问题:

  • 运行单线程HTTP服务器(以便在操作系统中等待连接)。
  • 编写自己的锁定(以便您的应用等待)
  • 只需使用数据库(因此您甚至不必考虑锁定)。