Ganymed SSH-2 for Java是用纯Java实现SSH-2协议的一个包。能够利用它直接在Java程序中链接SSH服务器。官网地址为 http://www.ganymed.ethz.ch/ssh2/ 能够看到最后的更新日志为2006年,是比较古老的一个工具了。下面看看这个工具能够作什么。html
测试时在本机上装了一个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机器。服务器
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/"); //。。。关闭链接
以上为一些基础命令的用法,经过结合一些经常使用的运维命令便可实现一个运维系统的功能。