NEWS
Routerzugriff mit SSH; Gibt es da schon was?
-
Hallo
Leider halten sich meine Erfahrungen mit JS sehr in Grenzen. Daher komme ich da nicht weiter.Ich habe einen Draytek Router, der problemlos über SSH konfiguriert und bedient werden kann. Die Befehle sind dokumentiert.
Der Gedanke, nachdem es keinen Adapter dafür gibt, wäre mit JS auf SSH zuzufgreifen und dort quasi einen Dialog zu simulieren. Änderungen am Router hinsichtlich Keys sind nicht möglich.
Direkt am PI sollte es mit SSH und dem Expect Packet machbar sein.Anforderungen:
Login mit ssh <user>@<ip> -c <crypt>
Passwort: <Passwort> (kommt eine Meldung wegen Keys, dann Yes)
danach warten auf Prompt und Befehl wie sys reboot usw. Der Rest ist dann eh simpel, weil es immer gleich läuft.Hat da jemand vielleicht ein Muster, Vorlage oder so etwas, wie ich das angehen könnte. An sich wäre das ja auch eine Idee für einen Universal SSH Adapter, da viele Router über SSH gesteuert werden können und nach dem Login daher nur der Dialog anders konfiguriert werden müsste.
Wäre nett, wenn jemand helfen könnte.
-
@mrieglhofer Das geht mit dem Skript-Adapter und https://www.npmjs.com/package/node-ssh
-
Verstehe ich das richtig? Wenn ich das node package installiere, kann ich aus dem Script Adapter darauf zugreifen? Den Rest muss ich mir in Ruhe in der Doku anschauen und probieren.
-
@mrieglhofer Du musst es in der Konfiguration des Skript-Adapters bei "zusätzliche Module" eintragen, dann kannst du es im Skript per
require("node-ssh")
laden. -
Danke.
Noch eine Frage: in welches Verzeichnis gehört das Modul. Ich habe es nämlich gerade versehentlich in die Wurzel installiert (wegen der Fehler dann mit Sudo) und Uninstall lässt den ganzen Müll leider dort). Hatte einige Probleme, es dort wieder los zu werden. Gottlob habe ich immer ein Backup-Karte.
Beim IoBroker unter nodes_modules oder unter /opt/iobroker/node_modules/iobroker.javascript/node_modules -
@mrieglhofer Nicht manuell installieren! Da steht es:
@AlCalzone sagte in Routerzugriff mit SSH; Gibt es da schon was?:
Du musst es in der Konfiguration des Skript-Adapters bei "zusätzliche Module" eintragen
-
Danke, war für nicht so klar, dass man das nicht installieren muss. Bei den meisten Sprachen musst ja das Modul zuerst installieren, bevor du drauf zugreifen kannst. Naja, ist schon länger her
Zumindest schreit im Moment nichts. Da kann ich mich jetzt mal weiter einlesen und probieren. -
@mrieglhofer das schon, aber der Adapter macht das für dich. Ohne die Einstellung würde es beim adapter update verloren gehen
-
@AlCalzone
Heisst also. alle node Packete unter JavaScript so verwalten.Jetzt habe ich mal das Connect hingebracht. Der Router wollte nur 3des-cbc.
Jetzt bekomme ich zumindest mal connected. Mehr sehe ich im Router leider auch nichtAber jetzt hänge ich an der Frage, wie kann ich ihm jetzt Befehle schicken. Was so im Internet rumgeistert, hat zu keiner Lösung geführt. Gibt da irgendein Muster. Sonst sehe ich als module expect. Könnte ich damit weiterkommen?
var node_ssh node_ssh = require('node-ssh') ssh = new node_ssh() password='xxxxx' function test(line){ console.log('stdout: ' + line) }; ssh.connect({ host: '192.168.2.1', username: 'admin', port: 22, password, algorithms: { cipher: [ '3des-cbc' ] }, tryKeyboard: true, debug: test, onKeyboardInteractive: (name, instructions, instructionsLang, prompts, finish) => { if (prompts.length > 0 && prompts[0].prompt.toLowerCase().includes('password')) { finish([password]) } } })
14:10:03.524 info javascript.1 (4859) Stop script script.js.Test.SSH 14:10:07.718 info javascript.1 (4859) Start javascript script.js.Test.SSH 14:10:07.726 info javascript.1 (4859) script.js.Test.SSH: registered 0 subscriptions and 0 schedules 14:10:07.728 info javascript.1 (4859) script.js.Test.SSH: stdout: DEBUG: Local ident: 'SSH-2.0-ssh2js0.4.8' 14:10:07.728 info javascript.1 (4859) script.js.Test.SSH: stdout: DEBUG: Client: Trying 192.168.2.1 on port 22 ... 14:10:07.732 info javascript.1 (4859) script.js.Test.SSH: stdout: DEBUG: Client: Connected 14:10:07.734 info javascript.1 (4859) script.js.Test.SSH: stdout: DEBUG: Parser: IN_INIT
-
@mrieglhofer Z.B. so. Aus Gründen der Lesbarkeit bevorzuge ich async/await über die .then-Beispiel aus der Doku
const node_ssh = require("node-ssh"); const ssh = new node_ssh(); const password = "xxxxx"; async function main() { await ssh.connect({ host: "192.168.2.1", username: "admin", port: 22, password, algorithms: { cipher: ["3des-cbc"] }, tryKeyboard: true, onKeyboardInteractive: (name, instructions, instructionsLang, prompts, finish) => { if (prompts.length > 0 && prompts[0].prompt.toLowerCase().includes('password')) { finish([password]) } } }); const result1 = await ssh.execCommand('befehl', { cwd: '/pfad/zum/workdir' }); log('STDOUT: ' + result1.stdout); log('STDERR: ' + result1.stderr); // Weitere Befehle... } main();