經常需要登入遠端系統並執行一些命令或程式以取得輸出,許多軟體可以達到此目的,例如 putty 和 gitshell。這些軟體通常提供對遠端系統的安全存取。但是,您是否曾經想過,如果您需要同時在許多不同的系統上執行命令並將所有這些結果返回到單一位置,該怎麼辦?尤其在大數據時代,許多任務可能在不同的分散式系統上執行,而您希望有一個單一位置來累積結果。
在這篇文章中,我們將介紹一個可以幫助實現此目標的 Java 函式庫 -- JSch。它是一個純 Java 實現的 SSH2。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
這相當方便。如果您想在兩個遠端系統上執行相同的命令,您只需要建立一個新的 Session 和 Channel 並執行相同的操作。
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?