Ausführende Befehle auf einem Remote -Computer von Java mit JSCH ausführen
- 3624
- 1148
- Ilja Köpernick
SSH ist ein alltägliches Werkzeug für jeden Linux-Systemverwaltungsjob. Dies ist eine einfache und sichere Möglichkeit, auf Remote -Maschinen im Netzwerk zuzugreifen, Daten zu übertragen und Remote -Befehle auszuführen. Neben dem interaktiven Modus gibt es viele Tools, die die Automatisierung von Remote -Aufgaben ermöglichen, die auch auf dem vorhandenen Bereich beruhen ssh
Server-/Client -Architektur. Für ein solches Tool können Sie beispielsweise auf Ubuntu über Ansible lesen. Sie können auch viele Implementierungen des SSH -Clients finden, aber was ist mit dem Zugriff auf die Fähigkeiten, die SSH aus Code bereitstellen?
JSCH ist ein Projekt, das das SSH -Protokoll in Java implementiert. Mit ihrer Hilfe können Sie Anwendungen erstellen, die in der Lage sind, sich mit einem Remote- oder lokalen SSH -Server zu verbinden und mit ihnen zu interagieren. Auf diese Weise kann Ihre Anwendung einen Aspekt der Zielmaschine verwalten, den Sie mit Ihrem nativen SSH -Client ausfüllen können, was eine weitere leistungsstarke Ergänzung zum bereits riesigen Java -Toolset verleiht.
In diesem Artikel werden wir JSCH in unser Java -Projekt importieren und die minimalen erforderlichen Code -Teile entwickeln, um eine Anwendung zu erstellen, mit der sich an einem SSH -Server eines Remote -Geräts anmelden kann, einige Befehle in der Remote Interactive Shell ausführen, die Sitzung schließt und dann die vorlegt Ausgang. Diese Anwendung ist minimal, kann jedoch einen Hinweis auf die Stromversorgung geben, die sie bietet.
In diesem Tutorial lernen Sie:
- So importieren Sie JSCH in Ihr Java -Projekt
- So richten Sie die Testumgebung ein
- So implementieren Sie die Benutzerinfo -Schnittstelle in einer benutzerdefinierten Klasse
- So schreiben Sie eine Anwendung, die eine interaktive SSH -Sitzung initiiert
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | Fedora 30 |
Software | OpenJDK 1.8, JSCH 0.1.55, NetBeans 8.2 |
Andere | Privilegierter Zugriff auf Ihr Linux -System als Root oder über die sudo Befehl. |
Konventionen | # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können |
Einführung
Mit Hilfe von JSCH entwickeln wir eine Anwendung, die versucht, sich anzumelden Lokalhost
über ssh
, Verwenden des Benutzernamens prüfen
und Passwort prüfen
. Wir werden den Standardport annehmen 22
Der SSH -Server hört auf und akzeptiert den Fingerabdruck des Servers, ohne die Gültigkeit zu überprüfen. Bei einer erfolgreichen Anmeldung werden wir einige Befehle ausführen, die wir in einer Remote -Shell ausgeben, sich abmelden und dann alle empfangenen Ausgaben ausdrucken können.
Der folgende Quellcode dient nur für Demonstrationszwecke; Verwenden Sie niemals einen solchen Code in der Produktion! Nur um zwei Fallstricke zu nennen, Vertrauen Sie standardmäßig keine Server -Fingerabdrücke, und Ausnahmen richtig behandeln.
Unsere Tools bestehen aus einem Fedora -Desktop (sowohl als Client als auch als Server), einer kürzlich durchgeführten Netbeans -IDE und dem (zum Zeitpunkt des Schreibens) jüngsten stabilen JSCH. Beachten Sie jedoch, dass dies nur die Werkzeuge der Wahl sind. Java ist plattformunabhängig, und der Zielserver könnte sich auf der anderen Seite des Planeten befinden und jedes Betriebssystem sein, das ein ordnungsgemäßes Ausführen ausführt SSH -Server
.
Einrichten der Testumgebung
Wir brauchen die oben genannten Anmeldeinformationen, um daran zu arbeiten Lokalhost
. In unserem Beispiel benötigen wir einen Benutzer mit dem Namen "Test" mit dem Passwort "Test". Wir benötigen auch einen laufenden SSH -Server.
Hinzufügen des Testbenutzers
Wir werden ausführen UserAdd
als Wurzel
:
# UserAdd -Test
Und legen Sie das Passwort des neuen Benutzers fest:
# Passwd -Test
Hier müssen wir das obige Passwort zweimal angeben. Dies ist in einer Testumgebung geeignet, die vorübergehend und auch von außen nicht erreichbar ist, aber nicht leicht zu den Passwörtern verwendet wird, wenn möglicherweise eine geringste Chance auf unkontrollierten Zugriff besteht.
Überprüfen des SSH -Servers
Wir können den Status des SSH -Server
mit systemd
:
# Systemctl Status SSHD
Und starten Sie es, wenn es nicht läuft:
# Systemctl Start SSHD
Dieser Schritt kann bei Desktop -Installationen erforderlich sein, da einige dieser Setups den SSH -Server standardmäßig nicht ausführen.
Testen der Konnektivität mit einem nativen Kunden
Wenn unser Benutzer festgelegt ist und der Dienst ausgeführt wird, sollten wir uns mit den oben genannten Informationen anmelden können:
$ ssh test@localhost
Wir müssen den Fingerabdruck des Hosts akzeptieren und das Passwort angeben. Wenn wir zur Schale kommen, ist unsere Testumgebung abgeschlossen.
JSCH in unser Projekt erhalten und importieren
Herunterladen des Archivs
Wir müssen den Byte -Code des JSCH -Projekts herunterladen, um seine Funktionalität zu verwenden. Sie finden den entsprechenden Link auf der JSCH -Homepage. Wir brauchen die .Krug
Java -Archiv.
Erstellen des Projekts in NetBeans
Am Anfang erstellen wir ein neues, leeres Projekt namens namens sshremoteExample
in NetBeans. Wir können einfach im Menü Datei „neues Projekt“ auswählen.
Neues Projekt erstellen.
Wir werden die Kategorie "Java" und das Projekt "Java Application" auswählen.
Auswahl der Kategorie für das Projekt.Wir müssen einen Namen für das Projekt angeben, in diesem Fall „sshremoteExample“.
Benennung des Projekts.Auf dem Standardlayout finden wir das Fenster „Projekte“ auf der linken Seite. Dort klicken wir unter unserem neu erstellten Projekt mit der rechten Maustaste auf den Knoten „Bibliotheken“ und wählen „JAR/Ordner hinzufügen“. Ein Dateiauswahlfenster wird geöffnet, in dem wir nach dem durchsuchen müssen .Krug
Datei, die wir auf der Website des Entwicklers heruntergeladen haben.
Nach der Auswahl sollte das Archiv in den enthaltenen Bibliotheken angezeigt werden, wenn wir den Knoten „Bibliotheken“ öffnen.
JSCH importiert erfolgreich.Wir müssen die implementieren Benutzerinformation
Schnittstelle, um es in unserer Anwendung zu verwenden. Dazu müssen wir eine neue hinzufügen Java -Klasse
zu unserem Projekt, indem Sie mit der rechten Maustaste auf unsere klicken sshremoteExample
Paket im Projektfenster, wählen Sie "neu", dann "Java Class ...".
Wir geben den Namen "sshremoteExampleUserinfo" als Klassenname an.
Benennung der neuen Java -Klasse.Hinzufügen des Quellcode
sshremoteExampleUserInfo.Java
Betrachten Sie für unsere Schnittstellenimplementierung die folgende Quelle. Hier akzeptieren wir den Fingerabdruck des Ziels blind. Tun Sie dies nicht in einem realen Szenario. Sie können den Quellcode bearbeiten, indem Sie im Projektfenster auf die Klasse klicken. Wenn er bereits geöffnet ist.
Paket sshremoteExample; Import com.Jcraft.Jsch.*; public class sshremoteExampleUserinfo implementiert userInfo private endgültige Zeichenfolge PWD; public sshremoteExampleUserInfo (String -Benutzername, String -Passwort) pwd = password; @Override public String getPsePhrase () neue nicht unterstützte OperationSexception werfen ("Getpassphrase noch nicht unterstützt."); @Override public String getPassword () return pwd; @Override public boolean promptPassword (String -Zeichenfolge) /*mod* / return true; @Override public boolean promptPhrase (String String) Wurf New UnupportedoperationException (" Eingabeaufforderung, der noch nicht unterstützt wird."); @Override public boolean sPROMPTYESNO (STRING STRING) /*MOD* / return true; @Override public void ShowMessage (String String)
Kopieren SshremoteExample.Java
Unsere Hauptklasse wird die sein sshremoteExample
Klasse mit der folgenden Quelle:
Paket sshremoteExample; Import com.Jcraft.Jsch.*; Java importieren.io.BytearrayInputStream; Java importieren.io.IoException; Java importieren.io.Eingabestrom; Java importieren.Nio.Charset.StandardCharets; public class sshremoteExample public static void main (String [] args) String host = "localhost"; String user = "test"; String password = "test"; String command = "hostname \ ndf -h \ nexit \ n"; versuche JSCH JSCH = new JSCH (); Sitzungssitzung = JSCH.GetSession (Benutzer, Host, 22); Sitzung.setUserInfo (neuer sshremoteExampleUserInfo (Benutzer, Passwort)); Sitzung.verbinden(); Channel Channel = Sitzung.OpenChannel ("Shell"); Kanal.setInputStream (New BytearrayInputStream (Befehl.GetBytes (StandardCharets.UTF_8)); Kanal.SetOutputStream (System.aus); InputStream in = Kanal.getInputStream (); StringBuilder Outbuff = new StringBuilder (); int exitStatus = -1; Kanal.verbinden(); while (true) für (int c; ((c = in.read ())> = 0);) outbuff.append ((char) c); if (Kanal.isclosed ()) if (in.Verfügbar ()> 0) Weiter; exitStatus = Kanal.getExitstatus (); brechen; Kanal.trennen(); Sitzung.trennen(); // Drucken Sie das Inhaltssystem des Puffer.aus.drucken (Outbuff.tostring ()); // Exit -Status -System drucken.aus.print ("Exit -Status der Ausführung:" + exitStatus); if (exitStatus == 0) System.aus.print ("(ok) \ n"); else System.aus.print ("(nok) \ n"); catch (ioException | jSchException ioex) System.irren.println (ioex.tostring ());
Kopieren Beachten Sie, dass wir in diesem Beispiel jedes Detail, das für die Verbindung erforderlich ist. Dies ist kaum ein Beispiel für das wirkliche Leben, aber es dient seinem Demonstrationszweck.
Wir könnten das Ziel und die Anmeldeinformationen ändern, um den Befehl auf einem Remote -Host auszuführen. Beachten Sie auch, dass die Remote -Sitzung die Berechtigungen des Benutzers verfügt, der sich in Anmeldungen anmeldet. Ich würde nicht raten, einen Benutzer mit hohen Berechtigungen zu verwenden - wie z Wurzel
- Zum Testen enthält die Zielmaschine wertvolle Daten oder Dienste.
Ausführen der Anwendung
Wir können unsere Anwendung direkt aus der IDE ausführen, indem wir im Menü „Ausführen“ auf "Projekt ausführen" (sshremoteExample) "klicken, wodurch die Ausgabe im Ausgabefenster unter dem Quellcode bereitgestellt wird. Wir können auch „Reinigen und Bauprojekt .Krug
Java -Archiv Die kann ohne die IDE ausgeführt werden.
Die bereitgestellte Ausgabe zeigt den Pfad zum Archiv, ähnlich wie folgt (der genaue Pfad kann je nach IDE -Einstellungen variieren):
Um diese Anwendung aus der Befehlszeile ohne Ameise auszuführen, versuchen Sie: java -jar "/var/projects/sshremoteExample/dist/sshremoteExample.Krug"
Wie es vermutet werden kann, können wir unsere erstellte Anwendung aus der Befehlszeile ausführen, und wenn alles gut geht, liefert es eine ähnliche Ausgabe wie die folgenden.
$ java -jar "/var/projects/sshshellexample/dist/sshshellexample.Jar "Letzter Login: Montag 29. Juli 14:27:08 2019 von 127.0.0.1 Hostname df -h beenden [test@test1 ~] $ hostname test1.Linuxconfig.org [test@test1 ~] $ df -h Dateisystemgröße verwendet UVE VERWENDEN IGHED IGHET IST VERWENDE , 7m 3,9g 1% /Run TMPFS 3,9G 0 3,9G 0% /SYS /FS /CGROUP /DEV /MAPPER /FEDORA_LOCALHOST-LIVE-WROT 49G 15G 32 g 32% /TMPFS 3,9G 6,1M 3 , 9g 1% /tmp /dev /sdb1 275g 121g 140g 47% /mnt /hdd_open /dev /sda2 976m 198m 711m 22% /boot /dev /mapper /fedora_LocalHost-Live-Home 60G 50G 6,9G 88% /Home /dev/sda1 200m 18m 182m 9%/boot/efi tmpfs 789m 9,7m 779m 2%/run/user/1000 tmpfs 789m 0 789m 0%/run/user/1001 [testen@test1 ~] $ EXIT LOGOUT EXIT -Status der Ausführung: 0 (OK)
Beachten Sie, dass sich Ihre Ausgabe in den Namen der Lautstärke und Größen wahrscheinlich unterscheiden wird, wenn nichts anderes -, aber im Allgemeinen sollten Sie eine vollständige sehen df -h
Ausgabe, die Sie in eine SSH -Sitzung erhalten würden.
Abschließende Gedanken
Dieses einfache Beispiel sollte die Kraft des JSCH. Mit dem Zugriff auf die Testmaschine und einen ordnungsgemäßen Client enthält der folgende einfache Befehl dieselben Informationen:
$ ssh test@localhost "Hostname; df -h"
Und würde auch keine interaktive Sitzung erstellen. Die gleiche Funktionalität wird von JSCH bereitgestellt, wenn Sie den Kanal im Befehlsmodus öffnen:
Channel Channel = Sitzung.OpenChannel ("Befehl");
Auf diese Weise müssen Sie die Sitzung nicht mit dem Schließen mit dem abschließen Ausfahrt
Shell -Befehl.
Die wahre Leistung dieses Projekts liegt in der Fähigkeit, die Befehle mit fernermaschinen maschinellen Shell herzustellen und mit den nativen Shell -Befehlen auszuarbeiten, die Ausgabe zu verarbeiten und die nächste Aktion programmatisch zu entscheiden. Stellen Sie sich eine Multi-Thread-Anwendung vor, die möglicherweise Hunderte von Servern selbst verwaltet, und Sie erhalten das Bild.
Verwandte Linux -Tutorials:
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Dinge zu installieren auf Ubuntu 20.04
- Ansible Tutorial für Anfänger unter Linux
- Oracle Java Installation auf Ubuntu 20.04 fokale Fossa Linux
- So installieren Sie Java unter Manjaro Linux
- Linux: Java installieren
- Wie man Verwaltungsoperationen mit Ansible durchführt…
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Mastering -Bash -Skriptschleifen beherrschen
- Ansible Vault Tutorial
- « So installieren Sie Netflix in Kodi auf Ubuntu und Debian
- Rhel 8 / CentOS 8 Aktivieren Sie den SSH -Service »