Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Simple-SSH Script lässt Javascript Adapter abstürzen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Simple-SSH Script lässt Javascript Adapter abstürzen

    This topic has been deleted. Only users with topic management privileges can see it.
    • joergeli
      joergeli last edited by

      Hallo zusammen,

      Ähnliches Problem wie matze19999:
      Ich möchte einen Raspi, auf dem Octoprint für 3D-Drucker läuft, via simple-ssh "sauber", also mit "shutdown -h now" herunterfahren.
      Das funktioniert zwar im Prinzip und geht 2, oder 3 Mal gut, aber beim nächsten Mal herunterfahren, stürzt die kpl. Javascript-Instanz (Javascript-Adapter V 4.1.16) ab.
      Andere Linux-Befehle, wie z.B. "pwd", funktionieren dagegen einwandfrei via simple-ssh.

      Hier ein Screenshot des Logs:
      ssh-error.jpg

      Meine Interpretation des Logs:

      uncaught exception: Not connected
      

      , was m.E. ja logisch ist, weil der Shutdown-Befehl abgesetzt wurde und somit die SSH-Verbindung seitens Raspi getrennt wurde.

      Hier das entspr. Script (in Auszügen) dazu:

      //______ Variablen, um via SSH auf OctoPi einzuloggen ____
      var SSH = require('simple-ssh');
      var ssh = new SSH({
          host: '192.168.192.30',
          port: 22,
          user: 'xxx',
          pass: 'yyy'
      });
      .
      .
      .
                      //Octoprint-Server via SSH herunterfahren
                      setTimeout(function(){
                      log ('___ SSH Verbindung gestartet ___');
                      //SSH-Session starten
                      ssh.exec( 'echo "yyy"|sudo -S shutdown -h now').start();       
                              ssh.on('error', function(err) {
                                  log('___ Oops, es ist etwas schiefgelaufen: ___');
                                  log(err);
                                  ssh.end();
                              });             
      
                      }, 6000);
      .
      .
      .
      

      Hier wird der Shutdown-Befehl sofort abgesetzt und es gibt keine Möglichkeit, danach noch ein "exit", oder "logout" anzuhängen.
      (Bitte nicht an der Zeitverzögerung setTimeout(function() stören, das ist wegen anderer Sachen drin.)

      Als Workaround habe ich dann einen um 1 Minute verzögerten Shutdown gewählt:

      //______ Variablen, um via SSH auf OctoPi einzuloggen ____
      var SSH = require('simple-ssh');
      var ssh = new SSH({
          host: '192.168.192.30',
          port: 22,
          user: 'xxx',
          pass: 'yyy'
      });
      .
      .
      .
      //Octoprint-Server verzögert via SSH herunterfahren
         setTimeout(function(){
         //log ('___ SSH - Shutdown-Befehl wurde abgesetzt ___');
         //SSH-Session starten
         ssh.exec( 'echo "__ SSH: Shutdown in 60 Sekunden __"  && echo "yyy"|sudo -S shutdown -h +1 "System wird in 60 Sekunden heruntergefahren ..." && logout', {
              out: function(stdout) {
                  log(stdout);
                  }},
                  ) 
                  .start();
                          
                  ssh.on('error', function(err) {
                      log('__ Oops, es ist etwas schiefgelaufen: __');
                      log(err);
                      ssh.end();
                   });
      
          }, 6000);
      
      

      Das funktioniert problemlos, ist halt nur "unschön", daß man 1 Min. warten muss.
      Kürzere Verzögerungen als 1Min., wie z.B. 10 Sekunden, sind mit neueren Raspbian-Versionen (Stretch, Buster) leider nicht mehr möglich.
      Soweit ich gelesen habe, wird simple-ssh vom Entwickler auch nicht mehr gepflegt, somit sind von dort keine Änderungen zu erwarten.

      Frage:
      Kann jemand von Euch einen Linux-Rechner via simple-ssh problemlos sofort herunterfahren,
      oder hat jemand eine Idee, wie man das Abstürzen der Javascript-Instanz verhindern kann?

      Gruß
      Jörg

      Asgothian 1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @joergeli last edited by Asgothian

        @joergeli
        Ich würde versuchen den exec Befehl in ein try { } catch {} zu Kapseln, ggf. Fängt das die exception ab so das der js Adapter nicht abstürzt.

        Als Alternative müsste es möglich sein ein Script auf dem rpi zu schreiben das erst n Sekunden wartet und dann das System sofort herunter fährt. Ggf. Musst du dann noch verhindern das das Script durch beenden der ssh Verbindung auch beendet wird. Wie das bei raspi auf geht weiß ich nicht.

        A.

        1 Reply Last reply Reply Quote 0
        • E
          el_malto last edited by

          ich benutze https://forum.iobroker.net/topic/11679/raspberry-pi-runterfahren/14

          Läuft ohne Probleme bei mir.

          1 Reply Last reply Reply Quote 0
          • joergeli
            joergeli last edited by

            @Asgothian
            Ich habe es mit try/catch versucht, leider ebenfalls Absturz der JS-Instanz nach 2-3maligem Herunterfahren.
            Shell-Script wird m.E. auch nicht funktionieren, denn wenn ich z.B. "sleep 3 && shutdown -h now && logout" übergebe, wird der Shutdown-Befehl zwar erst nach 3 Sekunden ausgeführt, aber anschl. wird genau so "unsauber" aus simple-ssh ausgestiegen, als wenn ich den Shutdown_Befehl sofort absetze, weil das "logout" nicht mehr angenommen wird.
            Mit anderen Worten: Wenn Shutdown abgesetzt wurde, kann danach nichts mehr übergeben werden.

            @el_malto
            Das im Link verwendete node-ssh funktioniert 👍
            Also nicht simple-ssh verwenden, sondern node-ssh.
            Ich habe es jetzt so gelöst:

            var node_ssh = require('node-ssh');
            var ssh = new node_ssh();
            .
            .
                            //Octoprint-Server via SSH herunterfahren
                            setTimeout(function(){
                            log ('__ SSH Verbindung gestartet __');
                            //SSH-Session starten
                                ssh.connect({
                                    host: '192.168.192.30',
                                    username: 'xxx',
                                    password: 'yyy'
                                }).then(() => {
                                    ssh.execCommand('echo "yyy"|sudo -S shutdown -h now');
                                });                           
            
                            }, 6000);
            

            Man beachte, daß ich das Passwort (yyy) nochmals an den sudo-Befehl übergeben musste (mit | = pipen), da mein Raspi - warum auch immer - vor der erstmaligen Ausführung eines sudo-Befehls nochmals nach dem Passwort
            fragt.

            Vielen Dank für Eure Hilfe!
            Jörg

            Asgothian K 2 Replies Last reply Reply Quote 1
            • Asgothian
              Asgothian Developer @joergeli last edited by

              @joergeli sagte in Simple-SSH Script lässt Javascript Adapter abstürzen:

              Ich habe es mit try/catch versucht, leider ebenfalls Absturz der JS-Instanz nach 2-3maligem Herunterfahren.
              Shell-Script wird m.E. auch nicht funktionieren, denn wenn ich z.B. "sleep 3 && shutdown -h now && logout" übergebe, wird der Shutdown-Befehl zwar erst nach 3 Sekunden ausgeführt, aber anschl. wird genau so "unsauber" aus simple-ssh ausgestiegen, als wenn ich den Shutdown_Befehl sofort absetze, weil das "logout" nicht mehr angenommen wird.
              Mit anderen Worten: Wenn Shutdown abgesetzt wurde, kann danach nichts mehr übergeben werden.

              Der Trick hier sollte sein die Befehle nicht einfach hintereinander zu setzen (mit einem &&) sondern per nohup oder ähnlichem tool ein lokal auf dem RPI liegendes bash script zu starten das "sleep" und "shutdown" beinhaltet. Der Befehl nohup wartet nicht bis das von ihm aufgerufene Script beendet wurde und wird auch nicht beendet wenn der Benutzer sich abmeldet.

              Ich bin allerdings froh das du eine Variante gefunden hast die ohne diesen Trick funktioniert.

              Man beachte, daß ich das Passwort (yyy) nochmals an den sudo-Befehl übergeben musste (mit | = pipen), da mein Raspi - warum auch immer - vor der erstmaligen Ausführung eines sudo-Befehls nochmals nach dem Passwort
              fragt.

              Die Antwort darauf ist einfach. Der Benutzer xxx mit dem du dich anmeldest hat zwar das Recht per sudo administrator befehle auszuführen, läuft aber im Standard nicht mit Admin rechten - das ist das normale Linux Sicherheitskonzept - und war auch bei der simple-ssh version oben notwendig. Deswegen muss bei der ersten Verwendung von sudo das Kennwort mit eingegeben werden. Es wird (per session, soweit ich erinnere) gespeichert und bei folgenden sudo befehlen nicht weiter benötigt.

              joergeli 1 Reply Last reply Reply Quote 0
              • joergeli
                joergeli @Asgothian last edited by

                @Asgothian
                Hi,
                danke für Deine Erläuterungen, bin halt nicht so der Linux-Crack.

                nohup kannte ich noch nicht.
                Damit sollte es möglich sein, ein bash-script zu starten, welches zuerst ein "logout" , dann "sleep" und anschl. ein "shutdown -h now" ausführt.
                Wie gesagt, simple-ssh braucht wohl ein sauberes "logout", bzw. "exit", um nicht die kpl. js-Instanz zum Absturz zu bringen.

                sudo-Kennwort:
                Das leuchtet soweit ein.
                Mich hat nur verwirrt, daß wenn ich mich via Putty als User "pi" auf dem ioBroker-Raspi einlogge, einen sudo-Befehl eingeben kann, und nicht nochmals nach dem Kennwort gefragt werde.

                Gruß
                Jörg

                Asgothian 1 Reply Last reply Reply Quote 0
                • Asgothian
                  Asgothian Developer @joergeli last edited by

                  @joergeli sagte in Simple-SSH Script lässt Javascript Adapter abstürzen:

                  @Asgothian
                  Hi,
                  danke für Deine Erläuterungen, bin halt nicht so der Linux-Crack.

                  nohup kannte ich noch nicht.
                  Damit sollte es möglich sein, ein bash-script zu starten, welches zuerst ein "logout" , dann "sleep" und anschl. ein "shutdown -h now" ausführt.
                  Wie gesagt, simple-ssh braucht wohl ein sauberes "logout", bzw. "exit", um nicht die kpl. js-Instanz zum Absturz zu bringen.

                  Nicht ganz. Der Ablauf wäre:

                  Ein Script (shutdown_system.sh), das sleep und dann shutdown -h now macht
                  Der Aufruf aus dem simple-SSH wäre nohup shutdown_system.sh && logout

                  1 Reply Last reply Reply Quote 0
                  • TeNNo2k5
                    TeNNo2k5 last edited by

                    Vielleicht als Alternative einfach normales SSH mit Public-Key-Authentifizierung verwenden, das entspricht dem normalen Linux Sicherheitskonzept da Passwörter nicht in Skripten hinterlegt sind und bringt den Javascript Adapter nicht durcheinander.

                    Anleitung zum Einrichten:

                    https://www.thomas-krenn.com/de/wiki/OpenSSH_Public_Key_Authentifizierung_unter_Ubuntu

                    Wenn die Verbindung eingerichtet ist einfach die Keys zum iobroker User übertragen:

                    cp -rT /home/pi/.ssh/ /home/iobroker/.ssh 
                    chown iobroker /home/iobroker/.ssh/authorized_keys 
                    chown iobroker /home/iobroker/.ssh/id_rsa 
                    chown iobroker /home/iobroker/.ssh/known_hosts
                    
                    joergeli 1 Reply Last reply Reply Quote 0
                    • joergeli
                      joergeli @TeNNo2k5 last edited by

                      @TeNNo2k5
                      ... viele Wege führen nach Rom
                      Allerdings scheint mir diese Variante für "Nicht-Linux-Spezies" doch recht kompliziert.

                      Ich hatte anfangs auch nicht mit solchen Problemen bei einem Shutdown via SSH gerechnet.
                      Habe aber - Dank Eurer Hilfe - eine Lösung gefunden und vor allem einiges dazugelernt.

                      Danke nochmals
                      Jörg

                      1 Reply Last reply Reply Quote 0
                      • K
                        KHK @joergeli last edited by

                        @joergeli said in Simple-SSH Script lässt Javascript Adapter abstürzen:

                        Also nicht simple-ssh verwenden, sondern node-ssh.

                        Dieses node-ssh muss das irgendwie neu installiert werden oder was muss gemacht werden?

                        Ich habe das mal probiert, aber es kommt die Meldung "TypeError: node_ssh is not a constructor"

                        Karl

                        joergeli E 2 Replies Last reply Reply Quote 0
                        • joergeli
                          joergeli @KHK last edited by

                          @khk
                          Es sollte reichen, node-ssh als zusätzliches Modul in der Konfiguration des JS-Adapters mit einzutragen.
                          IMHO wird es dann automatisch installiert.
                          js-adapter-konfiguration.jpg
                          Gruß
                          Jörg

                          1 Reply Last reply Reply Quote 0
                          • E
                            el_malto @KHK last edited by el_malto

                            @khk du kannst das Skript von oben nicht mehr verwenden. Es haben sich die Aufrufe geändert. Musst dir mal das Example angucken -> https://www.npmjs.com/package/node-ssh
                            Ich hab meine Skripte so angepasst:

                            const {NodeSSH} = require('node-ssh')
                            const ssh = new NodeSSH()
                            
                            ssh.connect({
                              host: '192.168.xxx.xxx',
                              username: '<user>',
                              password: '<pass>'
                            }).then(() => {
                              ssh.execCommand("<command>");
                            })
                            
                            joergeli 1 Reply Last reply Reply Quote 0
                            • joergeli
                              joergeli @el_malto last edited by

                              @el_malto
                              Was ist da jetzt anders als im obigen Script?
                              (Außer daß Du NodeSSH in geschweiften Klammern? als Konstante deklariert hast)

                              Oder übergibst Du das password nicht nochmals im ssh.execCommand?

                              Gruß
                              Jörg

                              E 1 Reply Last reply Reply Quote 0
                              • E
                                el_malto @joergeli last edited by el_malto

                                @joergeli es ist jetzt nicht mehr node_ssh sondern NodeSSH. Deswegen auch der Fehler.

                                "TypeError: node_ssh is not a constructor"
                                

                                Ist im Changelog auch drin:
                                https://github.com/steelbrain/node-ssh/blob/master/CHANGELOG.md#1100

                                joergeli 1 Reply Last reply Reply Quote 0
                                • joergeli
                                  joergeli @el_malto last edited by

                                  @el_malto
                                  ahhh, OK.
                                  Ich habe es bei mir jetzt auch wie bei Dir angepasst.

                                  const {NodeSSH} = require('node-ssh')
                                  const ssh = new NodeSSH()
                                  

                                  Nebenbei:
                                  Bei mir kam keine Fehlermeldung wie bei @KHK, weil ich irgendwann schon mal folgende Anpassung vorgenommen hatte:

                                  var node_ssh = require('node-ssh').NodeSSH;
                                  var ssh = new node_ssh();
                                  

                                  (Hatte ich wohl irgendwo im Forum gefunden)

                                  Gruß und Danke
                                  Jörg

                                  1 Reply Last reply Reply Quote 1
                                  • H
                                    Hansi1234 last edited by

                                    Hat jemand aktuell noch ein ssh script am laufen? Ich bekomme das Modul nicht installiert:

                                    javascript.0	2021-04-26 07:54:48.372	error	(22266) Cannot install nodessh: 1
                                    javascript.0	2021-04-26 07:54:48.358	error	(22266) npm ERR! A complete log of this run can be found in: npm ERR! /home/iobroker/.npm/_logs/2021-04-26T05_54_48_349Z-debug.log
                                    javascript.0	2021-04-26 07:54:48.357	error	(22266)
                                    javascript.0	2021-04-26 07:54:48.348	error	(22266) ERR! 404 Not Found - GET https://registry.npmjs.org/nodessh - Not found npm ERR! 404 npm ERR! 404 'nodessh@latest' is not in the npm registry. npm ERR! 404 You should bug the author to publi
                                    javascript.0	2021-04-26 07:54:48.346	error	(22266) npm
                                    javascript.0	2021-04-26 07:54:48.338	error	(22266) ERR! code E404
                                    javascript.0	2021-04-26 07:54:48.336	error	(22266) npm
                                    javascript.0	2021-04-26 07:54:46.257	info	(22266) npm install nodessh --production (System call)
                                    
                                    Asgothian 1 Reply Last reply Reply Quote 0
                                    • Asgothian
                                      Asgothian Developer @Hansi1234 last edited by

                                      @hansi1234 Das könnte daran liegen das das Module node-ssh heisst, nicht nodessh

                                      A.

                                      1 Reply Last reply Reply Quote 0
                                      • D
                                        Dragon last edited by

                                        Ich bekomme folgende Fehlermeldung, wenn ich das Skript starte. Hat jemand eine Idee?

                                        
                                        javascript.0	2021-09-28 16:22:28.756	error	(2289) at Script.runInContext (vm.js:130:18)
                                        javascript.0	2021-09-28 16:22:28.755	error	(2289) at script.js.common.Automatisierung.Geräte.3D_Drucker.Shutdown_OctPi:19:3
                                        javascript.0	2021-09-28 16:22:28.755	error	(2289) at script.js.common.Automatisierung.Geräte.3D_Drucker.Shutdown_OctPi:2:11
                                        javascript.0	2021-09-28 16:22:28.754	error	(2289) script.js.common.Automatisierung.Geräte.3D_Drucker.Shutdown_OctPi: TypeError: node_ssh is not a constructor
                                        
                                        Glasfaser 1 Reply Last reply Reply Quote 0
                                        • Glasfaser
                                          Glasfaser @Dragon last edited by

                                          @dragon sagte in Simple-SSH Script lässt Javascript Adapter abstürzen:

                                          Automatisierung.Geräte.3D_Drucker.Shutdown_OctPi

                                          Zeige mal dein Script

                                          D 1 Reply Last reply Reply Quote 0
                                          • D
                                            Dragon @Glasfaser last edited by

                                            @glasfaser
                                            Vielen Dank für das Hilfsangebot, aber ich habe den Fehler gefunden. Er saß teilweise vor der Tastatur

                                            var node_ssh = require('node-ssh').NodeSSH;
                                            var ssh = new node_ssh();
                                            

                                            erstens das hier.
                                            Zweitens: das Passwort war falsch und die IP Adresse stimmte nicht.... Vll ist es an der Zeit für heute Feierabend zu machen.... 😁

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            814
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            11
                                            23
                                            3067
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo