Ganymed-ssh2实现scp上传和下载文件,以及执行shell命令
使用Ganymed-ssh2执行远程机器上的Shell脚本,还可以使用SCP来上传和下载文件
严禁转载!!!
pom依赖
<dependency><groupId>com.airlenet.yang</groupId><artifactId>ganymed-ssh2</artifactId><version>1.2.0</version></dependency>
工具服务
yml配置
scp:ip: 192.168.1.22port: 22userName: rootpassword: 123456
工具类
import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Nonnull;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Objects;/*** @descriptions: shell命令和scp文件传输* @author: xucl*/
@Slf4j
@Component
public class ScpHelper {@Value("${scp.ip}")private String scpIp;@Value("${scp.port:22}")private Integer scpPort;@Value("${scp.userName:root}")private String userName;@Value("${scp.password}")private String password;private Connection connection;/*** 初始化*/public synchronized void initConnection(){if (Objects.isNull(connection)){try {connection = new Connection(scpIp, scpPort);connection.connect(null,3000,5000);} catch (Exception e) {log.error("SCP-初始化SCP连接失败,请配置后再使用该工具!");throw new RuntimeException("SCP-初始化SCP连接失败,请配置后再使用该工具!",e);}boolean b = authenticate(userName, password);if (!b){try {throw new RuntimeException("SCP-认证失败,无法执行相关命令!");} finally {connection.close();}}}}/*** ssh用户登录验证,使用用户名和密码来认证** @param userName* @param password* @return*/public boolean authenticate(String userName, String password) {try {return connection.authenticateWithPassword(userName, password);} catch (IOException e) {log.error("SCP-认证异常",e);}return false;}private void before(){initConnection();}/*** 执行简单的Shell命令* @param cmd*/public void execSimpleCmd(String cmd) {before();Session session = null;try {session = connection.openSession();session.execCommand(cmd);} catch (Exception e) {log.error("SCP-执行shell命令失败",e);} finally {if (Objects.nonNull(session)){session.close();}}}/*** 执行复杂的Shell命令* @param cmd*/public void execCmd(String cmd){before();Session session = null;try {session = connection.openSession();// 建立虚拟终端session.requestPTY("bash");// 打开一个Shellsession.startShell();// 准备输入命令PrintWriter out = new PrintWriter(session.getStdin());// 输入待执行命令out.println(cmd);out.println("exit");// 关闭输入流out.close();// 等待,除非1.连接关闭;2.输出数据传送完毕;3.进程状态为退出;4.超时session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS , 30000);} catch (Exception e) {log.error("SCP-执行shell命令失败",e);} finally {if (Objects.nonNull(session)){session.close();}}}/*** 下载到本地硬盘** @param remoteFile 远程文件绝对路径 如:/home/users/error.txt* @param localPath 下载本地目录 如:C://Downloads//*/public void getFile(String remoteFile, String localPath) {try {before();SCPClient scpClient = connection.createSCPClient();scpClient.get(remoteFile, localPath);} catch (Exception e) {log.error("SCP-下载到本地文件失败",e);} finally {connection.close();}}/*** 下载到字节流** @param remoteFile 远程文件绝对路径 如:/home/users/error.txt*/public ByteArrayOutputStream getFile(String remoteFile) {try {before();SCPClient scpClient = connection.createSCPClient();ByteArrayOutputStream outputStream = new ByteArrayOutputStream();scpClient.get(remoteFile, outputStream);return outputStream;} catch (Exception e) {log.error("SCP-下载到字节流失败",e);} finally {connection.close();}return null;}/*** 本地硬盘文件上传** @param localFile 本地硬盘文件目录* @param remoteTargetDirectory 上传的目录*/public void putFile(String localFile,String remoteTargetDirectory) throws RuntimeException {try {before();execCmd("mkdir -p " + remoteTargetDirectory);SCPClient scpClient = connection.createSCPClient();scpClient.put(localFile, remoteTargetDirectory);} catch (Exception e){log.error("SCP-上传本地文件失败",e);throw new RuntimeException(e);} finally {connection.close();}}/*** form表单文件上传** @param multipartFile 表单文件* @param remoteTargetDirectory 上传的目录*/public void putFile(@Nonnull MultipartFile multipartFile,String newFileName ,@Nonnull String remoteTargetDirectory) throws RuntimeException{try {before();execCmd("mkdir -p " + remoteTargetDirectory);SCPClient scpClient = connection.createSCPClient();InputStream inputStream = multipartFile.getInputStream();newFileName = StringUtils.isBlank(newFileName) ? multipartFile.getOriginalFilename() : newFileName;scpClient.put(IOUtils.toByteArray(inputStream), newFileName, remoteTargetDirectory);} catch (Exception e){log.error("SCP-上传本地文件失败",e);throw new RuntimeException(e);} finally {connection.close();}}/*** 输入流上传** @param inputStream 输入流* @param remoteFileName 远程文件名称* @param remoteTargetDirectory 上传的目录*/public void putFile(@Nonnull InputStream inputStream,@Nonnull String remoteFileName,@Nonnull String remoteTargetDirectory) throws RuntimeException{try {before();execCmd("mkdir -p " + remoteTargetDirectory);SCPClient scpClient = connection.createSCPClient();scpClient.put(IOUtils.toByteArray(inputStream), remoteFileName, remoteTargetDirectory);} catch (Exception e){log.error("SCP-上传本地文件失败",e);throw new RuntimeException(e);} finally {connection.close();}}
}
测试
@Slf4j
@SpringBootTest
public class ScpTests {@Autowiredprivate ScpHelper scpHelper;@Testpublic void testUpload() throws IOException {ByteArrayInputStream bais = getTextBAIS("你好,scp!6666");scpHelper.putFile(bais,"266.txt","/opt/test/2021/");}public static ByteArrayInputStream getTextBAIS(String txtStr){try {byte[] bytes = txtStr.getBytes("UTF-8");ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);return inputStream;} catch (UnsupportedEncodingException e) {return null;}}
}
效果:
文件打开显示:
你好,scp!6666
参考:
java 远程执行Shell命令-通过ganymed-ssh2连接
通过java程序实现scp上传和下载文件
Ganymed-ssh2实现scp上传和下载文件,以及执行shell命令相关推荐
- 使用 Apache sshd scp 上传或下载文件
添加依赖 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core< ...
- windows主机用scp命令向Linux服务器上传和下载文件
windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...
- Linux中使用SCP命令进行上传或者下载文件
本文目录 1.本地主机与远程主机之间进行文件传输 1.1.单个文件的上传与下载 1.2.多个文件的上传与下载 1.3.按目录进行上传与下载 2.远程主机与远程主机之间进行文件传输 SCP(Secure ...
- 从服务器上传和下载文件方法
1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...
- MacOS利用终端与Linux服务器上传与下载文件
mac用terminnal.app 上传与下载文件及文件夹到Linux上 方式一: 终端--新建远程连接--安全Shell--右下方 + 输入IP和用户名 如果提示:Permission denied ...
- 在windows和linux上传或下载文件
一.使用xshell在windows和linux上传或下载文件 有个很简单的方法就是rz,sz 1.工具安装: 需要安装工具:yum install lrzsz 使用工具:安装的rz,sz就是Linu ...
- Python实现向s3共享存储上传和下载文件
Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...
- 利用SecureCRT上传、下载文件(使用sz与rz命令)
利用SecureCRT上传.下载文件(使用sz与rz命令) 借助securtCRT,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 其中,对于s ...
- Linux--用SecureCRT来上传和下载文件
转载自 Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem ASCII:这是最快的传输协议,但只能 ...
最新文章
- smack连接openfire
- 洛谷 P2749 [USACO5.1]【夜空繁星Starry Night】
- 不同地图坐标系的坐标转换
- python动态改变标签的颜色_PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
- 怎么测试ajax get请求,为什么我的AJAX在运行测试时请求dev中的PUT请求,但请求了GET请求?...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
- Eclipse中集成SVN
- OpenJudge计算概论-字符串最大跨距
- 外贸软件常见图片类问题丨汇信
- 来聊聊我的阿里云P7面试经历
- 电脑管家软件搬家没有历史记录
- java pfx_如何在Java中读取.pfx文件的内容?
- 抽奖助手——端午老板加班让我写个抽奖助手给员工发福利
- qcow2快照合并或删除
- web前端开发人员要求,css设置背景图片自适应
- 记录锁、间隙锁和临键锁
- php 简转繁体,PHP将简体汉字转为繁体的方法
- Qt编写带频谱的音乐播放器
- iCloud Drive,简单实用的苹果原生云存储
- simulink中detailed thyristor和thyristor的区别(针对latching current和turn-off time的对比仿真)