Ausführende Befehle auf einem Remote -Computer von Java mit JSCH ausführen

Ausführende Befehle auf einem Remote -Computer von Java mit JSCH ausführen

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
JSCH Beispielausführung.

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
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.

WARNUNG
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.

Hinzufügen eines Glass als Bibliothek.

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 ...".

Hinzufügen einer neuen Java -Klasse zum Paket.

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