Ganymed SSH-2 for Java學習筆記


Ganymed SSH-2 for Java 是什么

Ganymed SSH-2 for Java是用純Java實現SSH-2協議的一個包。可以利用它直接在Java程序中連接SSH服務器。官網地址為 http://www.ganymed.ethz.ch/ssh2/ 可以看到最后的更新日志為2006年,是比較古老的一個工具了。下面看看這個工具可以做什么。

環境准備

Linux服務器准備

測試時在本機上裝了一個Ubuntu的虛擬機,由於新裝的機器沒有ssh服務端,所以需要先安裝openssh-server。

  • 更新下系統工具和依賴
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服務。

配置好ssh服務之后即可通過本地機器的終端ssh連接到linux機器。

Java代碼連接測試

ssh登錄遠程機器測試
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);
		}
	}
}

以上代碼執行結果如下:

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();
//。。。關閉連接

如果要刪除的文件不存在,則會拋出如下異常

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

從服務器下載文件
//。。。建立連接
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/");
//。。。關閉連接

以上為一些基礎命令的用法,通過結合一些常用的運維命令即可實現一個運維系統的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM