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/");
//。。。關閉連接
以上為一些基礎命令的用法,通過結合一些常用的運維命令即可實現一個運維系統的功能。