java代码如何连接Linux虚拟机,还有文件上传下载,等基础命令
上一篇,基于Hutool包对数据库的增删改查操作
这里基于Hutool包下封装的工具类,对Linux连接,还有基本命令操作演示
一、工具包代码示例
此处是源代码的一部分,,完整代码在Github上
/**
* Jsch工具类<br>
* Jsch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。<br>
* 它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等。<br>
*/
public class JschUtil {
/** 不使用SSH的值 */
public final static String SSH_NONE = "none";
/** 本地端口生成器 */
private static final LocalPortGenerater portGenerater = new LocalPortGenerater(10000);
/**
* 生成一个本地端口,用于远程端口映射
* @return 未被使用的本地端口
*/
public static int generateLocalPort() {
return portGenerater.generate();
}
/**
* 获得一个SSH会话,重用已经使用的会话
* @param sshHost 主机
* @param sshPort 端口
* @param sshUser 用户名
* @param sshPass 密码
* @return SSH会话
*/
public static Session getSession(String sshHost, int sshPort, String sshUser, String sshPass) {
return JschSessionPool.INSTANCE.getSession(sshHost, sshPort, sshUser, sshPass);
}
/**
* 打开一个新的SSH会话
*
* @param sshHost 主机
* @param sshPort 端口
* @param sshUser 用户名
* @param sshPass 密码
* @return SSH会话
*/
public static Session openSession(String sshHost, int sshPort, String sshUser, String sshPass) {
final Session session = createSession(sshHost, sshPort, sshUser, sshPass);
try {
session.connect();
} catch (JSchException e) {
throw new JschRuntimeException(e);
}
return session;
}
/**
* 新建一个新的SSH会话
*
* @param sshHost 主机
* @param sshPort 端口
* @param sshUser 机用户名
* @param sshPass 密码
* @return SSH会话
* @since 4.5.2
*/
public static Session createSession(String sshHost, int sshPort, String sshUser, String sshPass) {
if (StrUtil.isEmpty(sshHost) || sshPort < 0 || StrUtil.isEmpty(sshUser) || StrUtil.isEmpty(sshPass)) {
return null;
}
Session session;
try {
session = new JSch().getSession(sshUser, sshHost, sshPort);
session.setPassword(sshPass);
// 设置第一次登陆的时候提示,可选值:(ask | yes | no)
session.setConfig("StrictHostKeyChecking", "no");
} catch (JSchException e) {
throw new JschRuntimeException(e);
}
return session;
}
}
二、Java测试连接,操作代码
2.1 建立连接
public class JschUtilTest {
@Test
@Ignore
public void bindPortTest() {
//新建会话,此会话用于ssh连接到跳板机(堡垒机),此处为xx.xx.xx.xx(IP)
Session session = JschUtil.getSession("xx.xx.xx.xx", 22, "xxx", "xxx"); // 这里的IP,端口,用户名和密码需要自己指定
System.out.println(session.getUserName());
System.out.println(session.getPort());
}
}
运行测试,就会在控制台打印用户名和端口信息,说明已经成功建立连接了
2.1 ls 查看目录操作
代码示例
@Test
@Ignore
public void sftpTest() {
Session session = JschUtil.getSession("xxxx.xx.xx.xx", 22, "username", "password");
Sftp sftp = JschUtil.createSftp(session);
List<String> ls = sftp.ls("/opt");
ls.forEach(System.out::println);
}
结果比较
2.2 删除命令
@Test
@Ignore
public void sftpTest2() {
Session session = JschUtil.getSession("xxxx.xx.xx.xx", 22, "username", "password");
Sftp sftp = JschUtil.createSftp(session);
boolean b = sftp.delDir("/opt/test/test");
System.out.println(b);
}
2.3 新建文件夹
@Test
@Ignore
public void sftpTest3() {
Session session = JschUtil.getSession("xxxx.xx.xx.xx", 22, "username", "password");
Sftp sftp = JschUtil.createSftp(session);
boolean b = sftp.mkdir("/opt/test/test2");
System.out.println(b);
}
2.4 文件上传( Windows --> Linux )
@Test
@Ignore
public void sftpTest4() {
Session session = JschUtil.getSession("xxxx.xx.xx.xx", 22, "username", "password");
Sftp sftp = JschUtil.createSftp(session);
Sftp put = sftp.put("D:\\tmp\\a.txt", "/opt/test/as.txt");
}
2.4 文件下载
@Test
@Ignore
public void sftpTest5() {
Session session = JschUtil.getSession("xxxx.xx.xx.xx", 22, "username", "password");
Sftp sftp = JschUtil.createSftp(session);
sftp.download("/opt/test/as.txt", FileUtil.file("D:\\tmp\\b.txt"));
}