SSH kapcsolat Java-val

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Bemutatkozás

Az SSH, más néven Secure Shell vagy Secure Socket Shell, egy hálózati protokoll, amely lehetővé teszi az egyik számítógép számára, hogy biztonságosan csatlakozzon egy másik számítógéphez nem biztonságos hálózaton keresztül. Ebben az oktatóanyagban megmutatjuk, hogyan kell létesítsen kapcsolatot egy távoli SSH-szerverrel Java-val a JSch és az Apache MINA SSHD könyvtárak segítségével.

Példáinkban először megnyitjuk az SSH kapcsolatot, majd végrehajtunk egy parancsot, elolvassuk a kimenetet és beírjuk a konzolra, végül pedig bezárjuk az SSH kapcsolatot. A mintakódot a lehető legegyszerűbben fogjuk megtartani.

2. JSch

A JSch az SSH2 Java megvalósítása, amely lehetővé teszi számunkra, hogy csatlakozzunk egy SSH szerverhez, és használjuk a port továbbítást, az X11 továbbítást és a fájlátvitelt. Ezenkívül a BSD stílusú licenc alatt van licencelve, és egyszerű módot kínál az SSH-kapcsolat létrehozására a Java-val.

Először tegyük hozzá a JSch Maven-függőséget pom.xml fájl:

 com.jcraft jsch 0.1.55 

2.1. Végrehajtás

Az SSH-kapcsolat létrehozásához a JSch használatával szükségünk van felhasználónévre, jelszóra, gazdagép URL-re és SSH-portra. Az alapértelmezett SSH-port 22, de előfordulhat, hogy a kiszolgálót úgy konfiguráljuk, hogy más portot használjon SSH-kapcsolatokhoz:

public static void listFolderStructure (String felhasználónév, String jelszó, String host, int port, String parancs) dobja a Kivételt {Session session = null; ChannelExec csatorna = null; próbáld ki a {session = new JSch (). getSession (felhasználónév, gazdagép, port); session.setPassword (jelszó); session.setConfig ("StrictHostKeyChecking", "nem"); session.connect (); channel = (ChannelExec) session.openChannel ("exec"); channel.setCommand (parancs); ByteArrayOutputStream responseStream = új ByteArrayOutputStream (); channel.setOutputStream (responseStream); channel.connect (); while (channel.isConnected ()) {Thread.sleep (100); } String responseString = új karakterlánc (responseStream.toByteArray ()); System.out.println (responseString); } végül {if (session! = null) {session.disconnect (); } if (csatorna! = null) {csatorna.donnonnect (); }}}

Amint a kódban láthatjuk, először létrehozunk egy kliens munkamenetet, és konfiguráljuk azt az SSH szerverünkhöz való csatlakozáshoz. Ezután létrehozunk egy kliens csatornát, amelyet az SSH szerverrel kommunikálunk, ahol megadunk egy csatornatípust - ebben az esetben exec, ami azt jelenti, hogy shell parancsokat adunk át a szervernek.

Be kell állítanunk a kimeneti adatfolyamot a csatornánk számára, ahova a szerver válasza be lesz írva. Miután létrehoztuk a kapcsolatot a channel.connect () metódus esetén a parancs átkerül, és a kapott válasz kiírásra kerül a konzolra.

Lássuk hogyan lehet használni a JSch által kínált különböző konfigurációs paramétereket:

  • StrictHostKeyChecking - jelzi, hogy az alkalmazás ellenőrzi-e a host nyilvános kulcsát az ismert gazdagépek között. A rendelkezésre álló paraméterértékek is kérdez, Igen, és nem, hol kérdez az alapértelmezett. Ha ezt a tulajdonságot beállítjuk Igen, A JSch soha nem fogja automatikusan hozzáadni a gazdagépkulcsot a ismert_gazdák fájlt, és nem fog csatlakozni azokhoz a gazdagépekhez, amelyek gazdagépkulcsa megváltozott. Ez arra kényszeríti a felhasználót, hogy manuálisan adja hozzá az összes új gazdagépet. Ha azt állítjuk nem, A JSch automatikusan hozzáad egy új gazdagépkulcsot az ismert gépek listájához
  • tömörítés.s2c - meghatározza, hogy tömörítést kell-e használni a szerverről az ügyfélalkalmazásunkba irányuló adatfolyamra. A rendelkezésre álló értékek zlib és egyik sem ahol a második az alapértelmezett
  • tömörítés.c2s - meghatározza, hogy az adatfolyamhoz tömörítést kell-e használni az ügyfél-szerver irányban. A rendelkezésre álló értékek zlib és egyik sem ahol a második az alapértelmezett

Fontos zárja le a munkamenetet és az SFTP csatornát, miután a szerverrel folytatott kommunikáció befejeződött, hogy elkerülje a memória szivárgását.

3. Apache MINA SSHD

Az Apache MINA SSHD SSH támogatást nyújt Java-alapú alkalmazásokhoz. Ez a könyvtár az Apache MINA-ra épül, egy méretezhető és nagy teljesítményű aszinkron IO könyvtárra.

Adjuk hozzá az Apache Mina SSHD Maven függőséget:

 org.apache.sshd sshd-core 2.5.1 

3.1. Végrehajtás

Lássuk az SSH-kiszolgálóhoz való kapcsolódás kódmintáját az Apache MINA SSHD használatával:

public static void listFolderStructure (String felhasználónév, String jelszó, String host, int port, hosszú defaultTimeoutSeconds, String parancs) dobja az IOException {SshClient kliens = SshClient.setUpDefaultClient (); client.start (); próbáld meg (ClientSession session = client.connect (felhasználónév, gazdagép, port) .verify (defaultTimeoutSeconds, TimeUnit.SECONDS) .getSession ()) {session.addPasswordIdentity (jelszó); session.auth (). verify (defaultTimeoutSeconds, TimeUnit.SECONDS); try (ByteArrayOutputStream responseStream = új ByteArrayOutputStream (); ClientChannel csatorna = session.createChannel (Channel.CHANNEL_SHELL)) {channel.setOut (responseStream); próbáld meg a {channel.open (). verify (defaultTimeoutSeconds, TimeUnit.SECONDS); próbálkozzon (OutputStream pipedIn = channel.getInvertedIn ()) {pipedIn.write (command.getBytes ()); pipedIn.flush (); } channel.waitFor (EnumSet.of (ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis (defaultTimeoutSeconds)); String responseString = új karakterlánc (responseStream.toByteArray ()); System.out.println (responseString); } végül {channel.close (false); }}} végül {client.stop (); }}

Amikor az Apache MINA SSHD-vel dolgozunk, elég hasonló eseménysorrendünk van, mint a JSch-nél. Először kapcsolatot létesítünk egy SSH szerverrel a SshClient osztálypéldány. Ha azzal inicializáljuk SshClient.setupDefaultClient (), dolgozhatunk azzal a példánnyal, amelynek alapértelmezett konfigurációja megfelel a legtöbb felhasználási esetnek. Ide tartoznak a rejtjelek, a tömörítés, a MAC-ok, a kulcscserék és az aláírások.

Ezt követően létrehozunk ClientChannel és csatolja a ByteArrayOutputStream hozzá, hogy válaszfolyamként használjuk. Mint láthatjuk, az SSHD minden művelethez meghatározott időkorlátokat igényel. Ez lehetővé teszi számunkra azt is, hogy a használatával mennyi ideig várjon a kiszolgáló válaszára a parancs átadása után Channel.waitFor () módszer.

Fontos ezt észrevenni Az SSHD a konzol teljes kimenetét beírja a válaszfolyamba. A JSch csak a parancs végrehajtásának eredményével fogja megtenni.

Az Apache Mina SSHD teljes dokumentációja elérhető a projekt hivatalos GitHub adattárában.

4. Következtetés

Ez a cikk bemutatta, hogyan lehet SSH-kapcsolatot létesíteni a Java-val a rendelkezésre álló Java könyvtárak közül kettővel - a JSch és az Apache Mina SSHD használatával. Megmutattuk azt is, hogy miként adhatjuk át a parancsot a távoli szervernek, és hogyan érhetjük el a végrehajtás eredményét. A teljes kódminták elérhetők a GitHubon is.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT