SSH връзка с Java

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Въведение

SSH, известен също като Secure Shell или Secure Socket Shell, е мрежов протокол, който позволява на един компютър да се свърже сигурно с друг компютър през незащитена мрежа. В този урок ще покажем как да установим връзка с отдалечен SSH сървър с Java, използвайки библиотеките JSch и Apache MINA SSHD .

В нашите примери първо ще отворим SSH връзката, след това ще изпълним една команда, ще прочетем изхода и ще го запишем в конзолата и накрая ще затворим SSH връзката. Ще поддържаме примерния код възможно най-опростен.

2. JSch

JSch е внедряването на Java на SSH2, което ни позволява да се свържем със SSH сървър и да използваме пренасочване на портове, препращане на X11 и трансфер на файлове. Също така, той е лицензиран под лиценза за BSD стил и ни предоставя лесен начин за установяване на SSH връзка с Java.

Първо, нека добавим зависимостта JSch Maven към нашия файл pom.xml :

 com.jcraft jsch 0.1.55 

2.1. Изпълнение

За да установим SSH връзка с помощта на JSch, се нуждаем от потребителско име, парола, URL адрес на хост и SSH порт . SSH портът по подразбиране е 22, но може да се случи да конфигурираме сървъра да използва друг порт за SSH връзки:

public static void listFolderStructure(String username, String password, String host, int port, String command) throws Exception { Session session = null; ChannelExec channel = null; try { session = new JSch().getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); channel = (ChannelExec) session.openChannel("exec"); channel.setCommand(command); ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); channel.setOutputStream(responseStream); channel.connect(); while (channel.isConnected()) { Thread.sleep(100); } String responseString = new String(responseStream.toByteArray()); System.out.println(responseString); } finally { if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } }

Както виждаме в кода, първо създаваме клиентска сесия и я конфигурираме за връзка с нашия SSH сървър. След това създаваме клиентски канал, използван за комуникация със SSH сървъра, където предоставяме тип канал - в този случай, exec, което означава, че ще предаваме командни команди на сървъра.

Също така, трябва да зададем изходния поток за нашия канал, където ще бъде записан отговорът на сървъра. След като установим връзката чрез метода channel.connect () , командата се предава и полученият отговор се записва на конзолата.

Нека да видим как да използваме различни конфигурационни параметри, които JSch предлага :

  • StrictHostKeyChecking - показва дали приложението ще провери дали публичният ключ на хоста може да бъде намерен сред известните хостове. Също така, наличните стойности на параметри са ask , yes и no , където ask е по подразбиране. Ако зададем това свойство на да , JSch никога няма автоматично да добави ключа на хоста към файла known_hosts и ще откаже да се свърже с хостове, чийто ключ на хоста е променен. Това принуждава потребителя да добавя ръчно всички нови хостове. Ако го зададем на не , JSch автоматично ще добави нов ключ за хост към списъка с известни хостове
  • compression.s2c - указва дали да се използва компресия за потока от данни от сървъра до нашето клиентско приложение. Наличните стойности са zlib и нито една, където втората е по подразбиране
  • compression.c2s - указва дали да се използва компресия за потока от данни в посока клиент-сървър. Наличните стойности са zlib и нито една, където втората е по подразбиране

Важно е да затворите сесията и SFTP канала след приключване на комуникацията със сървъра, за да избегнете изтичане на памет .

3. Apache MINA SSHD

Apache MINA SSHD осигурява SSH поддръжка за приложения, базирани на Java. Тази библиотека е базирана на Apache MINA, мащабируема и високопроизводителна асинхронна IO библиотека.

Нека добавим зависимостта Apache Mina SSHD Maven:

 org.apache.sshd sshd-core 2.5.1 

3.1. Изпълнение

Нека да видим примерния код за свързване към SSH сървъра с помощта на Apache MINA SSHD:

public static void listFolderStructure(String username, String password, String host, int port, long defaultTimeoutSeconds, String command) throws IOException { SshClient client = SshClient.setUpDefaultClient(); client.start(); try (ClientSession session = client.connect(username, host, port) .verify(defaultTimeoutSeconds, TimeUnit.SECONDS).getSession()) { session.addPasswordIdentity(password); session.auth().verify(defaultTimeoutSeconds, TimeUnit.SECONDS); try (ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); ClientChannel channel = session.createChannel(Channel.CHANNEL_SHELL)) { channel.setOut(responseStream); try { 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 = new String(responseStream.toByteArray()); System.out.println(responseString); } finally { channel.close(false); } } } finally { client.stop(); } }

Когато работим с Apache MINA SSHD, имаме доста подобна последователност от събития, както при JSch. Първо, ние установяваме връзка със SSH сървър, като използваме екземпляра на клас SshClient . Ако го инициализираме с SshClient.setupDefaultClient (), ще можем да работим с екземпляра, който има конфигурация по подразбиране, подходяща за повечето случаи на употреба. Това включва шифри, компресия, MAC, обмен на ключове и подписи.

След това ще създадем ClientChannel и ще прикачим ByteArrayOutputStream към него, така че да го използваме като поток за отговор. Както виждаме, SSHD изисква определени изчаквания за всяка операция. Той също така ни позволява да дефинираме колко дълго ще чака отговор на сървъра, след като командата бъде предадена чрез метода Channel.waitFor () .

Важно е да се отбележи, че SSHD ще запише пълен изход на конзолата в потока за отговор. JSch ще го направи само с резултата от изпълнението на командата.

Пълната документация за Apache Mina SSHD е достъпна в официалното хранилище на GitHub на проекта.

4. Заключение

Тази статия илюстрира как да се установи SSH връзка с Java с помощта на две от наличните Java библиотеки - JSch и Apache Mina SSHD. Също така показахме как да предадем командата на отдалечения сървър и да получим резултата от изпълнението. Също така, пълни примерни кодове са достъпни в GitHub.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА