- SSH-Соединение С Java
- 1. введение
- 2. JSch
- 2.1. Реализация
- 3. Apache MINA SSHD
- 3.1. Реализация
- 4. Заключение
- Make an SSH connection with a remote server using Java
- Adding dependencies
- Making an SSH connection with Jsch using a password
- Making an SSH connection using key
- Create SSH Connection in Java
- Create SSH Connection in Java
- Method 1: Use JSch to Create an SSH Connection in Java
- Method 2: Use Apache Mina SSHD to Create an 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, , что означает, что мы будем передавать команды оболочки на сервер.
Кроме того, мы должны установить выходной поток для нашего канала, в котором будет записан ответ сервера. После установления соединения с помощью метода 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
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.