使用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命令相关推荐

  1. 使用 Apache sshd scp 上传或下载文件

    添加依赖 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core< ...

  2. windows主机用scp命令向Linux服务器上传和下载文件

    windows主机用scp命令向Linux服务器上传和下载文件 文章目录: 一.scp介绍 二.scp上传和下载 1.上传 2.下载 三.scp的更多参数 一.scp介绍 scp是secure cop ...

  3. Linux中使用SCP命令进行上传或者下载文件

    本文目录 1.本地主机与远程主机之间进行文件传输 1.1.单个文件的上传与下载 1.2.多个文件的上传与下载 1.3.按目录进行上传与下载 2.远程主机与远程主机之间进行文件传输 SCP(Secure ...

  4. 从服务器上传和下载文件方法

    1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...

  5. MacOS利用终端与Linux服务器上传与下载文件

    mac用terminnal.app 上传与下载文件及文件夹到Linux上 方式一: 终端--新建远程连接--安全Shell--右下方 + 输入IP和用户名 如果提示:Permission denied ...

  6. 在windows和linux上传或下载文件

    一.使用xshell在windows和linux上传或下载文件 有个很简单的方法就是rz,sz 1.工具安装: 需要安装工具:yum install lrzsz 使用工具:安装的rz,sz就是Linu ...

  7. Python实现向s3共享存储上传和下载文件

    Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...

  8. 利用SecureCRT上传、下载文件(使用sz与rz命令)

    利用SecureCRT上传.下载文件(使用sz与rz命令) 借助securtCRT,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 其中,对于s ...

  9. Linux--用SecureCRT来上传和下载文件

    转载自  Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem ASCII:这是最快的传输协议,但只能 ...

最新文章

  1. smack连接openfire
  2. 洛谷 P2749 [USACO5.1]【夜空繁星Starry Night】
  3. 不同地图坐标系的坐标转换
  4. python动态改变标签的颜色_PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
  5. 怎么测试ajax get请求,为什么我的AJAX在运行测试时请求dev中的PUT请求,但请求了GET请求?...
  6. ASP.NET Core 中的那些认证中间件及一些重要知识点
  7. Eclipse中集成SVN
  8. OpenJudge计算概论-字符串最大跨距
  9. 外贸软件常见图片类问题丨汇信
  10. 来聊聊我的阿里云P7面试经历
  11. 电脑管家软件搬家没有历史记录
  12. java pfx_如何在Java中读取.pfx文件的内容?
  13. 抽奖助手——端午老板加班让我写个抽奖助手给员工发福利
  14. qcow2快照合并或删除
  15. web前端开发人员要求,css设置背景图片自适应
  16. 记录锁、间隙锁和临键锁
  17. php 简转繁体,PHP将简体汉字转为繁体的方法
  18. Qt编写带频谱的音乐播放器
  19. iCloud Drive,简单实用的苹果原生云存储
  20. simulink中detailed thyristor和thyristor的区别(针对latching current和turn-off time的对比仿真)

热门文章

  1. 星型模型和olap多维数据库
  2. 一把通过CISA考试!老司机带你上车
  3. 更改文件类型方法(文本文档改为lic文件)
  4. 阿里架构师学习笔记,一文掌握JavaScript基础
  5. linux访问共享命令,Linux访问共享资源命令 smbclient
  6. Python+selenium验证部分文本框内容相符即断言成功
  7. 简单的数字变化:0-9循环
  8. Python金融系列第八篇:Fama-French 多因子模型
  9. 7-2 实验二 银行利息结算
  10. 1.6 受控电源(非独立源)