Ssh command in java

How do I run SSH commands on remote system using Java? [closed]

Want to improve this question? Update the question so it focuses on one problem only by editing this post. Closed 1 year ago .

I am new to this kind of Java application and looking for some sample code on how to connect to a remote server using SSH , execute commands, and get output back using Java as programming language.

6 Answers 6

Have a look at Runtime.exec() Javadoc

Process p = Runtime.getRuntime().exec("ssh myhost"); PrintStream out = new PrintStream(p.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); out.println("ls -l /home/me"); while (in.ready()) < String s = in.readLine(); System.out.println(s); >out.println("exit"); p.waitFor(); 

@Zubair — The guy who gave -1 hasn’t bothered to explain his point of view. This solution does work because it is as simple as only possible. It’s not «pure java» though, this is a drawback, but if you’re on Linux, you can’t make it simpler without using third party libraries.

This does not work, at least you could have tested your code and found out that there is no Runtime.exec but a Runtime.getInstance.exec . Even with this correction, the output of ls is not shown.

JSch is a pure Java implementation of SSH2 that helps you run commands on remote machines. You can find it here, and there are some examples here.

Читайте также:  Typescript array map type

Below is the easiest way to SSh in java. Download any of the file in the below link and extract, then add the jar file from the extracted file and add to your build path of the project http://www.ganymed.ethz.ch/ssh2/ and use the below method

public void SSHClient(String serverIp,String command, String usernameString,String password) throws IOException < System.out.println("inside the ssh function"); try < Connection conn = new Connection(serverIp); conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(usernameString, password); if (isAuthenticated == false) throw new IOException("Authentication failed."); ch.ethz.ssh2.Session sess = conn.openSession(); sess.execCommand(command); InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); System.out.println("the output of the command is"); while (true) < String line = br.readLine(); if (line == null) break; System.out.println(line); >System.out.println("ExitCode: " + sess.getExitStatus()); sess.close(); conn.close(); > catch (IOException e) < e.printStackTrace(System.err); >> 

I created solution based on JSch library:

import com.google.common.io.CharStreams import com.jcraft.jsch.ChannelExec import com.jcraft.jsch.JSch import com.jcraft.jsch.JSchException import com.jcraft.jsch.Session import static java.util.Arrays.asList class RunCommandViaSsh < private static final String SSH_HOST = "test.domain.com" private static final String SSH_LOGIN = "username" private static final String SSH_PASSWORD = "password" public static void main() < System.out.println(runCommand("pwd")) System.out.println(runCommand("ls -la")); >private static List runCommand(String command) < Session session = setupSshSession(); session.connect(); ChannelExec channel = (ChannelExec) session.openChannel("exec"); try < channel.setCommand(command); channel.setInputStream(null); InputStream output = channel.getInputStream(); channel.connect(); String result = CharStreams.toString(new InputStreamReader(output)); return asList(result.split("\n")); >catch (JSchException | IOException e) < closeConnection(channel, session) throw new RuntimeException(e) >finally < closeConnection(channel, session) >> private static Session setupSshSession() < Session session = new JSch().getSession(SSH_LOGIN, SSH_HOST, 22); session.setPassword(SSH_PASSWORD); session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); session.setConfig("StrictHostKeyChecking", "no"); // disable check for RSA key return session; >private static void closeConnection(ChannelExec channel, Session session) < try < channel.disconnect() >catch (Exception ignored) < >session.disconnect() > > 

Источник

Java JSch Example to run Shell Commands on SSH Unix Server

Java JSch Example to run Shell Commands on SSH Unix Server

While we believe that this content benefits our community, we have not yet thoroughly reviewed it. If you have any suggestions for improvements, please let us know by clicking the “report an issue“ button at the bottom of the tutorial.

Today we will look into the JSch example tutorial. We can use JSch for creating an SSH connection in java. Earlier I wrote a program to connect to remote database on SSH server. Today, I am presenting a program that can be used to connect to the SSH-enabled server and execute shell commands. I am using JSch to connect to remote ssh server from java program.

JSch Example

You can download JSch jar from its official website. You can also get the JSch jars using below maven dependency.

import java.io.InputStream; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class JSchExampleSSHConnection < /** * JSch Example Tutorial * Java SSH Connection Program */ public static void main(String[] args) < String host="ssh.journaldev.com"; String user="sshuser"; String password="sshpwd"; String command1="ls -ltr"; try< java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); JSch jsch = new JSch(); Session session=jsch.getSession(user, host, 22); session.setPassword(password); session.setConfig(config); session.connect(); System.out.println("Connected"); Channel channel=session.openChannel("exec"); ((ChannelExec)channel).setCommand(command1); channel.setInputStream(null); ((ChannelExec)channel).setErrStream(System.err); InputStream in=channel.getInputStream(); channel.connect(); byte[] tmp=new byte[1024]; while(true)< while(in.available()>0) < int i=in.read(tmp, 0, 1024); if(i<0)break; System.out.print(new String(tmp, 0, i)); >if(channel.isClosed()) < System.out.println("exit-status: "+channel.getExitStatus()); break; >trycatch(Exception ee)<> > channel.disconnect(); session.disconnect(); System.out.println("DONE"); >catch(Exception e) < e.printStackTrace(); >> > 

Let me know if you face any problem with the execution of the JSch example program. It’s a pretty straight forward example of JSch to create an SSH connection in java program. You can download JSch jar file from its official website.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases. Learn more about us

Источник

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].

Источник

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