Remote execute command in Java example

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

Thường xuyên cần đăng nhập vào một hệ thống từ xa và chạy một số lệnh hoặc chương trình để lấy kết quả, nhiều phần mềm có thể phục vụ mục đích này như putty và gitshell. Các phần mềm này thường cung cấp quyền truy cập an toàn vào hệ thống từ xa. Nhưng bạn đã bao giờ tự hỏi phải làm gì nếu bạn cần chạy lệnh trên nhiều hệ thống khác nhau cùng một lúc và nhận tất cả các kết quả này trở lại ở một nơi duy nhất? Đặc biệt là trong kỷ nguyên dữ liệu lớn, nhiều tác vụ có thể chạy trên các hệ thống phân tán khác nhau và bạn muốn có một nơi duy nhất để tích lũy kết quả.

Trong bài đăng này, chúng tôi sẽ giới thiệu một thư viện Java có thể giúp đạt được điều này — JSch. Đây là một triển khai SSH2 thuần Java. JSch cho phép bạn kết nối với máy chủ sshd và sử dụng chuyển tiếp cổng, chuyển tiếp X11, chuyển tệp, v.v., và bạn có thể tích hợp chức năng của nó vào các chương trình Java của riêng mình. 

Lợi ích của việc sử dụng nó là bạn có thể lập trình kết nối với máy chủ từ xa và thực thi một số lệnh ở đó mà không cần đăng nhập vào nó. Dưới đây là một ví dụ về cách bạn có thể chạy ls -la trên máy chủ Linux từ xa.

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();
		}
	}
}

Sau khi chạy chương trình, đầu ra là:

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

Khá tiện lợi. Nếu bạn muốn chạy cùng một lệnh trên hai hệ thống từ xa, bạn chỉ cần tạo một phiên và kênh mới và làm tương tự.

JSch có thể giúp làm nhiều việc hơn nữa bao gồm chuyển tiếp cổng, chuyển tệp, v.v.

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

Where is my bike?