• 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/");
    //。。。关闭连接
    

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

  • 相关阅读:
    iis出现2145318902错误
    div在父容器中水平垂直居中
    SSRS中错误:为用户“NT AUTHORITY\NETWORK SERVICE”授予的权限不足,无法执行此操作。 (rsAccessDenied)解决方案
    数字签名
    SQL无法连接问题
    DataTable导出到excel中,及乱码问题
    Could not load file or assembly 'Microsoft.ReportViewer.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its depe
    Windows 7无法启动“bootmgr is compressed”解决办法
    U盘安装xp
    IIS7下浏览网站出现503,应用程序池无法启动.事件查看器中出现"Windows 找不到本地配置文件,正在用临时配置文件让您登录。当您注销时,对此配置文件所作的更改将丢失。"
  • 原文地址:https://www.cnblogs.com/umgsai/p/7846177.html
Copyright © 2020-2023  润新知