SSH veza s Javom

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

SSH, također poznat kao Secure Shell ili Secure Socket Shell, mrežni je protokol koji omogućuje jednom računalu da se sigurno poveže s drugim računalom preko nezaštićene mreže. U ovom uputstvu pokazat ćemo kako uspostavite vezu s udaljenim SSH poslužiteljem s Javom koristeći JSch i Apache MINA SSHD knjižnice.

U našim primjerima prvo ćemo otvoriti SSH vezu, zatim izvršiti jednu naredbu, pročitati izlaz i zapisati ga na konzolu i, na kraju, zatvoriti SSH vezu. Uzorak ćemo koda učiniti što jednostavnijim.

2. JSch

JSch je Java implementacija SSH2 koja nam omogućuje povezivanje sa SSH poslužiteljem i korištenje prosljeđivanja porta, X11 prosljeđivanja i prijenosa datoteka. Također, licenciran je pod licencom BSD stila i pruža nam jednostavan način uspostavljanja SSH veze s Javom.

Prvo, dodajmo ovisnost JSch Maven na našu pom.xml datoteka:

 com.jcraft jsch 0.1.55 

2.1. Provedba

Da bismo uspostavili SSH vezu pomoću JSch-a, trebaju nam korisničko ime, lozinka, URL hosta i SSH priključak. Zadani SSH port je 22, no moglo bi se dogoditi da poslužitelj konfiguriramo da koristi drugi port za SSH veze:

javna statička void listFolderStructure (korisničko ime niza, lozinka niza, host niza, int port, naredba niza) baca iznimku {Sesija sesije = null; ChannelExec channel = null; isprobajte {session = new JSch (). getSession (korisničko ime, host, port); session.setPassword (lozinka); session.setConfig ("StrictHostKeyChecking", "ne"); session.connect (); channel = (ChannelExec) session.openChannel ("exec"); channel.setCommand (naredba); ByteArrayOutputStream responseStream = novi ByteArrayOutputStream (); channel.setOutputStream (responseStream); channel.connect (); while (channel.isConnected ()) {Thread.sleep (100); } String responseString = novi niz (responseStream.toByteArray ()); System.out.println (responseString); } napokon {if (session! = null) {session.disconnect (); } if (kanal! = null) {channel.disconnect (); }}}

Kao što možemo vidjeti u kodu, prvo kreiramo sesiju klijenta i konfiguriramo je za povezivanje s našim SSH poslužiteljem. Zatim kreiramo klijentski kanal koji se koristi za komunikaciju sa SSH poslužiteljem gdje pružamo vrstu kanala - u ovom slučaju, exec, što znači da ćemo poslužitelju prenositi naredbe ljuske.

Također, trebali bismo postaviti izlazni tok za naš kanal gdje će se zapisati odgovor poslužitelja. Nakon što uspostavimo vezu pomoću channel.connect () metodom, naredba se prosljeđuje, a primljeni odgovor zapisuje se na konzoli.

Da vidimo kako koristiti različite konfiguracijske parametre koje nudi JSch:

  • StrictHostKeyChecking - pokazuje hoće li aplikacija provjeriti može li se javni ključ hosta pronaći među poznatim hostovima. Također su dostupne vrijednosti parametara pitajte, Da, i Ne, gdje pitajte je zadani. Ako postavimo ovo svojstvo na Da, JSch nikada neće automatski dodati ključ hosta u poznati_hostovi datoteku i odbit će povezivanje s hostovima čiji se ključ hosta promijenio. To prisiljava korisnika da ručno doda sve nove hostove. Ako ga postavimo na Ne, JSch će automatski dodati novi ključ hosta na popis poznatih hostova
  • kompresija.s2c - određuje treba li koristiti kompresiju za tok podataka od poslužitelja do naše klijentske aplikacije. Dostupne vrijednosti su zlib i nijedna gdje je drugi zadani
  • kompresija.c2s - određuje treba li koristiti kompresiju za tok podataka u smjeru klijent-poslužitelj. Dostupne vrijednosti su zlib i nijedna gdje je drugi zadani

Važno je da zatvorite sesiju i SFTP kanal nakon završetka komunikacije s poslužiteljem kako biste izbjegli curenje memorije.

3. Apache MINA SSHD

Apache MINA SSHD pruža SSH podršku za programe temeljene na Javi. Ova se knjižnica temelji na Apache MINA, skalabilnoj i asinkronoj IO knjižnici visokih performansi.

Dodajmo ovisnost Apache Mina SSHD Maven:

 org.apache.sshd sshd-core 2.5.1 

3.1. Provedba

Pogledajmo uzorak koda povezivanja na SSH poslužitelj pomoću Apache MINA SSHD:

javna statička void listFolderStructure (korisničko ime niza, lozinka niza, host niza, int port, dugo defaultTimeoutSeconds, naredba niza) baca IOException {SshClient client = SshClient.setUpDefaultClient (); client.start (); probajte (ClientSession session = client.connect (korisničko ime, host, port) .verify (defaultTimeoutSeconds, TimeUnit.SECONDS) .getSession ()) {session.addPasswordIdentity (lozinka); session.auth (). verify (defaultTimeoutSeconds, TimeUnit.SECONDS); probajte (ByteArrayOutputStream responseStream = new ByteArrayOutputStream (); ClientChannel channel = session.createChannel (Channel.CHANNEL_SHELL)) {channel.setOut (responseStream); pokušajte {channel.open (). verify (defaultTimeoutSeconds, TimeUnit.SECONDS); probajte (OutputStream pipedIn = channel.getInvertedIn ()) {pipedIn.write (command.getBytes ()); pipedIn.flush (); } channel.waitFor (EnumSet.of (ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis (defaultTimeoutSeconds)); String responseString = novi niz (responseStream.toByteArray ()); System.out.println (responseString); } napokon {channel.close (false); }}} napokon {client.stop (); }}

Kada radimo s Apache MINA SSHD, imamo prilično sličan slijed događaja kao kod JSch. Prvo uspostavljamo vezu sa SSH poslužiteljem pomoću SshClient razredna instanca. Ako ga inicijaliziramo s SshClient.setupDefaultClient (), moći ćemo raditi s instancom koja ima zadanu konfiguraciju prikladnu za većinu slučajeva korištenja. To uključuje šifre, kompresiju, MAC-ove, razmjenu ključeva i potpise.

Nakon toga ćemo stvoriti ClientChannel i pričvrstite ByteArrayOutputStream na njega, tako da ćemo ga koristiti kao tok odgovora. Kao što vidimo, SSHD zahtijeva definirana vremenska ograničenja za svaku operaciju. Također nam omogućuje da definiramo koliko će dugo čekati odgovor poslužitelja nakon što se naredba prenese pomoću Channel.waitFor () metoda.

Važno je to primijetiti SSHD će zapisati kompletan izlaz s konzole u tok odgovora. JSch će to učiniti samo s rezultatom izvršenja naredbe.

Kompletna dokumentacija o Apache Mina SSHD dostupna je na službenom spremištu projekta GitHub.

4. Zaključak

Ovaj je članak ilustrirao kako uspostaviti SSH vezu s Javom pomoću dvije dostupne Java knjižnice - JSch i Apache Mina SSHD. Također smo pokazali kako proslijediti naredbu udaljenom poslužitelju i dobiti rezultat izvršenja. Također, kompletni uzorci koda dostupni su na GitHubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ