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 方法创建一个本机 ...
随机推荐
- Codeforces Round #700 (Div. 2) A ~ D1个人题解
Codeforces Round #700 (Div. 2) 比赛链接: Click Here 1480A. Yet Another String Game 因为Alice是要追求小,Bob追求大值, ...
- 如何在公司项目中使用 WebSocket— 入门实战指南
本文从 WebSocket 基础概念出发,介绍在实际开发中从本地联调到部署上线的流程以及注意事项,让 WebSocket 小白以最小成本应用到项目中. 一.WebSocket 基础 1.什么是 Web ...
- 深入浅出 ZooKeeper
ZooKeeper 是一个分布式协调服务 ,由 Apache 进行维护. ZooKeeper 可以视为一个高可用的文件系统. ZooKeeper 可以用于发布/订阅.负载均衡.命令服务.分布式协调/通 ...
- freeswitch-1.10.7 on centos7编译安装
概述 最近由于项目需求,老版本的fs已经不适用,特此升级了freeswitch的版本,使用当前最新的1.10.7版本编译安装. 环境 centos:CentOS release 7.0 (Final ...
- 传说中 PUE 预测精度高达 0.005 的工作
杨震, 赵静洲, 林依挺 等. 数据中心 PUE 能效优化的机器学习方法. 系统工程理论与实践, 2022, 42(3): 811-832 省流: 这是 2020 年的论文,用神经网络进行了认真的 P ...
- 【MCU】浮点数如何判等
[来源]https://mp.weixin.qq.com/s/481H4imm73IIS1yFI7-DNA
- [转帖]【VIM】多行缩进空格与删除
向前或向后缩进一个TAB 按ctrl + v组合键进入Visual Line模式,可使用方向键选择多行: 按<或>,进行向前或向后缩进tab. 缩进n个TAB,按n+<或> 多 ...
- [转帖]UNIX SOCKET简介
UNIX Domain SOCKET 是在Socket架构上发展起来的用于同一台主机的进程间通讯(IPC).它不需要经过网络协议栈,不需要打包拆包.计算校验和.维护序列号应答等.只是将应用层数据从一个 ...
- [转帖]harbor镜像仓库清理操作
https://www.cnblogs.com/FengGeBlog/p/15517706.html 两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ce ...
- [转帖]如何利用wrarp测试oss性能?
https://zhuanlan.zhihu.com/p/529735003 前言 我们利用mino与ceph rgw搭建好的oss经过多层网络转发,传输速度必定有所折损,这个时候我们使用wrap ...