Java执行Shell和传输文件
特性:
- 多线程批量执行
- 多密码尝试
引入依赖:
<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和传输文件的更多相关文章
- Java执行Shell脚本
Linux 系统下采用 Java 执行 Shell 脚本,直接上代码: package com.smbea.demo; import java.io.BufferedReader; import ja ...
- java 执行shell命令及日志收集避坑指南
有时候我们需要调用系统命令执行一些东西,可能是为了方便,也可能是没有办法必须要调用.涉及执行系统命令的东西,则就不能做跨平台了,这和java语言的初衷是相背的. 废话不多说,java如何执行shell ...
- Java执行shell脚本并返回结果两种方法的完整代码
Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...
- 利用java执行shell脚本
BPMN中存在由系统执行的脚本任务,shell脚本任务也是该系统任务脚本中的一种,利用的也是由java执行shell脚本. 代码中的ProcessBuilder类,为java.lang.Process ...
- Android Java执行Shell命令
最新内容建议直接访问原文:http://www.trinea.cn/android/android-java-execute-shell-commands/ 主要介绍Android或Java应用中如何 ...
- Java执行shell遇到的各种问题
1.判断子进程是否执行结束 有的时候我们用java调用shell之后,之后的操作要在Process子进程正常执行结束的情况下才可以继续,所以我们需要判断Process进程什么时候终止. Process ...
- Java 执行Shell脚本指令
一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...
- java 执行shell命令遇到的坑
正常来说java调用shell命令就是用 String[] cmdAry = new String[]{"/bin/bash","-c",cmd} Runtim ...
- java执行shell脚本并输出执行情况
1.脚本test.sh,置于/Users/hdwang目录下 #!/bin/sh cd /Users/hdwang echo ls:`ls` ;i<=;i++)); do + ); sleep ...
- java执行Shell命令
java程序中要执行linux命令主要依赖2个类:Process和Runtime首先看一下Process类:ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机 ...
随机推荐
- jdk1.8: Consumer函数
场景: 当我们在a方法中,需要把某些参数赋值给一个Integer类型的对象,而该对象只有在b方法才能赋值,那么我们可以在a方法中使用consumer记录我们要执行的操作,再把consumer作为参数传 ...
- 关于el-upload上传图片的一些坑clearFiles()的使用
https://blog.csdn.net/weixin_46421824/article/details/109195624?spm=1001.2101.3001.6661.1&utm_me ...
- vue2+高德地图web端开发
https://blog.csdn.net/qq_51553982/article/details/123014412
- 机器学习-无监督机器学习-主成分分析PCA-23
目录 1. 降维的方式 2. PCA的一般步骤 3. 思想2 最小化投影距离 4. Kernelized PCA 1. 降维的方式 对于维度灾难.数据冗余,这些在数据处理中常见的场景,我们不得不进一步 ...
- CF1656F Parametric MST 题解
为了便于解题,先对 \(a\) 数组从小到大进行排序. 首先,根据定义可以得出总价值的表达式: \[\begin{aligned} W&=\sum\limits_{(u,v)\in E}[a_ ...
- 每天学五分钟 Liunx 0110 | 服务篇:守护进程 systemd
有些进程会在系统上运行较长时间,如前面的 Hello World 程序运行时产生的进程.有些进程运行瞬间就结束了,如执行 ps 命令产生的进程,也有的进程会常驻在内存中,提供相应的服务,这样的进程称为 ...
- VUEX 使用学习六 : modules
转载请注明出处: 当Store中存放了非常多非常大的共享数据对象时,应用会变的非常的复杂,Store对象也会非常臃肿,所以Vuex提供了一个Module模块来分隔Store.通过对Vuex中的Stor ...
- Seata 分布式事务解决方案及特点
本文为博主原创,未经允许不得转载: 目录: 1. Seata官方链接 2. Seata的三大角色 3.Seata 常见分布式事务解决方案 4. 2PC两阶段提交协议 5. 2PC 的问题 6. AT模 ...
- navicat 查看,设计并导出数据库 ER图
转载请注明出处: 1. navicat 查看 ER 图,有两种方式: 第一种:选中数据库,并右键点击选中逆向数据库到模型. 第二种:可以在工具栏点击查看,选中 ER,打开 某数据库,便会展示 该数据库 ...
- NSSCTF Round#11 Basic 密码个人赛复盘
[NSSRound#11 Basic]ez_enc ABAABBBAABABAABBABABAABBABAAAABBABABABAAABAAABBAABBBBABBABBABBABABABAABBAA ...