Ssh connection in java

SSH-Соединение С Java

Узнайте, как установить SSH – соединение с Java, используя две доступные библиотеки Java-JSch и Apache Mina SSHD.

1. введение

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

В наших примерах мы сначала откроем SSH-соединение, затем выполним одну команду, прочитаем вывод и запишем его в консоль и, наконец, закроем SSH-соединение. Мы постараемся сделать образец кода как можно более простым.

2. JSch

JSch – это Java-реализация SSH2, которая позволяет нам подключаться к SSH-серверу и использовать переадресацию портов, переадресацию X11 и передачу файлов. Кроме того, он лицензирован по лицензии BSD style и предоставляет нам простой способ установить SSH – соединение с Java.

Во-первых, давайте добавим зависимость JSch Maven в ваш pom.xml файл:

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, , что означает, что мы будем передавать команды оболочки на сервер.

Читайте также:  Get method object java

Кроме того, мы должны установить выходной поток для нашего канала, в котором будет записан ответ сервера. После установления соединения с помощью метода channel.connect() команда передается, и полученный ответ записывается на консоль.

Давайте посмотрим как использовать различные параметры конфигурации, которые предлагает JSch :

  • StrictHostKeyChecking – указывает, будет ли приложение проверять, можно ли найти открытый ключ хоста среди известных хостов. Кроме того, доступны значения параметров ask , yes, и no , где ask – значение по умолчанию. Если мы установим этому свойству значение yes , JSch никогда автоматически не добавит ключ хоста в файл known_hosts и откажется подключаться к хостам, ключ хоста которых изменился. Это заставляет пользователя вручную добавлять все новые хосты. Если мы установим его в no , JSch автоматически добавит новый ключ хоста в список известных хостов
  • сжатие.s2c – указывает, следует ли использовать сжатие для потока данных с сервера в наше клиентское приложение. Доступные значения: zlib и none , где второе значение по умолчанию
  • сжатие.c2s – указывает, следует ли использовать сжатие для потока данных в направлении клиент-сервер. Доступные значения: zlib и none , где второе значение по умолчанию

Важно закрыть сеанс и канал SFTP после завершения связи с сервером, чтобы избежать утечки памяти .

3. Apache MINA SSHD

Apache MINA SSHD обеспечивает поддержку SSH для приложений на базе Java. Эта библиотека основана на Apache MINA, масштабируемой и высокопроизводительной библиотеке асинхронного ввода-вывода.

Давайте добавим зависимость 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-сервером, используя экземпляр класса Ssh Client . Если мы инициализируем его с помощью SSHClient.setupDefaultClient(), мы сможем работать с экземпляром, который имеет конфигурацию по умолчанию, подходящую для большинства случаев использования. Это включает в себя шифры, сжатие, MAC, обмен ключами и подписи.

После этого мы создадим Клиентский канал и прикрепите к нему ByteArrayOutputStream , чтобы мы использовали его в качестве потока ответов. Как мы видим, SSHD требует определенных тайм-аутов для каждой операции. Он также позволяет нам определить, как долго он будет ждать ответа сервера после передачи команды, используя метод Channel.waitFor () .

Важно отметить, что SSHD запишет полный вывод консоли в поток ответов. JSch сделает это только с результатом выполнения команды.

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

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

В этой статье показано, как установить SSH – соединение с Java с помощью двух доступных библиотек Java- JSch и Apache Mina SSHD. Мы также показали, как передать команду на удаленный сервер и получить результат выполнения. Кроме того, полные образцы кода доступны на GitHub .

Источник

Make an SSH connection with a remote server using Java

We can build an ssh connection to any remote server by following some simple steps mentioned below.

Adding dependencies

We will use the JSch library to connect with the remote server. So, we will add its dependency here –

Now, we can connect with the remote server with Jsch using two methods –

Let’s see each of them one by one.

Making an SSH connection with Jsch using a password

So, let us see what we need to connect to a remote server. Well, there are only a few things-

  • Remote server IP
  • Remote server port ( The port on which you want to connect on, say, 33000 )
  • Username
  • Password

Below is the sample code to connect with your server using the password –

import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.JSchException; public class Codekru < public static void main(String[] args) < try < JSch jsch = new JSch(); String username = "codekru"; // your username String host = "127.0.0.1"; // your remote server address int port = 33000; // your remote server port String password = "root"; // your username's password Session session = jsch.getSession(username, host, port); session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.setTimeout(15000); session.connect(); >catch (JSchException e) < e.printStackTrace(); >> >

This is it if you want to make an ssh connection using the password. Now, let’s move on to making a connection using a key.

Making an SSH connection using key

So, We will have to store our key someplace in our machine. We kept it at “/Users/codekru/key”. Now, let’s use this key and make an ssh connection.

import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import com.jcraft.jsch.JSchException; public class Codekru < public static void main(String[] args) < try < JSch jsch = new JSch(); String user = "codekru"; // your username String host = "127.0.0.1"; // your remote server address int port = 33000; // your remote server port String yourKeyName = "/Users/codekru/key"; jsch.addIdentity(yourKeyName); Session session = jsch.getSession(user, host, port); session.setConfig("StrictHostKeyChecking", "no"); session.setTimeout(15000); session.connect(); >catch (JSchException e) < e.printStackTrace(); >> >

Using this, you can establish an ssh connection with Jsch using a key.

What if we used an invalid key? What exception we will get?

We will get an invalid privatekey JSchException.

com.jcraft.jsch.JSchException: invalid privatekey: [[email protected] at com.jcraft.jsch.KeyPair.load(KeyPair.java:948) at com.jcraft.jsch.KeyPair.load(KeyPair.java:561) at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40) at com.jcraft.jsch.JSch.addIdentity(JSch.java:406) at com.jcraft.jsch.JSch.addIdentity(JSch.java:366)
What if we used the wrong password?

Here, we will get an Auth fail JSchException.

com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:519) at com.jcraft.jsch.Session.connect(Session.java:183)
Related Articles –

I hope you liked this article. If you found anything wrong or have any doubts, please feel free to write us in the comments or mail us at [email protected].

Источник

Create SSH Connection in Java

Create SSH Connection in Java

The SSH, also known as the Secure Shell or Secure Socket Shell, is a network protocol that allows us to connect over a secured connection to another computer.

Today’s tutorial discusses how to open an SSH connection and demonstrates the use of JSch and Apache Mina SSHD to create an SSH connection.

Create SSH Connection in Java

There are various ways but using JSch and Apache Mina SSHD are the most common, so let’s learn them one by one.

Method 1: Use JSch to Create an SSH Connection in Java

JSch is an implementation of SSH2 written in pure Java. This library allows you to connect to an SSHD server. It also allows you to use X11 forwarding, port forwarding, file transfer, and more.

Our example below will create a simple SSH connection using the JSch .

// Importing necessary packages  import com.jcraft.jsch.*; import java.io.InputStream;  public class JavaJSCH   public static void main(String[] args)   // Organizing all necessary elements for authenticating  String MyHost="test.rebex.net";  String User="demo";  String Password="password";   try  // Configuring  java.util.Properties Config = new java.util.Properties();   // Disable the 'StrictHostKeyChecking'  Config.put("StrictHostKeyChecking", "no");   // Declaring a JSch object  JSch Jsch = new JSch();   //Creating a session  Session MySession=Jsch.getSession(User, MyHost, 22);   // Setting the session password  MySession.setPassword(Password);   // Configuring the session  MySession.setConfig(Config);   // Connecting the session  MySession.connect();  System.out.println("Successfully Connected . ");   >catch(Exception e)  e.printStackTrace();  >  > > 

Method 2: Use Apache Mina SSHD to Create an SSH Connection in Java

The Apache Mina SSHD is another library to create a connection with a server using the SSH protocols. This library is also written in pure Java, and the library is mainly based on Apache MINA .

Our example below will create a simple SSH connection using the Apache Mina SSHD .

// Importing necessary packages  import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.example.reverser.ReverseProtocolHandler;  import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  public class JavaSSHD   //Specifying the PORT  private static final int PORT = 8080;   public static void main(String[] args) throws Exception    // Creating an acceptor object  NioSocketAcceptor TheAcceptor = new NioSocketAcceptor();  // Preparing the configuration  TheAcceptor.getFilterChain().addLast("logger", new LoggingFilter());  TheAcceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(  new TextLineCodecFactory(  Charset.forName("UTF-8"))));   // Binding all necessary things  TheAcceptor.setHandler(new ReverseProtocolHandler());  TheAcceptor.bind(new InetSocketAddress(PORT));  System.out.println("Listening on port " + PORT);  > > 

The example shared above illustrates a basic level of a server program that provides a list of the port. When you run the example code shared above, you will get the below output in your console.

Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.

Источник

Оцените статью