JCraft是一个Java实现的SSH、SFTP、SCP等协议的库,它提供了多个工具类,用于在Java应用程序中实现与远程服务器的安全通信和文件传输。这些工具类包括:
JSch: 这是JCraft库的核心部分,用于建立SSH连接。它允许用户通过SSH协议连接到远程主机,进行远程命令执行、文件传输等操作。
Channel: JCraft提供了不同类型的通道,如Shell、Exec、SFTP等,用于在SSH连接上执行不同类型的操作。比如,Shell通道允许用户执行远程命令,而SFTP通道允许进行安全的文件传输。
Session: 这个类用于创建和管理SSH会话。它是与远程主机建立连接的入口点,提供了对连接参数的设置和控制。
UserInfo: 用于处理用户身份验证信息的接口。可以通过实现这个接口来提供自定义的用户身份验证逻辑。
JSchException: 用于处理JCraft库中可能出现的异常情况。
这些工具类使开发者能够使用Java语言轻松地实现SSH、SFTP等协议的功能,建立安全的远程连接并执行各种操作,如执行远程命令、传输文件等。
<dependency>
<groupId>com.jcraftgroupId>
<artifactId>jschartifactId>
<version>0.1.51version>
dependency>
代码流程
/**
* ClassName:JschUtil
*
* @author: Lee
* Description:
* @date:2020/11/17 20:45
*/
import com.jcraft.jsch.*;
import java.io.*;
import java.nio.charset.Charset;
public class JschUtil {
private int SSH_PORT;
private String username;
private String password;
private String hostip;
private String charset = "UTF-8";
private Session session;
public JschUtil(String user, String password, String hostip, int port) {
this.username = user;
this.password = password;
this.hostip = hostip;
this.SSH_PORT = port;
}
/**
* 连接到远程机器
*
* @throws JSchException
*/
public void Connection() throws JSchException {
JSch js = new JSch();
session = js.getSession(username, hostip, SSH_PORT);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
}
/**
* 关闭远程连接
*/
public void disconnection() {
if (session != null && session.isConnected()) {
session.disconnect();
}
}
/**
* 执行ssh命令
*
* @param command
* @throws JSchException
* @throws IOException
*/
public void executeCmd(String command) throws JSchException, IOException {
BufferedReader reader = null;
Channel channel = null;
System.out.println("**********************************");
System.out.println("InputCommand:" + "【" + command + "】");
System.out.println("**********************************");
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
channel.connect();
InputStream in = channel.getInputStream();
reader = new BufferedReader(new InputStreamReader(in,
Charset.forName(charset)));
String buf = null;
System.out.println("OutPutResult:" + "\n");
StringBuffer buffer = new StringBuffer();
while ((buf = reader.readLine()) != null) {
System.out.println(buf);
buffer.append(buf);
buffer.append("\n");
}
System.out.println("**********************************");
System.out.println("ReturnResult:" + "\n" + buffer.toString());
channel.disconnect();
}
public static void main(String[] args) {
String cmd = "ls -l /";
JschUtil js = new JschUtil("root", "123456", "192.168.0.99", 22);
try {
js.Connection();
try {
js.executeCmd(cmd);
} catch (Exception e) {
Thread.sleep(1000 * 60 * 10);
System.out.println("命令执行错误" + e.toString());
} finally {
js.disconnection();
}
} catch (JSchException e) {
// 处理连接异常
System.out.println(e.toString());
} catch (InterruptedException ex) {
// 处理线程中断异常
ex.printStackTrace();
}
}
}
代码流程
import com.jcraft.jsch.*;
import java.io.*;
import java.util.Properties;
/**
* sftp工具类
* 下载文件
* 上传文件
* 删除文件
*/
public class SftpUtil {
/**
* 创建一个sftp Session
*
* @param host 服务器ip
* @param port 端口
* @param username 用户名
* @param password 密码
* @return 返回ChannelSftp
* @throws Exception 获取通道时的异常
*/
public static ChannelSftp getSftpChannel(String host, Integer port, String username, String password) throws Exception {
Session session;
Channel channel = null;
JSch jSch = new JSch();
try {
session = jSch.getSession(username, host, port);
session.setPassword(password);
// 配置链接的属性
Properties properties = new Properties();
properties.setProperty("StrictHostKeyChecking", "no");
session.setConfig(properties);
// 打开会话连接
session.connect();
// 获取ftp通道
channel = session.openChannel("sftp");
channel.connect();
} catch (JSchException e) {
e.printStackTrace();
throw e;
}
return (ChannelSftp) channel;
}
/**
* 上传文件
*
* @param channelSftp sftp通道
* @param localFile 本地文件
* @param remoteFile 远程文件
*/
public static void upload(ChannelSftp channelSftp, String localFile, String remoteFile) throws Exception {
try (InputStream inputStream = new FileInputStream(localFile)) {
channelSftp.put(inputStream, remoteFile);
} catch (FileNotFoundException e) {
throw new RuntimeException("上传文件时找不到本地文件: " + e.getMessage(), e);
} catch (SftpException e) {
throw new RuntimeException("上传文件出错: " + e.getMessage(), e);
}
}
/**
* 从sftp服务器上下载文件
*
* @param channelSftp sftp通道
* @param remoteFile 远程文件
* @param localFile 本地文件
*/
public static void download(ChannelSftp channelSftp, String remoteFile, String localFile) throws Exception {
try (OutputStream outputStream = new FileOutputStream(localFile)) {
channelSftp.get(remoteFile, outputStream);
} catch (FileNotFoundException e) {
throw new RuntimeException("下载文件时找不到本地文件: " + e.getMessage(), e);
} catch (SftpException e) {
throw new RuntimeException("下载文件出错: " + e.getMessage(), e);
}
}
/**
* 删除文件
*
* @param channelSftp sftp通道
* @param remoteFile 远程文件
*/
public static void deleteFile(ChannelSftp channelSftp, String remoteFile) throws Exception {
try {
channelSftp.rm(remoteFile);
} catch (SftpException e) {
throw new RuntimeException("删除文件出错: " + e.getMessage(), e);
}
}
/**
* 关闭sftp链接
*
* @param channelSftp sftp通道
* @throws Exception 关闭session的异常
*/
public static void closeSession(ChannelSftp channelSftp) throws Exception {
if (channelSftp == null) {
return;
}
Session session = null;
try {
session = channelSftp.getSession();
} catch (JSchException e) {
e.printStackTrace();
throw e;
} finally {
if (session != null) {
session.disconnect();
}
}
}
public static void main(String[] args) {
try {
// 获取sftp通道
ChannelSftp channelSftp = SftpUtil.getSftpChannel("192.168.0.99", 22, "root", "123456");
try {
// 上传文件
String local = "D:\\11.png";
String remote = "/11.png";
SftpUtil.upload(channelSftp, local, remote);
} catch (SftpException e) {
// 处理上传文件异常
System.out.println("上传文件出错:" + e.getMessage());
}
try {
// 下载文件
String remote2 = "/11.png";
String local2 = "D:\\tech\\11.png";
SftpUtil.download(channelSftp, remote2, local2);
} catch (SftpException e) {
// 处理下载文件异常
System.out.println("下载文件出错:" + e.getMessage());
}
try {
// 删除文件
String remote3 = "/11.png";
SftpUtil.deleteFile(channelSftp, remote3);
} catch (SftpException e) {
// 处理删除文件异常
System.out.println("删除文件出错:" + e.getMessage());
}
try {
// 关闭连接
SftpUtil.closeSession(channelSftp);
} catch (Exception e) {
// 处理关闭连接异常
System.out.println("关闭连接出错:" + e.getMessage());
}
} catch (JSchException e) {
// 处理获取SFTP通道异常
System.out.println("获取SFTP通道出错:" + e.getMessage());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}