zoukankan      html  css  js  c++  java
  • 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/");
    //。。。关闭连接
    

    以上为一些基础命令的用法,通过结合一些常用的运维命令即可实现一个运维系统的功能。

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/umgsai/p/7846177.html
Copyright © 2011-2022 走看看