SSH-forbindelse med Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

SSH, også kendt som Secure Shell eller Secure Socket Shell, er en netværksprotokol, der gør det muligt for en computer at oprette forbindelse sikkert til en anden computer via et usikret netværk. I denne vejledning viser vi, hvordan du gør det oprette forbindelse til en ekstern SSH-server med Java ved hjælp af JSch- og Apache MINA SSHD-bibliotekerne.

I vores eksempler åbner vi først SSH-forbindelsen, udfører derefter en kommando, læser output og skriver det til konsollen, og til sidst lukker SSH-forbindelsen. Vi holder prøvekoden så enkel som muligt.

2. JSch

JSch er Java-implementeringen af ​​SSH2, der giver os mulighed for at oprette forbindelse til en SSH-server og bruge portvideresendelse, X11-videresendelse og filoverførsel. Det er også licenseret under BSD-stillicensen og giver os en nem måde at etablere en SSH-forbindelse med Java på.

Lad os først tilføje JSch Maven-afhængigheden til vores pom.xml fil:

 com.jcraft jsch 0.1.55 

2.1. Implementering

For at oprette en SSH-forbindelse ved hjælp af JSch har vi brug for et brugernavn, adgangskode, værts-URL og SSH-port. Standard SSH-porten er 22, men det kan ske, at vi konfigurerer serveren til at bruge en anden port til SSH-forbindelser:

offentlig statisk ugyldig listeFolderStructure (streng brugernavn, streng adgangskode, streng vært, int port, streng kommando) kaster undtagelse {session session = null; ChannelExec kanal = null; prøv {session = ny JSch (). getSession (brugernavn, vært, port); session.setPassword (adgangskode); session.setConfig ("StrictHostKeyChecking", "no"); session.connect (); channel = (ChannelExec) session.openChannel ("exec"); channel.setCommand (kommando); ByteArrayOutputStream responsStream = ny ByteArrayOutputStream (); channel.setOutputStream (responsStream); channel.connect (); mens (channel.isConnected ()) {Thread.sleep (100); } Streng responsString = ny streng (responsStream.toByteArray ()); System.out.println (responsString); } endelig {if (session! = null) {session.disconnect (); } hvis (channel! = null) {channel.disconnect (); }}}

Som vi kan se i koden, opretter vi først en klientsession og konfigurerer den til forbindelse til vores SSH-server. Derefter opretter vi en klientkanal, der bruges til at kommunikere med SSH-serveren, hvor vi leverer en kanaltype - i dette tilfælde udføre, hvilket betyder, at vi sender shell-kommandoer til serveren.

Vi skal også indstille outputstrømmen til vores kanal, hvor serverresponsen skrives. Når vi har oprettet forbindelsen ved hjælp af channel.connect () metode overføres kommandoen, og det modtagne svar skrives på konsollen.

Lad os se hvordan man bruger forskellige konfigurationsparametre, som JSch tilbyder:

  • StrictHostKeyChecking - det angiver, om applikationen vil kontrollere, om værtens offentlige nøgle kunne findes blandt kendte værter. Også tilgængelige parameterværdier er spørge, Ja, og ingen, hvor spørge er standard. Hvis vi indstiller denne ejendom til Ja, JSch vil aldrig automatisk føje værtsnøglen til kendt_hosts fil, og den nægter at oprette forbindelse til værter, hvis værtsnøgle er ændret. Dette tvinger brugeren til manuelt at tilføje alle nye værter. Hvis vi indstiller det til ingen, JSch tilføjer automatisk en ny værtsnøgle til listen over kendte værter
  • kompression.s2c - specificerer, om kompression skal bruges til datastrømmen fra serveren til vores klientapplikation. Tilgængelige værdier er zlib og ingen hvor det andet er standard
  • compression.c2s - specificerer, om kompression skal bruges til datastrømmen i klient-serverretningen. Tilgængelige værdier er zlib og ingen hvor det andet er standard

Det er vigtigt at luk sessionen og SFTP-kanalen, når kommunikationen med serveren er afsluttet for at undgå hukommelseslækage.

3. Apache MINA SSHD

Apache MINA SSHD leverer SSH-support til Java-baserede applikationer. Dette bibliotek er baseret på Apache MINA, et skalerbart og højtydende asynkront IO-bibliotek.

Lad os tilføje Apache Mina SSHD Maven-afhængighed:

 org.apache.sshd sshd-core 2.5.1 

3.1. Implementering

Lad os se kodeeksemplet for at oprette forbindelse til SSH-serveren ved hjælp af Apache MINA SSHD:

offentlig statisk ugyldig listeFolderStructure (String-brugernavn, String-adgangskode, String-vært, int-port, lang standardTimeoutSeconds, String-kommando) kaster IOException {SshClient-klient = SshClient.setUpDefaultClient (); client.start (); prøv (ClientSession-session = client.connect (brugernavn, vært, port). verificer (defaultTimeoutSeconds, TimeUnit.SECONDS) .getSession ()) {session.addPasswordIdentity (password); session.auth (). verificere (defaultTimeoutSeconds, TimeUnit.SECONDS); prøv (ByteArrayOutputStream responsStream = ny ByteArrayOutputStream (); ClientChannel kanal = session.createChannel (Channel.CHANNEL_SHELL)) {channel.setOut (responsStream); prøv {channel.open (). verificer (defaultTimeoutSeconds, TimeUnit.SECONDS); prøv (OutputStream pipedIn = channel.getInvertedIn ()) {pipedIn.write (command.getBytes ()); pipedIn.flush (); } channel.waitFor (EnumSet.of (ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis (defaultTimeoutSeconds)); String responseString = ny String (responsStream.toByteArray ()); System.out.println (responsString); } endelig {channel.close (false); }}} endelig {client.stop (); }}

Når vi arbejder med Apache MINA SSHD, har vi en temmelig lignende rækkefølge af begivenheder som med JSch. Først opretter vi en forbindelse til en SSH-server ved hjælp af SshClient klasseinstans. Hvis vi initialiserer det med SshClient.setupDefaultClient (), Vi kan arbejde med den forekomst, der har en standardkonfiguration, der passer til de fleste brugssager. Dette inkluderer cifre, komprimering, MAC'er, nøgleudvekslinger og signaturer.

Derefter opretter vi ClientChannel og fastgør ByteArrayOutputStream til det, så vi bruger det som en responsstrøm. Som vi kan se, kræver SSHD definerede timeouts for hver operation. Det giver os også mulighed for at definere, hvor længe det venter på serverrespons, når kommandoen er videregivet ved hjælp af Channel.waitFor () metode.

Det er vigtigt at bemærke det SSHD skriver komplet konsoloutput i responsstrømmen. JSch vil kun gøre det med resultatet af kommandoen.

Komplet dokumentation om Apache Mina SSHD er tilgængelig på projektets officielle GitHub-lager.

4. Konklusion

Denne artikel illustrerede, hvordan man opretter en SSH-forbindelse med Java ved hjælp af to af de tilgængelige Java-biblioteker - JSch og Apache Mina SSHD. Vi viste også, hvordan man sender kommandoen til fjernserveren og får udførelsesresultatet. Komplette kodeeksempler er også tilgængelige på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN