特性:

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

引入依赖:

        <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. 详解异步任务 | 看 Serverless Task 如何解决任务调度&可观测性中的问题

    在上篇文章<解密函数计算异步任务能力之「任务的状态及生命周期管理」>中,我们介绍了任务系统的状态管理,并介绍了用户应如何根据需求,对任务状态信息进行实时的查询等操作.在本篇中我们将会进一步 ...

  2. vue学习笔记 七、方法的定义和使用

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  3. echarts折线图美化(颜色渐变、背景透明、隐藏坐标轴)

    echarts折线图美化(颜色渐变.背景透明.隐藏坐标轴) https://blog.csdn.net/Changeable0127/article/details/81333559?utm_medi ...

  4. java进阶(14)--日期时间处理

    一.获取系统当前时间: 1.Date(),精确到毫秒的当前当前时间 2.示例,欧美风格时间格式

  5. ORA-01017: 用户名/密码无效;登录被拒绝

    总结 出现此错误的原因有多种: 您的用户名或密码实际上不正确 数据库配置不正确(tnanames.ora. $ORACLE_SID 参数) 现在,我们来看看这个错误的解决方案. ORA-01017 解 ...

  6. [转帖]Oracle安装 - shmmax和shmall设置

    https://www.cnblogs.com/ddzj01/p/16108010.html 一.概述 在Linux上安装oracle,需要对内核参数进行调整,其中有shmmax和shmall这两个参 ...

  7. lightning 导入数据库表的操作步骤

    lightning 导入数据库表的操作步骤 TiDB数据库备份恢复的方式与方法 1. mysqldumper 以及 mysql 导入 2. select into outfile 以及 load da ...

  8. ext4 扩容磁盘的方式方法

    ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...

  9. [转帖]FIO使用说明

    FIO介绍: FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类.FIO是一个可以产生很多线程或进程并执 ...

  10. [转帖]Nginx应用调优案例

    https://bbs.huaweicloud.com/blogs/146367 [摘要] 1 问题背景nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优 ...