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。
1.更新下系统工具和依赖

sudo apt-get update;

2.执行安装命令

sudo apt-get install openssh-server openssh-client

安装完成之后可以通过 sudo ps -e |grep ssh 查看ssh是否在运行。如果结果存在sshd则表示ssh服务已经在运行。可以通过 sudo service ssh start 来启动ssh服务。

配置好ssh服务之后即可通过本地机器的终端ssh连接到linux机器。
A: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
20171116日 星期四 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

B:从服务器删除文件

在服务器的用户目录下执行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)

C:从服务器删除文件夹

//。。。建立连接
SFTPv3Client sftpClient = new SFTPv3Client(conn);
sftpClient.rmdir("/home/sss/test/");//删除文件夹  Remove an empty directory
sftpClient.close();
//。。。关闭连接

注意,以上删除文件夹的方法只能删除空文件夹。如果要删除非空文件夹则需要采用其他方法。

D:从服务器删除非空文件夹

使用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

E:从服务器下载文件/上传文件到服务器

//下载	
//。。。建立连接
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/");
//。。。关闭连接

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值