SSH-forbindelse med Java

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Introduksjon

SSH, også kjent som Secure Shell eller Secure Socket Shell, er en nettverksprotokoll som gjør det mulig for en datamaskin å koble seg sikkert til en annen datamaskin via et usikret nettverk. I denne opplæringen viser vi hvordan du gjør det etablere en forbindelse til en ekstern SSH-server med Java ved hjelp av JSch- og Apache MINA SSHD-bibliotekene.

I eksemplene våre åpner vi først SSH-tilkoblingen, utfører deretter en kommando, leser utdataene og skriver den til konsollen, og til slutt lukker SSH-forbindelsen. Vi holder prøvekoden så enkel som mulig.

2. JSch

JSch er Java-implementeringen av SSH2 som lar oss koble til en SSH-server og bruke videresending av port, X11 videresending og filoverføring. Det er også lisensiert under BSD-stillisensen og gir oss en enkel måte å etablere en SSH-forbindelse med Java.

La oss først legge til JSch Maven-avhengigheten til vår pom.xml fil:

 com.jcraft jsch 0.1.55 

2.1. Gjennomføring

For å etablere en SSH-forbindelse ved hjelp av JSch, trenger vi et brukernavn, passord, verts-URL og SSH-port. Standard SSH-port er 22, men det kan skje at vi konfigurerer serveren til å bruke annen port for SSH-tilkoblinger:

public static void listFolderStructure (String username, String password, String host, int port, String command) throw Exception {Session session = null; ChannelExec kanal = null; prøv {session = new JSch (). getSession (brukernavn, vert, port); session.setPassword (passord); session.setConfig ("StrictHostKeyChecking", "no"); session.connect (); channel = (ChannelExec) session.openChannel ("exec"); channel.setCommand (kommando); ByteArrayOutputStream responsStream = ny ByteArrayOutputStream (); channel.setOutputStream (responsStream); channel.connect (); while (channel.isConnected ()) {Thread.sleep (100); } Streng responsString = ny streng (responsStream.toByteArray ()); System.out.println (responsString); } til slutt {if (session! = null) {session.disconnect (); } hvis (channel! = null) {channel.disconnect (); }}}

Som vi kan se i koden, oppretter vi først en klientsession og konfigurerer den for tilkobling til SSH-serveren vår. Deretter oppretter vi en klientkanal som brukes til å kommunisere med SSH-serveren der vi tilbyr en kanaltype - i dette tilfellet utføre, som betyr at vi sender skallkommandoer til serveren.

Vi bør også stille utgangsstrømmen for kanalen vår der serverresponsen skal skrives. Etter at vi har etablert forbindelsen ved hjelp av channel.connect () metode, blir kommandoen passert, og mottatt svar skrives på konsollen.

La oss se hvordan du bruker forskjellige konfigurasjonsparametere som JSch tilbyr:

  • StrictHostKeyChecking - det indikerer om applikasjonen vil sjekke om den offentlige vertenøkkelen kan bli funnet blant kjente verter. Også tilgjengelige parameterverdier er spørre, ja, og Nei, hvor spørre er standard. Hvis vi setter denne eiendommen til ja, JSch vil aldri automatisk legge til vertsnøkkelen i kjent_hosts filen, og den nekter å koble til verter hvis vertsnøkkel har endret seg. Dette tvinger brukeren til å legge til alle nye verter manuelt. Hvis vi setter det til Nei, JSch vil automatisk legge til en ny vertsnøkkel i listen over kjente verter
  • komprimering.s2c - spesifiserer om komprimering skal brukes for datastrømmen fra serveren til klientapplikasjonen vår. Tilgjengelige verdier er zlib og ingen der det andre er standard
  • komprimering.c2s - spesifiserer om komprimering skal brukes for datastrømmen i klient-serverretningen. Tilgjengelige verdier er zlib og ingen der det andre er standard

Det er viktig å lukk økten og SFTP-kanalen etter at kommunikasjonen med serveren er over for å unngå minnelekkasjer.

3. Apache MINA SSHD

Apache MINA SSHD gir SSH-støtte for Java-baserte applikasjoner. Dette biblioteket er basert på Apache MINA, et skalerbart og høytytende asynkront IO-bibliotek.

La oss legge til Apache Mina SSHD Maven-avhengighet:

 org.apache.sshd sshd-core 2.5.1 

3.1. Gjennomføring

La oss se kodeeksemplet for å koble til SSH-serveren ved hjelp av Apache MINA SSHD:

public static void listFolderStructure (String username, String password, String host, int port, long defaultTimeoutSeconds, String command) throw IOException {SshClient client = SshClient.setUpDefaultClient (); client.start (); prøv (ClientSession session = client.connect (brukernavn, vert, port). verify (defaultTimeoutSeconds, TimeUnit.SECONDS) .getSession ()) {session.addPasswordIdentity (passord); session.auth (). verifisere (defaultTimeoutSeconds, TimeUnit.SECONDS); prøv (ByteArrayOutputStream responseStream = ny ByteArrayOutputStream (); ClientChannel channel = session.createChannel (Channel.CHANNEL_SHELL)) {channel.setOut (responseStream); prøv {channel.open (). verifiser (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)); Streng responsString = ny streng (responsStream.toByteArray ()); System.out.println (responsString); } til slutt {channel.close (false); }}} til slutt {client.stop (); }}

Når vi jobber med Apache MINA SSHD, har vi en ganske lik rekkefølge av hendelser som med JSch. Først oppretter vi en forbindelse til en SSH-server ved hjelp av SshClient klasseinstans. Hvis vi initialiserer det med SshClient.setupDefaultClient (), Vi vil kunne jobbe med forekomsten som har en standardkonfigurasjon som passer for de fleste brukssaker. Dette inkluderer kryptering, komprimering, MAC, nøkkelutveksling og signaturer.

Etter det lager vi ClientChannel og fest ByteArrayOutputStream til den, slik at vi bruker den som en responsstrøm. Som vi kan se krever SSHD definerte tidsavbrudd for hver operasjon. Det lar oss også definere hvor lenge det vil vente på serverrespons etter at kommandoen er sendt med Channel.waitFor () metode.

Det er viktig å legge merke til det SSHD vil skrive fullstendig konsollutgang i responsstrømmen. JSch vil bare gjøre det med kommandokjøringsresultatet.

Komplett dokumentasjon om Apache Mina SSHD er tilgjengelig på prosjektets offisielle GitHub-arkiv.

4. Konklusjon

Denne artikkelen illustrerte hvordan du oppretter en SSH-forbindelse med Java ved hjelp av to av de tilgjengelige Java-bibliotekene - JSch og Apache Mina SSHD. Vi viste også hvordan du sender kommandoen til den eksterne serveren og får utførelsesresultatet. Komplette kodeeksempler er også tilgjengelig på GitHub.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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