特性:

  • 多线程批量执行
  • 多密码尝试

引入依赖:

        <dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>

示例代码:

package com.example.demo;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.SCPOutputStream;
import ch.ethz.ssh2.Session;
import org.apache.commons.io.IOUtils; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.concurrent.CountDownLatch; /**
* SshFile
*
* @author hackyo
* @date 2020/9/1
*/
public class SshFile { private static final String[] HOSTS = {
"10.72.30.207",
"10.72.30.208",
"10.72.30.209",
"10.72.30.211",
"10.72.30.212",
"10.72.30.213"
};
private static final String USERNAME = "root";
private static final String[] PASSWORDS = {"123", "456"};
private static final CountDownLatch LATCH = new CountDownLatch(HOSTS.length); public static void main(String[] args) {
System.out.println("程序运行");
System.out.println(); //传输文件
File localFile = new File("C:\\Users\\13712\\Desktop\\CentOS-Base.repo");
String remoteDir = "/root/";
for (String host : HOSTS) {
ScpThread scpThread = new ScpThread(host, localFile, remoteDir);
scpThread.start();
} //执行命令
String exec = "echo '成功'";
for (String host : HOSTS) {
ExecThread execThread = new ExecThread(host, exec);
execThread.start();
} try {
LATCH.await();
System.out.println("程序结束");
} catch (InterruptedException e) {
System.out.println("程序错误:" + e.getMessage());
}
} private static class ExecThread extends Thread {
private final String host;
private final String exec; private ExecThread(String host, String exec) {
this.host = host;
this.exec = exec;
} @Override
public void run() {
StringBuilder re = new StringBuilder("开始连接-" + host + ":");
Connection conn = new Connection(host);
try {
conn.connect();
boolean isAuthenticated = false;
for (String password : PASSWORDS) {
isAuthenticated = conn.authenticateWithPassword(USERNAME, password);
if (isAuthenticated) {
break;
}
}
if (isAuthenticated) {
Session session = conn.openSession();
session.execCommand(exec);
InputStream stdoutIn = session.getStdout();
re.append("执行输出:");
re.append(IOUtils.toString(stdoutIn));
re.append(";执行成功;");
stdoutIn.close();
session.close();
} else {
re.append("无法登录;");
}
} catch (Exception e) {
re.append("执行失败:").append(e.getMessage()).append(";");
}
conn.close();
System.out.println(re.toString());
System.out.println();
LATCH.countDown();
}
} private static class ScpThread extends Thread {
private final String host;
private final File localFile;
private final String remoteDir; private ScpThread(String host, File localFile, String remoteDir) {
this.host = host;
this.localFile = localFile;
this.remoteDir = remoteDir;
} @Override
public void run() {
StringBuilder re = new StringBuilder("开始连接-" + host + ":");
Connection conn = new Connection(host);
try {
conn.connect();
boolean isAuthenticated = false;
for (String password : PASSWORDS) {
isAuthenticated = conn.authenticateWithPassword(USERNAME, password);
if (isAuthenticated) {
break;
}
}
if (isAuthenticated) {
SCPClient scpClient = new SCPClient(conn);
SCPOutputStream out = scpClient.put(localFile.getName(), localFile.length(), remoteDir, null);
FileInputStream in = new FileInputStream(localFile);
IOUtils.copy(in, out);
in.close();
out.close();
re.append("传输成功;");
} else {
re.append("无法登录;");
}
} catch (Exception e) {
re.append("传输失败:").append(e.getMessage()).append(";");
}
conn.close();
System.out.println(re.toString());
System.out.println();
LATCH.countDown();
}
} }

Java执行Shell和传输文件的更多相关文章

  1. Java执行Shell脚本

    Linux 系统下采用 Java 执行 Shell 脚本,直接上代码: package com.smbea.demo; import java.io.BufferedReader; import ja ...

  2. java 执行shell命令及日志收集避坑指南

    有时候我们需要调用系统命令执行一些东西,可能是为了方便,也可能是没有办法必须要调用.涉及执行系统命令的东西,则就不能做跨平台了,这和java语言的初衷是相背的. 废话不多说,java如何执行shell ...

  3. Java执行shell脚本并返回结果两种方法的完整代码

    Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...

  4. 利用java执行shell脚本

    BPMN中存在由系统执行的脚本任务,shell脚本任务也是该系统任务脚本中的一种,利用的也是由java执行shell脚本. 代码中的ProcessBuilder类,为java.lang.Process ...

  5. Android Java执行Shell命令

    最新内容建议直接访问原文:http://www.trinea.cn/android/android-java-execute-shell-commands/ 主要介绍Android或Java应用中如何 ...

  6. Java执行shell遇到的各种问题

    1.判断子进程是否执行结束 有的时候我们用java调用shell之后,之后的操作要在Process子进程正常执行结束的情况下才可以继续,所以我们需要判断Process进程什么时候终止. Process ...

  7. Java 执行Shell脚本指令

    一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...

  8. java 执行shell命令遇到的坑

    正常来说java调用shell命令就是用 String[] cmdAry = new String[]{"/bin/bash","-c",cmd} Runtim ...

  9. java执行shell脚本并输出执行情况

    1.脚本test.sh,置于/Users/hdwang目录下 #!/bin/sh cd /Users/hdwang echo ls:`ls` ;i<=;i++)); do + ); sleep ...

  10. java执行Shell命令

    java程序中要执行linux命令主要依赖2个类:Process和Runtime首先看一下Process类:ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机 ...

随机推荐

  1. 如何在公司项目中使用 WebSocket— 入门实战指南

    本文从 WebSocket 基础概念出发,介绍在实际开发中从本地联调到部署上线的流程以及注意事项,让 WebSocket 小白以最小成本应用到项目中. 一.WebSocket 基础 1.什么是 Web ...

  2. vue-cli3title标签中的htmlWebpackPlugin.options.title

    https://blog.csdn.net/weixin_56650035/article/details/119355625

  3. vue中class样式与内联样式

    (1):style使用 <div class="score" :style="{ color: colorComputed(item.status) }" ...

  4. influxdb 端点使用http进行sql查询,写数据

    转载请注明出处: InfluxDB有以下几个常用的端点,它们的作用和传参方式如下: 1./ping 端点: 作用:用于检查InfluxDB实例的状态,返回InfluxDB的构建类型和版本信息. 传参: ...

  5. spring启动流程 (1) 流程概览

    本文将通过阅读AnnotationConfigApplicationContext源码,分析Spring启动流程. 创建AnnotationConfigApplicationContext Annot ...

  6. CDC设计实例-01

    CDC设计实例 Clock Gating Cell & Glitch Free Clock Switch(门控单元和动态切换时钟) 一个电路有多个时钟输入进来,希望在工作当中能够动态切换时钟; ...

  7. java - Array 数组反序输出

    通过Array类的静态 sort() 方法可实现对数组排序,sort() 方法提供了许多种重载形式,可对任意类型数组进行升序排序. 然而,Array类中没有类似 js 的 reverse   反序输出 ...

  8. Linux-远程连接-ssh

  9. 【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架

    前阵子,MySQL官网已经将 MySQL 8.0.29版本下架.据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug.而最新版本 8.0.30及以上的版本已修复此漏洞.各 ...

  10. [转帖]VMware ESXi 各版本号对照表

    本博文转自以下链接: VMware ESXi Release and Build Number History | virten.net vSphere ESXi 7.0 Name Patch Dat ...