{"id":122,"date":"2020-02-23T20:26:42","date_gmt":"2020-02-23T19:26:42","guid":{"rendered":"http:\/\/www.w2hp.net\/wp\/?page_id=122"},"modified":"2020-02-23T20:26:42","modified_gmt":"2020-02-23T19:26:42","slug":"paramiko-mqtt","status":"publish","type":"page","link":"https:\/\/wp.w2hp.net\/?page_id=122","title":{"rendered":"Paramiko + Mqtt"},"content":{"rendered":"<p><code>import threading, paramiko<br \/>from paramiko_expect import SSHClientInteraction<br \/>import socket<br \/>import paho.mqtt.client as mqtt<br \/><\/code><\/p>\n<p><code><br \/>class ssh:<br \/>    shell = None<br \/>    client = None<br \/>    transport = None<\/p>\n<p>    # PROMPT= '$'<br \/>    PROMPT = 'wehner@tmo:~\\$\\s+'<br \/>    def on_connect(self, client, userdata, flags, rc):<br \/>        print(\"Connected with result code \"+str(rc))<br \/>        # Subscribing in on_connect() means that if we lose the connection and<br \/>        # reconnect then subscriptions will be renewed.<br \/>        self.mqttclient.subscribe(\"test\/#\")<\/p>\n<p>    def on_message(self ,client, userdata, msg):<br \/>        print(msg.topic+\" \"+str(msg.payload))<br \/>        if( msg.topic ==\"test\/abc\"):<br \/>            tmp1=str(msg.payload)[1:]<br \/>            tmp1=tmp1.strip(\"'\")<\/p>\n<p>            words=tmp1.split()<br \/>            tmp1=words.pop(0)<br \/>        if tmp1.lower()== \"command\" :<br \/>            tmp1=\" \"<br \/>            tmp2=tmp1.join(words)<br \/>            print(tmp2)<br \/>            with SSHClientInteraction(self.client, timeout=10, display=True) as interact:<br \/>               interact.send(tmp2 + '\\n')<br \/>               interact.expect(self.PROMPT, timeout=500)<br \/>               cmd_output_uname = interact.current_output_clean<br \/>               print (\"output who\" , cmd_output_uname  , \"ohw\")<\/p>\n<p>    def __init__(self, address, username, password):<br \/>        print(\"Connecting to server on ip\", str(address) + \".\")<br \/>        self.client = paramiko.client.SSHClient()<br \/>        self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())<br \/>        self.client.connect(address,port=66, username=username, password=password, look_for_keys=False)<br \/>        self.transport = paramiko.Transport((address, 66))<br \/>        self.transport.connect(username=username, password=password)<br \/>        self.mqttclient = mqtt.Client()<br \/>        self.mqttclient.on_connect = self.on_connect<br \/>        self.mqttclient.on_message = self.on_message<\/p>\n<p>        self.mqttclient.connect(\"localhost\", 1883, 60)<\/p>\n<p>        self.mqttclient.loop_start()<br \/>        thread = threading.Thread(target=self.process)<br \/>        thread.daemon = True<br \/>        thread.start()<\/p>\n<p>    def closeConnection(self):<br \/>        if(self.client != None):<br \/>            self.client.close()<br \/>            self.transport.close()<\/p>\n<p>    def openShell(self):<br \/>        self.shell = self.client.invoke_shell()<br \/>        with SSHClientInteraction(self.client, timeout=10, display=True) as interact:<br \/>            interact.expect(self.PROMPT)<br \/>            cmd_output_uname = interact.current_output_clean<br \/>            print (\"cc1\" , cmd_output_uname  , \"ccc1\")<br \/>            interact.send('who\\n')<br \/>            interact.expect(self.PROMPT, timeout=500)<br \/>            cmd_output_uname = interact.current_output_clean<br \/>            print (\"output who\" , cmd_output_uname  , \"ohw\")<\/p>\n<p>    def sendShell(self, command):<br \/>        if(self.shell):<br \/>            self.shell.send(command + \"\\n\")<br \/>        else:<br \/>            print(\"Shell not opened.\")<\/p>\n<p>    def process(self):<br \/>        global connection<br \/>        while True:<br \/>            # Print data when available<br \/>            if self.shell != None and self.shell.recv_ready():<br \/>                alldata = self.shell.recv(1024)<br \/>                while self.shell.recv_ready():<br \/>                    alldata += self.shell.recv(1024)<br \/>                strdata = str(alldata, \"utf8\")<br \/>                strdata.replace('\\r', '')<br \/>                print(strdata, end = \"\")<br \/>                if(strdata.endswith(\"$ \")):<br \/>                    print(\"\\n$ \", end = \"\")<\/p>\n<p>sshUsername = \"user\"<br \/>sshPassword = \"passwd\"<br \/>sshServer = socket.gethostbyname(\"tmo.net\") #\"93.206.206.186\"<\/p>\n<p>connection = ssh(sshServer, sshUsername, sshPassword)<br \/>connection.openShell()<\/p>\n<p>while True:<br \/>    command = input('$ ')<br \/>    if command.startswith(\" \"):<br \/>        command = command[1:]<br \/>    connection.sendShell(command)<br \/><\/code><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>import threading, paramikofrom paramiko_expect import SSHClientInteractionimport socketimport paho.mqtt.client as mqtt class ssh: shell = None client = None transport = None # PROMPT= &#8218;$&#8216; PROMPT = &#8218;wehner@tmo:~\\$\\s+&#8216; def on_connect(self, client, userdata, flags, rc): print(&#8222;Connected with result code &#8222;+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/wp.w2hp.net\/?page_id=122\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eParamiko + Mqtt\u201c<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0,"footnotes":""},"class_list":["post-122","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/pages\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=122"}],"version-history":[{"count":1,"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/pages\/122\/revisions"}],"predecessor-version":[{"id":123,"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=\/wp\/v2\/pages\/122\/revisions\/123"}],"wp:attachment":[{"href":"https:\/\/wp.w2hp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}