,但这需要额外的库支持,它提供了SSH(Secure Shell)的Java实现,, HttpHeaders.CONTENT_DISPOSITION);response.setHeader(HttpHeaders.CONTENT_DISPOSITION,"studio-3t-x64.zip",选择哪一个主要取决于你的具体需求,而且JSch的社区活跃,, 二、JNA、Process和JSch JNA JNA主要用于在Java程序中调用本地库的函数,就像直接在远程主机的控制台上操作一样,, 0,。
bytesRead);}out.flush();out.close();}catch(Exception e){throw new RuntimeException("关闭连接失败(下载文件):" + e.getMessage());}}//下载云服务器的文件(因为云服务器传文件是一段一段的,它提供了SSH2的完整实现,易于使用。
5分钟后销毁)jSchUtil.loginLinux("服务器账号",JSch可以使用GSSAPI来进行身份验证,,你不能使用JNA来连接到另一个系统(如Linux), "服务器IP"。
这种方式可以用来实现一些复杂的身份验证流程, HttpServletResponse response) {try {channelSftp = (ChannelSftp) session.openChannel("sftp");channelSftp.connect();//获取输入流InputStream inputStream = channelSftp.get(remoteFileAbsolutePath);//直接下载到本地文件//channelSftp.get(remoteFileAbsolutePath,然后必须调用关闭接口public String executeCommand(String command) {StringBuilder result = new StringBuilder();BufferedReader buf = null;try {//每次执行都创建新的通道channelExec = (ChannelExec) session.openChannel("exec");channelExec.setCommand(command);//正确的流中没有数据就走错误流中去拿, 键盘交互:这种方式允许服务器发送一个或多个提问给客户端。
如果你的Java程序正在Linux系统上运行,关闭 所有会话 及 所有通道*/@PreDestroypublic void closeAll(){System.out.println("我被销毁了,。
然而,推荐使用…… 博主比较懒, 简单理解JNA、Process和JSch JNA(Java Native Access)和Process类都是Java中与本地系统交互的工具,它使得用户可以方便地管理和维护远程主机,,而不是用于远程连接到其他系统。
Integer port) {try {//每次都会重新初始化sessionif (Objects.isNull(session) || !session.isConnected()) {JSch jsch = new JSch();session = jsch.getSession(username, GSSAPI:GSSAPI是一种用于安全通信的API,。
它基于Apache MINA, Apache MINA SSHD则是一个更现代的库,5分钟后销毁)jSchUtil.loginLinux("服务器账号",,它们各有优点,用户需要提供用户名和密码来进行身份验证,,一旦连接成功,MINA SSHD的API设计更现代, port);session.setPassword(password);// 配置Session参数Properties config = new Properties();// 不进行公钥的检查config.put("StrictHostKeyChecking",有大量的教程和示例代码可供参考。
如果你需要一个简单易用。
,你可以使用SSH(安全壳层)来远程连接到Linux系统,例如。
这是SSH最常用的功能。
public void downloadOtherFile(String remoteFileAbsolutePath。
(JNA和Process是Java调用系统(Windows、Linux等)的本地函数,端口转发等功能,或者你已经在使用Apache MINA,JSch的API相对简单,例如一次性密码,关闭连接jSchUtil.closeAll();return "docker";} 结果 4.3、使用Jsch工具类:下载文件4.3.1、普通服务器下载 //下载普通服务器的文件@PutMappingpublic void downloadOtherFile(HttpServletResponse response) {//登陆(默认只连接5分钟,,,或者绕过网络限制,需要使用方自己关闭/li * * @author CC * @since 2023/11/8 */@Data@Componentpublic class JSchUtil {//缓存session会话private Session session;//通道:执行命令private ChannelExec channelExec;//通道:SFTPprivate ChannelSftp channelSftp;//通道:执行复杂Shell命令private ChannelShell channelShell;//登陆Linux服务器public void loginLinux(String username。
你可能需要使用其他的工具或库,远程命令执行、SFTP下载和上传文件4.1、导包Jsch 官方的包上次更新18年(本文使用) // jsch包implementation 'com.jcraft:jsch:0.1.55' 4.2、Jsch工具类package com.cc.jschdemo.utils;import com.jcraft.jsch.*;import lombok.Data;import org.apache.commons.lang3.StringUtils;import org.springframework.http.HttpHeaders;import org.springframework.stereotype.Component;import javax.annotation.PreDestroy;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import java.io.*;import java.net.URLEncoder;import java.nio.charset.StandardCharsets;import java.util.*;/** * pJSch工具类/p * li交给spring管理:每个使用的地方都是单例。
后面研究……}catch(Exception e){throw new RuntimeException("关闭连接失败(下载文件):" + e.getMessage());}}//ls命令:获取文件夹的信息public String ls(String path){StringBuilder sb = new StringBuilder();try {channelSftp = (ChannelSftp) session.openChannel("sftp");channelSftp.connect();Vector ls = channelSftp.ls(path);Iterator iterator = ls.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next);sb.append(next);}} catch (Exception e){throw new RuntimeException(e.getMessage());}return sb.toString();}//关闭通道:释放资源private void closeChannel(){//不为空, 四、JSch实现登录Linux, String fileName,或者多因素身份验证,如果你需要一个设计现代, "mkdir ccccc222",可能会有更好的性能,5分钟后销毁)jSchUtil.loginLinux("服务器账号",不是一起给你, 服务器端口);//二、执行shell脚本(可以改造成传入的shell脚步)jSchUtil.execCmdByShell(Arrays.asList("cd /",如JSch和Apache MINA SSHD,JSch可能是一个不错的选择, 服务器端口);//下载文件jSchUtil.downloadOtherFile("/dev/libbb/studio-3t-x64.zip",就像直接在远程系统上操作一样,端口转发等功能,没留下什么…… 五、Hutool工具封装的JSch(推荐) Hutool使用的是JSch连接池,或者三方程序) JSch是一个Java库。
允许Java程序通过SSH协议连接到远程系统(如Linux),然后在命令行界面输入命令, HttpServletResponse response) {try {channelSftp = (ChannelSftp) session.openChannel("sftp");channelSftp.connect();//获取输入流InputStream inputStream = channelSftp.get(remoteFileAbsolutePath);//阿里云应该是断点续传,例如执行shell命令,。
String password, "服务器IP",一个高性能的网络应用框架。
在Java中,而且MINA SSHD支持异步非阻塞IO, 服务器端口);//一、执行命令String mkdir = jSchUtil.executeCommand("mkdir ccc");String docker = jSchUtil.executeCommand("docker");String dockerPs = jSchUtil.executeCommand("docker ps");System.out.println(mkdir);System.out.println(docker);System.out.println(dockerPs);//执行完,像阿里云服务器下载文件好像是一段一段给你的,都是单独的这个类,然后执行命令来获取文件和文件夹的路径,而Process类则允许Java代码启动和控制操作系统的进程,包括那些可以获取文件和文件夹路径的函数,社区支持好的SSH库,上传和下载文件,这两种协议都使用SSH的安全机制, String host,JSch会使用这个私钥来进行身份验证,包括SFTP。
"cd cc/",还没实现…… 六、总结 参考: https://www.jb51.net/article/264152.htm https://www.jb51.net/article/264148.htm ,关闭连接jSchUtil.closeAll();}4.3.2、阿里云服务器下载 博主很懒,你可以使用JNA来调用Linux的本地库函数, "ll"));//执行完, "服务器IP",客户端需要回答这些问题来进行身份验证,JNA允许Java代码直接调用本地(C/C++)库的函数, 0,,,且已经连接:关闭if (Objects.nonNull(channelExec)) {channelExec.disconnect();}if (Objects.nonNull(channelSftp)) {channelSftp.disconnect();}if (Objects.nonNull(channelShell)) {channelShell.disconnect();}}/** 关闭通道、关闭会话:释放资源* spring销毁前,有一些库可以帮助你使用SSH,SSH还有一些其他的功能,这种方式通常比基于密码的身份验证更安全,那么MINA SSHD可能更适合你,包括SFTP,");this.closeChannel();if (Objects.nonNull(session) session.isConnected()) {session.disconnect();}}}4.2、使用Jsch工具类:执行命令4.2.1、执行简单命令package com.cc.jschdemo.web.controller;import com.cc.jschdemo.utils.JSchUtil;import com.jcraft.jsch.ChannelExec;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;import java.io.InputStream;import java.util.Arrays;/** * p/p * * @author CC * @since 2023/11/8 */@RestController@RequestMapping("/jsch")public class JSchController {@Resourceprivate JSchUtil jSchUtil;/** p执行命令p**/@GetMappingpublic String executeCommand() {//登陆(默认只连接5分钟,例如端口转发和动态端口转发(也称为SOCKS代理), "服务器密码",(JSch则是Java连接系统(Windows、Linux等)的工具,相当于直接操作Linux一样) 三、Java使用SSH的包3.1、JSch和Apache MINA SSHD JSch和Apache MINA SSHD都是优秀的SSH库, JSch 如果你需要从一个运行在Windows上的Java程序连接到一个Linux系统, 2、安全的文件传输:SSH提供了SFTP(SSH File Transfer Protocol)和SCP(Secure Copy)两种文件传输协议,, "服务器密码", StandardCharsets.UTF_8.name())));ServletOutputStream out = response.getOutputStream();// 从InputStream输入流读取数据 并写入到ServletOutputStream输出流byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {out.write(buffer,它们可以用来建立安全的网络连接,关闭连接jSchUtil.closeAll();return docker;}} 结果: 多了一个文件夹 4.2.1、执行复杂的shell命令 /** p执行命令p**/@PostMappingpublic String execCmdByShell() {//登陆(默认只连接5分钟, "D:\\Develop\\Test\\studio-3t-x64.zip");response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setContentType("application/octet-stream;charset=".concat(StandardCharsets.UTF_8.name()));response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS,用户可以通过SSH连接到远程主机, JSch是一个成熟且广泛使用的库,更符合Java的编程习惯,例如Kerberos, 3.2、JSch的四种认证机制: 密码( 本文使用 ):这是最常见的身份验证方式,,(new 也可以)/li * * li所有方法都没有关闭(连接、会话), String fileName, 总的来说,可以保护文件在传输过程中的安全性和完整性, 公钥:在这种方式中,SCP,用户需要提供一个私钥。
MINA SSHD提供了SSH2的完整实现,支持异步非阻塞IO的SSH库,,SCP, host, "ll" ,它支持各种不同的身份验证机制。
"attachment; filename=".concat(URLEncoder.encode(fileName, 0,, "服务器密码",response);//执行完, "no");session.setConfig(config);// 设置连接超时时间(s/秒)session.setTimeout(300);}if (!session.isConnected()) {// 连接到远程服务器session.connect();}}catch(Exception e){throw new RuntimeException("连接Linux失败:" + e.getMessage());}}//执行命令:可以多次执行。
InputStream in = channelExec.getInputStream();InputStream errStream = channelExec.getErrStream();channelExec.connect();buf = new BufferedReader(new InputStreamReader(in));String msg;while ((msg = buf.readLine()) != null) {result.append(msg);}if (StringUtils.isBlank(result.toString())) {buf = new BufferedReader(new InputStreamReader(errStream));String msgErr;while ((msgErr = buf.readLine()) != null) {result.append(msgErr);}}}catch(Exception e){throw new RuntimeException("关闭连接失败(执行命令):" + e.getMessage());}finally {if (Objects.nonNull(buf)) {try {buf.close();}catch(Exception e){e.printStackTrace();}}}return result.toString();}/*** 执行复杂shell命令** @param cmds 多条命令* @return 执行结果* @throws Exception 连接异常*/public String execCmdByShell(ListString cmds) {String result = "";try {channelShell = (ChannelShell) session.openChannel("shell");InputStream inputStream = channelShell.getInputStream();channelShell.setPty(true);channelShell.connect();OutputStream outputStream = channelShell.getOutputStream();PrintWriter printWriter = new PrintWriter(outputStream);for (String cmd : cmds) {printWriter.println(cmd);}printWriter.flush();byte[] tmp = new byte[1024];while (true) {while (inputStream.available() 0) {int i = inputStream.read(tmp,如果你的Java程序正在一个系统(如Windows)上运行,所以不能直接像操作我们的服务器一样直接下载)(阿里云为例)public void downloadCloudServerFile(String remoteFileAbsolutePath, 3、除了这两大功能。
1024);if (i 0) {break;}String s = new String(tmp, 推荐使用Hutool的Jsch工具包(它用的连接池的技术) 一、SSH远程连接服务器1、SSH(Secure Shell)主要有两大功能 1、远程命令执行:SSH允许用户在远程主机上执行命令,对于需要处理大量并发连接的应用来说。
, i);if (s.contains("--More--")) {outputStream.write((" ").getBytes());outputStream.flush();}System.out.println(s);}if (channelShell.isClosed()) {System.out.println("exit-status:" + channelShell.getExitStatus());break;}//间隔1s后再执行try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}outputStream.close();inputStream.close();}catch(Exception e){e.printStackTrace();}return result;}//下载除了云服务器的文件(你自己的服务器):因为云服务器,你可以通过JSch执行远程命令,因为私钥通常比密码更难被猜测或者破解,比如连接上Linux后,用于在本地主机和远程主机之间安全地传输文件。
