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 方法创建一个本机 ...
随机推荐
- 【网摘】SQL练习题
原文链接:Here
- <vue 组件 2、组件参数传递>
代码结构 一. 01-父组件向子组件传递数据 1. 效果 展示出来的数据都是父组件传给子组件的数据 2.代码 01-父组件向子组件传递数据.html <!DOCTYPE html> ...
- excel如何自动获取本周工作日的日期显示作为标题(周一至周五)
一.背景: 每周发周报的标题格式为:本周一到本周五的日期内容,如下:但是每隔一周发送的时候需要改一下周报标题里面的日期,比较麻烦目前的需求是通过函数自动化生成,根据当前的日期去定位出本周一的日期以及本 ...
- python进阶(8)--测试函数与类
一.测试函数(unittest) 1.源文件方法(name_function.py): def get_formatted_name(first,last): """生成 ...
- 玩转 Helm
0. 前言 在 kubernetes 的系列文章中,我们介绍了 kubernetes 的种种概念,特性.不过对于如何部署并没有介绍,想象下如果 kubernetes 中 pod 的数量达到成百,上千, ...
- 基于React开发的chatgpt网页版(仿chatgpt)
在浏览github的时候发现了一个好玩的项目本项目,是github大神Yidadaa开发的chatgpt网页版,该开源项目是跨平台的,Web / PWA / Linux / Win / MacOS都可 ...
- 分享一个简单的使用js格式化json的代码
今天给大家分享一段json格式化代码. 假设json字符串是: {"name":"刘德华","age":25.2,"birthda ...
- 【Git】用法小记
解决windows环境下的CRLF与unix环境下的LF问题,windows提交时CRLF=>LF,签出时LF=>CRLF,unix环境保留 git config --global cor ...
- 2023-SWPU NSS秋季招新赛(校外赛道)Misc—我要成为原神高手WP
1.题目信息 我是神里绫华的狗!!! 2.解题方法 有个genshin.h文件夹,打开看看发现里面是一堆文件夹0 1A 1A0等等,而且每个文件夹里面都有文件,0 1A 1A0...看着很眼熟,我们用 ...
- apicloud(沉浸式导航篇) - 手机状态栏 有黑边的解决办法
在 index.html 的 apiready 中加上 第一种 : 可设置全屏 api.setFullScreen({ fullScreen: true }); 第二种:设置状 ...