Spojenie SSH s Javou

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

SSH, tiež známy ako Secure Shell alebo Secure Socket Shell, je sieťový protokol, ktorý umožňuje jednému počítaču bezpečné pripojenie k druhému počítaču cez nezabezpečenú sieť. V tomto tutoriáli si ukážeme, ako na to nadviazať spojenie so vzdialeným serverom SSH pomocou Javy pomocou knižníc JSch a Apache MINA SSHD.

V našich príkladoch najskôr otvoríme pripojenie SSH, potom vykonáme jeden príkaz, prečítame výstup a zapíšeme ho do konzoly a nakoniec ukončíme pripojenie SSH. Ukážkový kód udržíme čo najjednoduchší.

2. JSch

JSch je implementácia SSH2 v prostredí Java, ktorá nám umožňuje pripojiť sa k serveru SSH a používať presmerovanie portov, presmerovanie X11 a prenos súborov. Je tiež licencovaný podľa licencie štýlu BSD a poskytuje nám ľahký spôsob nadviazania spojenia SSH s Javou.

Najskôr do našej pridajme závislosť JSch Maven pom.xml spis:

 com.jcraft jsch 0.1.55 

2.1. Implementácia

Na vytvorenie spojenia SSH pomocou JSch potrebujeme používateľské meno, heslo, adresu URL hostiteľa a port SSH. Predvolený port SSH je 22, ale mohlo by sa stať, že nakonfigurujeme server tak, aby používal iný port pre pripojenia SSH:

public static void listFolderStructure (meno používateľa reťazca, heslo reťazca, hostiteľ reťazca, int port, príkaz reťazca) vyvolá výnimku {relácia relácie = null; ChannelExec channel = null; skus {session = new JSch (). getSession (username, host, port); session.setPassword (heslo); session.setConfig ("StrictHostKeyChecking", "nie"); session.connect (); channel = (ChannelExec) session.openChannel ("exec"); channel.setCommand (príkaz); ByteArrayOutputStream responseStream = nový ByteArrayOutputStream (); channel.setOutputStream (responseStream); channel.connect (); while (channel.isConnected ()) {Thread.sleep (100); } String responseString = nový String (responseStream.toByteArray ()); System.out.println (responseString); } nakoniec {if (session! = null) {session.disconnect (); } if (channel! = null) {channel.disconnect (); }}}

Ako vidíme v kóde, najskôr vytvoríme reláciu klienta a nakonfigurujeme ju na pripojenie k nášmu serveru SSH. Potom vytvoríme klientský kanál používaný na komunikáciu so serverom SSH, kde poskytujeme typ kanála - v tomto prípade exekútor, čo znamená, že budeme posielať shell príkazy na server.

Mali by sme tiež nastaviť výstupný prúd pre náš kanál, kde sa bude zapisovať odpoveď servera. Po nadviazaní spojenia pomocou channel.connect () metóda, príkaz sa odovzdá a prijatá odpoveď sa zapíše na konzolu.

Pozrime sa ako používať rôzne konfiguračné parametre, ktoré ponúka JSch:

  • StrictHostKeyChecking - označuje, či aplikácia skontroluje, či sa medzi známymi hostiteľmi nachádza verejný kľúč hostiteľa. Dostupné hodnoty parametrov sú tiež opýtať sa, Áno, a č, kde opýtať sa je predvolená hodnota. Ak nastavíme túto vlastnosť na Áno, JSch nikdy automaticky nepridá hostiteľský kľúč do známi_hostitelia súboru a odmietne sa pripojiť k hostiteľom, ktorých kľúč hostiteľa sa zmenil. To prinúti používateľa ručne pridať všetkých nových hostiteľov. Keby sme to nastavili na č, JSch automaticky pridá nový kľúč hostiteľa do zoznamu známych hostiteľov
  • kompresia.s2c - určuje, či sa má použiť kompresia pre dátový tok zo servera do našej klientskej aplikácie. Dostupné hodnoty sú zlib a žiadny kde druhý je predvolený
  • kompresia.c2s - určuje, či sa má použiť kompresia pre dátový tok v smere klient-server. Dostupné hodnoty sú zlib a žiadny kde druhý je predvolený

Je to dôležité po ukončení komunikácie so serverom zatvorte reláciu a kanál SFTP, aby nedošlo k úniku pamäte.

3. Apache MINA SSHD

Apache MINA SSHD poskytuje podporu SSH pre aplikácie založené na prostredí Java. Táto knižnica je založená na Apache MINA, škálovateľnej a vysoko výkonnej asynchrónnej IO knižnici.

Pridajme závislosť Apache Mina SSHD Maven:

 org.apache.sshd sshd-core 2.5.1 

3.1. Implementácia

Pozrime sa na ukážku kódu pripojenia k serveru SSH pomocou Apache MINA SSHD:

public static void listFolderStructure (meno používateľa reťazca, heslo reťazca, hostiteľ reťazca, int port, dlhý defaultTimeoutSeconds, príkaz reťazca) vyvolá IOException {SshClient client = SshClient.setUpDefaultClient (); client.start (); try (ClientSession session = client.connect (username, host, port) .verify (defaultTimeoutSeconds, TimeUnit.SECONDS) .getSession ()) {session.addPasswordIdentity (heslo); session.auth (). verifikácia (defaultTimeoutSeconds, TimeUnit.SECONDS); try (ByteArrayOutputStream responseStream = nový ByteArrayOutputStream (); ClientChannel kanál = session.createChannel (Channel.CHANNEL_SHELL)) {channel.setOut (responseStream); skúsiť {channel.open (). verify (defaultTimeoutSeconds, TimeUnit.SECONDS); try (OutputStream pipedIn = channel.getInvertedIn ()) {pipedIn.write (command.getBytes ()); pipedIn.flush (); } channel.waitFor (EnumSet.of (ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis (defaultTimeoutSeconds)); String responseString = nový String (responseStream.toByteArray ()); System.out.println (responseString); } nakoniec {channel.close (false); }}} nakoniec {client.stop (); }}

Pri práci s Apache MINA SSHD máme celkom podobnú postupnosť udalostí ako pri JSch. Najskôr nadviazame spojenie so serverom SSH pomocou servera SshClient inštancia triedy. Ak to inicializujeme pomocou SshClient.setupDefaultClient (), budeme schopní pracovať s inštanciou, ktorá má predvolenú konfiguráciu vhodnú pre väčšinu prípadov použitia. Patria sem šifry, kompresia, adresy MAC, výmeny kľúčov a podpisy.

Potom vytvoríme ClientChannel a pripojte ByteArrayOutputStream k tomu, aby sme to použili ako prúd odpovedí. Ako vidíme, SSHD vyžaduje definované časové limity pre každú operáciu. Umožňuje nám tiež definovať, ako dlho bude čakať na odpoveď servera po odovzdaní príkazu pomocou Channel.waitFor () metóda.

Je dôležité si to všimnúť SSHD zapíše kompletný výstup z konzoly do toku odpovedí. JSch to urobí iba s výsledkom vykonania príkazu.

Kompletná dokumentácia k Apache Mina SSHD je k dispozícii v oficiálnom úložisku projektu GitHub.

4. Záver

Tento článok ilustroval, ako nadviazať spojenie SSH s Javou pomocou dvoch z dostupných knižníc Java - JSch a Apache Mina SSHD. Ukázali sme tiež, ako odovzdať príkaz vzdialenému serveru a získať výsledok vykonania. Kompletné ukážky kódu sú tiež k dispozícii na stránkach GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

$config[zx-auto] not found$config[zx-overlay] not found