Remote execute command in Java example

  sonic0002        2014-12-12 03:20:19       46,566        11          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

经常需要登录远程系统并运行一些命令或程序以获取输出,许多软件都可以实现此目的,例如putty和gitshell。这些软件通常提供对远程系统的安全访问。但是,您是否想过,如果您需要同时在许多不同的系统上运行命令并将所有这些结果返回到一个地方,该怎么办?尤其在大数据时代,许多任务可能在不同的分布式系统上运行,而您希望有一个单一的地方来累积结果。

在这篇文章中,我们将介绍一个可以帮助实现此目标的Java库——JSch。它是SSH2的纯Java实现。JSch允许您连接到sshd服务器并使用端口转发、X11转发、文件传输等,您可以将其功能集成到您自己的Java程序中。

使用它的好处是您可以通过编程方式连接到远程服务器并在那里执行一些命令,而无需实际登录到它。下面是一个如何在远程Linux服务器上运行ls -la的示例。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;


public class JSchTest {
	public static void main(String[] args){
		try{
			String command = "ls -la";
			String host = "host_ip";
			String user = "username";
			String password = "password";
			
			JSch jsch = new JSch();
			Session session = jsch.getSession(user, host, 22);
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");
			session.setConfig(config);;
			session.setPassword(password);
			session.connect();
			
			Channel channel = session.openChannel("exec");
			((ChannelExec)channel).setCommand(command);
			channel.setInputStream(null);
			((ChannelExec)channel).setErrStream(System.err);
			
			InputStream input = channel.getInputStream();
			channel.connect();
			
			System.out.println("Channel Connected to machine " + host + " server with command: " + command ); 
			
			try{
				InputStreamReader inputReader = new InputStreamReader(input);
				BufferedReader bufferedReader = new BufferedReader(inputReader);
				String line = null;
				
				while((line = bufferedReader.readLine()) != null){
					System.out.println(line);
				}
				bufferedReader.close();
				inputReader.close();
			}catch(IOException ex){
				ex.printStackTrace();
			}
			
			channel.disconnect();
			session.disconnect();
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

运行程序后,输出为:

Channel Connected to machine hostname server with command: ls -la
total 1367872
drwxr-xr-x 33 peter users      4096 Dec 11 16:49 .
drwxr-xr-x  6 root  root       4096 Mar 21  2014 ..
-rw-------  1 peter users     15607 Dec 11 19:01 .bash_history
-rw-r--r--  1 peter users      1177 Mar 21  2014 .bashrc
drwxr-xr-x  2 peter users      4096 Sep 12 09:47 bin
drwxrwxrwx  2 peter users      4096 Sep  3 14:10 cfg

这非常方便。如果您想在两个远程系统上运行相同的命令,您只需要创建一个新的会话和通道并执行相同的操作。

JSch可以帮助做更多的事情,包括端口转发、文件传输等。

JSCH  EXAMPLE  DISTRIBUTED SYSTEM  SSH2 

       

  RELATED


  11 COMMENTS


Anonymous [Reply]@ 2017-08-06 23:10:19

Hey Sonic,

Great article. That is what i was looking for. Thanks

But i am getting a "com.jcraft.jsch.JSchException: java.net.ConnectException: Connection refused: connect" error.

Any insights here?

Ke Pi [Reply]@ 2017-08-07 09:03:53

Apparently the error you are seeing is that remote end refuses the connection. Maybe the port is not accessible. Please make sure that you can telnet to the remote host at port 22.

Anonymous [Reply]@ 2018-05-14 04:30:51

Hi Sonic,

on a Windows server how can I connect? I can't use 22 port.

Thanks,

Sara

Ke Pi [Reply]@ 2018-05-14 10:00:39

What do you mean by you cannot use port 22? The port you should use depends on what port the SSHd service is listening at the other end. 

Venni [Reply]@ 2018-08-14 09:04:21

How can we execute multiple commands ?

Ke Pi [Reply]@ 2018-08-14 10:58:26

Can try to delimit the command with semicolon

Anonymous [Reply]@ 2019-12-09 04:01:37

After sending a command I get a prompt where I need to provide an user input. How can I do this?

Ke Pi [Reply]@ 2019-12-10 09:08:27

Ideally it should not prompt as you already put username. Out of curiosity, what prompt do you see? In your Java output?

Anonymous [Reply]@ 2019-12-10 10:05:50

It’s like an incident number where i need to give user input

Ke Pi [Reply]@ 2019-12-11 08:14:21

Maybe it's related to interactive mode of ssh? https://unix.stackexchange.com/questions/349425/ssh-command-and-non-interactive-non-login-shell

Prasun [Reply]@ 2020-06-07 02:56:40

i'm new to java.. just trying to creating ssh connection and execute the shell script which has pretty long output in console. How can we have handle such scenario. I see script code is getting hanged and not display the console output.



  RANDOM FUN

Team work in reality