java ganymed ssh2_Ganymed SSH-2 for Java学习笔记

曾翰飞
2023-12-01

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

//。。。关闭连接

从服务器下载文件

//。。。建立连接

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/");

//。。。关闭连接

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

 类似资料: