Ganymed SSH-2 for Java是用純Java實現SSH-2協議的一個包。能夠利用它直接在Java程序中鏈接SSH服務器。官網地址爲 http://www.ganymed.ethz.ch/ssh2/ 能夠看到最後的更新日誌爲2006年,是比較古老的一個工具了。下面看看這個工具能夠作什麼。html
測試時在本機上裝了一個Ubuntu的虛擬機,因爲新裝的機器沒有ssh服務端,因此須要先安裝openssh-server。java
sudo apt-get update;
sudo apt-get install openssh-server openssh-client
安裝完成以後能夠經過 sudo ps -e |grep ssh
查看ssh是否在運行。若是結果存在sshd則表示ssh服務已經在運行。能夠經過 sudo service ssh start
來啓動ssh服務。linux
配置好ssh服務以後便可經過本地機器的終端ssh鏈接到linux機器。服務器
import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; public class Basic { public static void main(String[] args) { String hostname = "192.168.1.101";//遠程機器IP String username = "sss";//登陸用戶名 String password = "123456";//登陸密碼 try { Connection conn = new Connection(hostname); conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); ///是否登陸成功 if (isAuthenticated == false) { throw new IOException("Authentication failed."); } Session sess = conn.openSession(); //執行命令 sess.execCommand("uname -a && date && uptime && who"); System.out.println("Here is some information about the remote host:"); InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); while (true) { String line = br.readLine(); if (line == null) break; System.out.println(line); } /* Show exit status, if available (otherwise "null") */ System.out.println("ExitCode: " + sess.getExitStatus()); //關閉鏈接 sess.close(); conn.close(); } catch (IOException e) { e.printStackTrace(System.err); System.exit(2); } } }
以上代碼執行結果以下:session
Here is some information about the remote host: Linux sss-VirtualBox 4.13.0-16-generic #19-Ubuntu SMP Wed Oct 11 18:35:14 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 2017年 11月 16日 星期四 19:19:12 CST 19:19:12 up 1:21, 2 users, load average: 0.00, 0.00, 0.00 sss tty2 2017-11-16 17:58 (/dev/tty2) sss pts/1 2017-11-16 18:01 (10.15.233.83) ExitCode: 0
在服務器的用戶目錄下執行touch命令新建一個文件
touch test.txt
運維
//...創建鏈接 boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) { throw new IOException("Authentication failed."); } System.out.println("鏈接服務器成功!"); SFTPv3Client sftpClient = new SFTPv3Client(conn); sftpClient.rm("/home/sss/test.txt");//刪除文件 sftpClient.close(); //。。。關閉鏈接
若是要刪除的文件不存在,則會拋出以下異常ssh
ch.ethz.ssh2.SFTPException: No such file (SSH_FX_NO_SUCH_FILE: A reference was made to a file which does not exist.) at ch.ethz.ssh2.SFTPv3Client.expectStatusOKMessage(SFTPv3Client.java:555) at ch.ethz.ssh2.SFTPv3Client.rm(SFTPv3Client.java:969) at ganymed.DeleteServerFile.main(DeleteServerFile.java:25)
//。。。創建鏈接 SFTPv3Client sftpClient = new SFTPv3Client(conn); sftpClient.rmdir("/home/sss/test/");//刪除文件夾 Remove an empty directory sftpClient.close(); //。。。關閉鏈接
注意,以上刪除文件夾的方法只能刪除空文件夾。若是要刪除非空文件夾則須要採用其餘方法。工具
使用touch命令及mkdir命令在服務器上用戶目錄下建立一些文件和子文件夾。測試
//。。。創建鏈接 String cmd = " rm -rf /home/sss/test"; Session session = conn.openSession(); session.execCommand(cmd); session.close(); //。。。關閉鏈接
能夠直接執行rm -rf命令來刪除非空文件夾。固然,還有別的方法,參考 http://blog.csdn.net/column/details/13576.html.net
//。。。創建鏈接 SCPClient client = new SCPClient(conn); //從服務器下載文件 client.get("/home/sss/sss.txt", "/Users/sss/"); //。。。關閉鏈接
//。。。創建鏈接 SCPClient client = new SCPClient(conn); //上傳文件至服務器 client.put("/Users/sss/s.txt", "/home/sss/"); //。。。關閉鏈接
以上爲一些基礎命令的用法,經過結合一些經常使用的運維命令便可實現一個運維繫統的功能。