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年,是比較古老的一個工具了。下面看看這個工具能夠作什麼。html

環境準備

Linux服務器準備

測試時在本機上裝了一個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機器。服務器

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);
        }
    }
}

以上代碼執行結果以下: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/");
//。。。關閉鏈接

以上爲一些基礎命令的用法,經過結合一些經常使用的運維命令便可實現一個運維繫統的功能。

相關文章
相關標籤/搜索