NEWS
Host + Port auf Erreichbarkeit prüfen
-
@jey-cee
Hmmm, ich dachte an ein paar Zeilen Code. Mitaxios
oder was man da sonst so nimmt.
Irgendwas in Richtung HTTP.HEAD, um einfach nur die Erreichbarkeit zu prüfen.mit möglichst wenig Overhead
JS ist halt nicht so meine Welt
-
@jey-cee
Ich sehe, Du machst das mit "evilscan".
Vielleicht kriege ich das mit ein paar Zeilen adaptiert -
Wenn es nur um einen ping der ip geht ist es ganz easy: Mit exec den ping Befehl vom system Ausführen.
Auf die idee axios dafür zu nutzen um zu prüfen ob ein bestimmter port in Benutzung ist bin ich noch gar nicht gekommen. Aber ich Denke das funktioniert nur wenn auf dem port ein webservice läuft. Mit anderen servern die zum Beispiel Sockets nutzen dürfte das nicht klappen.
-
nc -zv host port
-
@jey-cee sagte in Host + Port auf Erreichbarkeit prüfen:
ich Denke das funktioniert nur wenn auf dem port ein webservice läuft
Genau dazu ist das Ganze gedacht.
Ich hab's trotz sehr beschränkter Fähigkeiten in Sachen JS und Linux sogar hinbekommen, scheitere aber an der Asynchronität.async function isPortReachable(url) { const response = await axios.head(url); log(response); return (response.status == 200); }
@MCU
Netcat musste ich erst nachinstallieren, aber es funktioniert.
Wenn man einen entsprechend kurzen Timeout mitgibt, ist das - zumindest in der Konsole - eigentlich nutzbar.
Jetzt müsste ich das "nur noch" in eine synchrone Funktion in JS gießen. -
const axios=require('axios'); axios.defaults.timeout = 500; isPortOpen('127.0.0.1', '8081'); // true or false async function isPortOpen(ip,port) { try { await axios.get(`http://${ip}:${port}`); } catch (error) { if (error.code==='ECONNABORTED') { return false; } } return true; }
Wenn es nur um den offenen Port geht ist doch alles ausser Timeout ok oder? außer du gibts die ip mit ungültigen Zeichen an, dafür kenne ich den Fehlercode nicht auswendig.
-
@ticaki
So ähnlich habe ich es versucht.
Das läuft aber asynchron.
Dasaxios.get
kehrt zurück, bevor am Ende dasreturn true
zurückgegeben wurde.
Die Funktion liefert einpromise
zurück, aber keintrue/false
.const axios=require('axios'); axios.defaults.timeout = 500; async function isPortOpen(uri) { try { await axios.get(uri); } catch (error) { log('code: ' + error.code); if (error.code === 'ECONNABORTED') { log('failed'); return 'closed'; } } log('success'); return 'open'; } log('result: ' + isPortOpen('http://192.168.178.137:8090'));
Kann man am Log gut erkennen:
11:58:31.211 info javascript.0 (1458371) Start javascript script.js.test.Test_JS 11:58:31.228 info javascript.0 (1458371) script.js.test.Test_JS: result: [object Promise] 11:58:31.228 info javascript.0 (1458371) script.js.test.Test_JS: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11:58:31.730 info javascript.0 (1458371) script.js.test.Test_JS: code: ECONNABORTED 11:58:31.730 info javascript.0 (1458371) script.js.test.Test_JS: failed 11:58:38.753 info javascript.0 (1458371) Start javascript script.js.test.Test_JS 11:58:38.766 info javascript.0 (1458371) script.js.test.Test_JS: result: [object Promise] 11:58:38.766 info javascript.0 (1458371) script.js.test.Test_JS: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions 11:58:38.782 info javascript.0 (1458371) script.js.test.Test_JS: success
In meiner Windows-Welt muss man schon ziemlich Klimmzüge machen, um asynchron zu arbeiten (multi-threading).
Da ist alles auf synchron ausgelegt.Hier ist es genau andersrum. Synchrone Funktionsaufrufe scheinen echt kompliziert zu sein.
Aber ich hätte da eine Idee: Ich packe den von mir benötigten Aufruf der weiteren Funktionalität an das Ende dieser Funktion. Da landet man ja erst dann, wenn die Prüfung erfolgreich war.
Im Fehlerfall wird ja imcatch
abgebrochen.
Das würde mir auch schon ausreichen. -
Ich hab's jetzt so gelöst.
Wenn's noch Kritikpunkte gibt - immer her damit.const axios = require('axios'); axios.defaults.timeout = 500; const address = 'http://192.168.178.36:80'; async function sendNotification(title, body) { try { await axios.head(address); } catch (error) { if (error.code === 'ECONNABORTED') { log('Target host:port not reachable'); return false; } } let url = address + '/toastMessage'; url += '?title=' + encodeURI(title); url += '&body=' + encodeURI(body); try { await axios.get(url); } catch (error) { log(error); return false; } return true; } sendNotification('Titel', 'Nachricht');
-
@codierknecht
Ups, ist für mich normal das man darauf auch awaiten muss, das ich es vergessen habe. Bei mir läuft fast immer alles in Funktionen die Funktionen aufrufen. Nur das initialisieren mache ich auf der Hauptebene. -
@ticaki sagte in Host + Port auf Erreichbarkeit prüfen:
ist für mich normal das man darauf auch awaiten muss
Das ist wohl der entscheidende Unterschied zwischen Windows und Node/JS