บ่อยครั้งมีความจำเป็นต้องเข้าสู่ระบบระบบระยะไกลและเรียกใช้คำสั่งหรือโปรแกรมบางอย่างเพื่อรับผลลัพธ์ ซอฟต์แวร์หลายตัวสามารถทำหน้าที่นี้ได้ เช่น putty และ gitshell ซอฟต์แวร์เหล่านี้มักจะให้การเข้าถึงระบบระยะไกลอย่างปลอดภัย แต่คุณเคยสงสัยหรือไม่ว่าจะทำอย่างไรหากคุณต้องการเรียกใช้คำสั่งบนระบบต่างๆ หลายระบบพร้อมกันและรับผลลัพธ์เหล่านั้นกลับมาในที่เดียว โดยเฉพาะอย่างยิ่งในยุคบิ๊กดาต้า งานหลายอย่างอาจทำงานบนระบบกระจายต่างๆ และคุณต้องการที่จะมีที่เดียวในการสะสมผลลัพธ์
ในโพสต์นี้ เราจะแนะนำไลบรารี Java ที่สามารถช่วยให้บรรลุเป้าหมายนี้ได้ -- JSch มันเป็นการใช้งาน SSH2 แบบ Java แท้ๆ JSch ช่วยให้คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ sshd และใช้การส่งต่อพอร์ต การส่งต่อ X11 การถ่ายโอนไฟล์ ฯลฯ และคุณสามารถรวมฟังก์ชันการทำงานลงในโปรแกรม Java ของคุณเองได้
ประโยชน์ของการใช้งานคือ คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลและเรียกใช้คำสั่งบางอย่างได้โดยไม่ต้องเข้าสู่ระบบจริง ด้านล่างนี้เป็นตัวอย่างของวิธีที่คุณสามารถเรียกใช้ ls -la บนเซิร์ฟเวอร์ Linux ระยะไกล
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 สามารถช่วยทำอะไรได้อีกมากมาย รวมถึงการส่งต่อพอร์ต การถ่ายโอนไฟล์ ฯลฯ
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?