java scp批量远程传输文件(实现多线程)
通过java实现scp批量多线程远程传输文件,可以实现远程上传文件,远程删除文件,远程解压文件,远程退出应用,远程判断文件存不存在,即可以实现远程终端命令。
用法:在eclipse编程软件中新建一个名称为SCP工程文件(Java Project),在工程文件下新建com包,在com包中新建SCP.java类和mySwing.java类;在SCP工程文件下新建library文件夹和data文件夹,把commons-lang3-3.7.jar和ganymed-ssh2-build210.jar和jxl.jar文件复制到library文件夹,把ip.xls表格复制到data文件夹下;然后,右击SCP工程文件点击Build Path下的Configure Build Path…,然后点击Add JARs…,然后选择SCP下的library的三个jar文件(单个添加,一次添加一个jar),点击OK,然后点击Apply and Close。
SCP.java
package com;
import java.lang.Runnable;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import javafx.scene.paint.Color;
import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.JFileChooser;
import javax.swing.WindowConstants;
import javax.swing.JButton;
import javax.swing.JComponent;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
//监听器
import java.awt.event.ActionEvent;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.apache.commons.lang3.StringUtils;
public class SCP extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
private JButton button_scp;
private JButton button_unzip;
private JButton button_panduanfile;
private JButton button_delete;
private JButton button_kill;
private static String DEFAULTCHART="UTF-8";
private String pwd = "gdlocal";
private String user = "gdlocal";
private int port =22;
private Connection conn;
String [] arr = null;
JTextField FilePath;
JTextField FileName;
String filepath;
String filename;
JLabel label_pathfile;
JLabel label_FileName;
Workbook wb;
static int g;
static int ipsum;
static int z;
int sum = 0;
SCP(){
this.setTitle("liyangwei"); //创建窗口
this.setSize(450, 450); //设置窗口大小
this.setLocationRelativeTo(null);//设置窗口相对与指定组件的位置,null表示在中间
this.setResizable(false); //不能改变窗口大小
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//窗口关闭时退出程序
Container con_GridLayout = getContentPane();
JPanel panel_null = new JPanel();
JPanel panel_FlowLayout = new JPanel();
con_GridLayout.setLayout(new GridLayout(2,1)); //2行3列的布局
panel_null.setLayout(null); //设置空布局,即绝对布局
panel_FlowLayout.setLayout(new FlowLayout()); //流式布局
//FlowLayout.setAlignment(FlowLayout.LEFT);//设置JPanel中控件的对齐方式
button_scp = new JButton("上传");
button_unzip = new JButton("解压 文件名不用后缀");
button_delete = new JButton("删除");
button_panduanfile = new JButton("判断文件存不存在");
button_kill = new JButton("退出WiPASXNext");
button_scp.addActionListener(this);
button_unzip.addActionListener(this);
button_delete.addActionListener(this);
button_panduanfile.addActionListener(this);
button_kill.addActionListener(this);
FilePath = new JTextField(30); //文件路径
FilePath.setText("/Users/holmes/Desktop/");
FileName = new JTextField(30); //文件名
FileName.setText("WiPASXNext");
label_pathfile = new JLabel("文件路径");
label_FileName = new JLabel("文件名称");
FilePath.setTransferHandler(new TransferHandler(){
public boolean importData(JComponent comp, Transferable t) {
try {
Object o = t.getTransferData(DataFlavor.javaFileListFlavor);
String filepath = o.toString();
if(filepath.startsWith("[")) {
filepath = filepath.substring(1);
}
if(filepath.endsWith("]")) {
filepath = filepath.substring(0, filepath.length() - 1);
}
FilePath.setText(filepath);
return true;
}catch(Exception e) {
}
return false;
}
public boolean canImport(JComponent comp, DataFlavor[] flavors) {
for(int i = 0; i < flavors.length; i++) {
if(DataFlavor.javaFileListFlavor.equals(flavors[i])) {
return true;
}
}
return false;
}
});
label_FileName.setBounds(0,0,100,25);//x,y,width,height
FileName.setBounds(50,0,350,25);
label_pathfile.setBounds(0,25,100,25);
FilePath.setBounds(50,25,350,25);
panel_null.add(label_FileName);
panel_null.add(FileName);
panel_null.add(label_pathfile);
panel_null.add(FilePath);
panel_FlowLayout.add(button_scp);
panel_FlowLayout.add(button_unzip);
panel_FlowLayout.add(button_delete);
panel_FlowLayout.add(button_panduanfile);
panel_FlowLayout.add(button_kill);
con_GridLayout.add(panel_null);
con_GridLayout.add(panel_FlowLayout);
//设置窗口为可见的
this.setVisible(true);
arr = new String[200];
File file = new File("/Users/holmes/eclipse-workspace/SCP/data/ip.xls");
try {
wb = Workbook.getWorkbook(file);
} catch (BiffException | IOException e) {
e.printStackTrace();
}
Sheet sheet = wb.getSheet("Sheet1");
for (int i = 0; i < sheet.getRows(); i++) {//i行
for (int j = 0; j < sheet.getColumns(); j++) {//j列
Cell cell = sheet.getCell(j, i);
arr[i] = cell.getContents();
}
}
ipsum = sheet.getRows();
System.out.print("ipsum:"+ipsum);
g = 100/ipsum;
wb.close();
}
public static void main(String[] args) throws Exception{
SCP liyangwei = new SCP();
new mySwing();
}
//动作
public void actionPerformed(ActionEvent e) {
try {
Thread.sleep(1000);
} catch (InterruptedException g) {
g.printStackTrace();
}
if(e.getSource() == button_scp)
{
// 创建线程对象,采用匿名内部类方式。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
scp();
}
});
// 启动线程
t.start();
}
else if(e.getSource() == button_panduanfile)
{
// 创建线程对象,采用匿名内部类方式。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
panduanFile();
}
});
// 启动线程
t.start();
}
else if(e.getSource() == button_unzip)
{
// 创建线程对象,采用匿名内部类方式。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
unzip();
}
});
// 启动线程
t.start();
}
else if(e.getSource() == button_delete)
{
// 创建线程对象,采用匿名内部类方式。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
deleteFile();
}
});
// 启动线程
t.start();
}
else if(e.getSource() == button_kill)
{
// 创建线程对象,采用匿名内部类方式。
Thread t = new Thread(new Runnable(){
@Override
public void run() {
actionExitAPP();
}
});
// 启动线程
t.start();
}
}
public void scp()
{
z = 0;
filename = FileName.getText();
filepath = FilePath.getText();
int i = 0;
sum = 0;
while(arr[i] != null) {
z = z + g;
String ip = arr[i];
//创建链接
conn = new Connection(ip, port);
try {
conn.connect();
//登陆
boolean isAuthed = conn.authenticateWithPassword(user, pwd);
//获取SCPClient
if(isAuthed) {
System.out.println( "登陆成功!");
SCPClient scp = conn.createSCPClient();
//SCPClient scp = new SCPClient(conn);
scp.put(""+filepath+"", "/Users/gdlocal/Desktop/");
System.out.println(arr[i] + "成功上传文件");
//SCPInputStream is = scp.get("/users/gdlocal/Desktop/WiPASXNext_88.zip");
conn.close();
}
else {
System.out.println( arr[i] + "登陆失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
sum = sum + 1;
conn.close();
}
} catch (IOException e) {
System.out.println(arr[i] + "连接远程电脑失败!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
sum = sum + 1;
i = i + 1;
//e.printStackTrace();
conn.close();
continue;
}
i = i + 1;
}
JOptionPane.showMessageDialog(this, "登陆失败数量:"+sum+" ", "帮助", 1);
}
public String panduanFile()
{
z = 0;
filename = FileName.getText();
String result = "";
int i = 0;
sum = 0;
while(arr[i] != null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//e.printStackTrace();
}
z = z + g;
String ip = arr[i];
try {
//创建链接
conn = new Connection(ip, port);
conn.connect();
//登陆
boolean isAuthed = conn.authenticateWithPassword(user, pwd);
//获取SCPClient
try {
if(isAuthed && conn != null) {
//打开一个会话
Session session = conn.openSession();
//判断远程电脑文件存不存在
//session.execCommand("[ -f /Users/gdlocal/Desktop/WiPASXNext136_886.zip ] && echo OK");
session.execCommand("[ -a /Users/gdlocal/Desktop/"+filename+" ] && echo OK");
result = processStdout(session.getStdout(), DEFAULTCHART);
if(!result.isEmpty()) {
System.out.println("文件存在");
}
else {
System.out.println(arr[i] + "文件不存在!!!!!!!");
sum = sum + 1;
}
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)) {
System.out.println("命令出错");
}
else {
System.out.println("命令执行成功");
}
conn.close();
session.close();
}
else {
System.out.println(arr[i] + "登陆失败!!!!!!!!!!!!!!!!!!!!!!!!!!!");
sum = sum + 1;
conn.close();
}
} catch (IOException e) {
System.out.println("执行命令失败,链接conn:"+conn);
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
continue;
}
} catch (IOException e) {
System.out.println(arr[i] + "登陆失败");
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
continue;
}
i = i + 1;
}
JOptionPane.showMessageDialog(this, "文件不存在的数量:"+sum+" ", "帮助", 1);
return result;
}
private static String processStdout(InputStream in, String charset)
{
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
try {
@SuppressWarnings("resource")
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
String line = null;
while((line = br.readLine()) != null) {
buffer.append(line+"\n");
}
} catch (UnsupportedEncodingException e) {
System.out.println("解析脚本出错");
//e.printStackTrace();
} catch (IOException e) {
System.out.println("解析脚本出错");
//e.printStackTrace();
}
return buffer.toString();
}
public String unzip()
{
z = 0;
filename = FileName.getText();
String result = "";
int i = 0;
sum = 0;
while(arr[i] != null) {
z = z + g;
String ip = arr[i];
try {
//创建链接
conn = new Connection(ip, port);
conn.connect();
//登陆
boolean isAuthed = conn.authenticateWithPassword(user, pwd);
//获取SCPClient
try {
if(isAuthed && conn != null) {
//打开一个会话
Session session = conn.openSession();
//判断远程电脑文件存不存在
//session.execCommand("[ -f /Users/gdlocal/Desktop/WiPASXNext136_886.zip ] && echo OK");
session.execCommand("[ -a /Users/gdlocal/Desktop/"+filename+".app ] && echo OK");
result = processStdout(session.getStdout(), DEFAULTCHART);
if(result.isEmpty()) {
System.out.println("文件不存在,解压文件");
session.close();
Session session2 = conn.openSession();
session2.execCommand("cd /Users/gdlocal/Desktop/ && open "+filename+".zip ");
session2.close();
}
else {
System.out.println(arr[i] + "文件存在,不用解压!!!!!!!!!!!!");
sum = sum + 1;
}
//result = processStdout(session.getStderr(),DEFAULTCHART);
//System.out.println(result);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)) {
System.out.println("命令出错");
}
else {
System.out.println("命令执行成功");
}
conn.close();
session.close();
}
else {
System.out.println(arr[i] + "登陆失败!!!!!!!!!!!!!!!!!!!!!!!!!!!");
sum = sum + 1;
conn.close();
}
} catch (IOException e) {
System.out.println("执行命令失败,链接conn:"+conn);
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
conn.close();
continue;
}
} catch (IOException e) {
System.out.println(arr[i] + "登陆失败");
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
continue;
}
i = i + 1;
}
JOptionPane.showMessageDialog(this, "解压文件不成功的数量:"+sum+" ", "帮助", 1);
return result;
}
public String deleteFile()
{
z = 0;
filename = FileName.getText();
String result = "";
int i = 0;
sum = 0;
int zong_ip = 0; //连接删除的电脑数量
int zong_denglu_fail = 0; //登陆电脑失败数量
int zong_nofile = 0; //要删除的文件不存在的数量
while(arr[i] != null) {
zong_ip = zong_ip + 1;
z = z + g;
String ip = arr[i];
try {
//创建链接
conn = new Connection(ip, port);
conn.connect();
//登陆
boolean isAuthed = conn.authenticateWithPassword(user, pwd);
//获取SCPClient
try {
if(isAuthed && conn != null) {
//打开一个会话
Session session = conn.openSession();
//判断远程电脑文件存不存在
//session.execCommand("[ -f /Users/gdlocal/Desktop/WiPASXNext136_886.zip ] && echo OK");
//session.execCommand("[ -a /Users/gdlocal/documents/AegisLog ] && echo OK");
//session.execCommand("[ -a /Users/gdlocal/Desktop/WiPASXNext.app ] && echo OK");
session.execCommand("[ -a /Users/gdlocal/Desktop/"+filename+" ] && echo OK");
result = processStdout(session.getStdout(), DEFAULTCHART);
if(!result.isEmpty()) {
System.out.println("文件存在,删除文件");
session.close();
Session session2 = conn.openSession();
//session2.execCommand("rm -rf /Users/gdlocal/Desktop/"+filename+" ");
//session2.execCommand("rm -rf /Users/gdlocal/Desktop/WiPASXNext.app ");
//session2.execCommand("rm -rf /Users/gdlocal/documents/AegisLog");
session2.execCommand("cd /Users/gdlocal/Desktop/ && rm -rf "+filename+" ");
session2.close();
}
else {
System.out.println(arr[i] + "要删除的文件不存在");
sum = sum + 1;
zong_nofile = zong_nofile + 1;
}
/*
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)) {
System.out.println("命令出错");
}
else {
System.out.println("命令执行成功");
}
*/
conn.close();
session.close();
}
else {
System.out.println(arr[i] + "登陆失败!!!!!!!!!!!!!!!!!!!!!!!!!!!");
sum = sum + 1;
zong_denglu_fail = zong_denglu_fail + 1;
conn.close();
}
} catch (IOException e) {
System.out.println("执行命令失败,链接conn:"+conn);
i = i + 1;
sum = sum + 1;
zong_denglu_fail = zong_denglu_fail + 1;
//e.printStackTrace();
conn.close();
continue;
}
} catch (IOException e) {
System.out.println(arr[i] + "登陆失败");
i = i + 1;
sum = sum + 1;
zong_denglu_fail = zong_denglu_fail + 1;
//e.printStackTrace();
continue;
}
i = i + 1;
}
System.out.println(zong_ip);
System.out.println(zong_denglu_fail);
System.out.println(zong_nofile);
JOptionPane.showMessageDialog(this, "删除文件不成功的总数量: = 登陆失败的数量: + 要删除的文件不存在的数量:"+sum+ +zong_denglu_fail+ +zong_nofile+" ", "帮助", 1);
return result;
}
public String actionExitAPP()
{
z = 0;
filename = FileName.getText();
String result = "";
int i = 0;
sum = 0;
while(arr[i] != null) {
z = z + g;
mySwing.progressbar.setValue(SCP.z);
String ip = arr[i];
System.out.println(ip);
try {
//创建链接
conn = new Connection(ip, port);
conn.connect();
//登陆
boolean isAuthed = conn.authenticateWithPassword(user, pwd);
//获取SCPClient
try {
if(isAuthed && conn != null) {
System.out.println("登陆成功!退出所有应用!");
//打开一个会话
Session session = conn.openSession();
//退出所有应用
session.execCommand("killall WiPASXNext ");
//session.execCommand("killall "+filename+" ");
result = processStdout(session.getStdout(), DEFAULTCHART);
//如果为得到标准输出为空,说明脚本执行出错了
if(StringUtils.isBlank(result)) {
System.out.println("命令出错");
}
else {
System.out.println("命令执行成功");
}
conn.close();
session.close();
}
else {
System.out.println(arr[i] + "登陆失败");
sum = sum + 1;
conn.close();
}
} catch (IOException e) {
System.out.println("执行命令失败,链接conn:"+conn);
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
conn.close();
continue;
}
} catch (IOException e) {
System.out.println(arr[i] + "登陆失败");
i = i + 1;
sum = sum + 1;
//e.printStackTrace();
continue;
}
i = i + 1;
}
JOptionPane.showMessageDialog(this, "退出应用不成功的数量:"+sum+" ", "帮助", 1);
return result;
}
}
进度条类
package com;
import javax.swing.JDialog;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JProgressBar; //进度条
public class mySwing extends JDialog {
/**
* 弹窗
*/
private static final long serialVersionUID = 1L;
public static JProgressBar progressbar; //创建进度条
mySwing() {
this.setTitle("正在下载...");
this.setSize(200,100);//设置窗口大小
progressbar = new JProgressBar(); //创建进度条
progressbar.setStringPainted(true); //显示当前进度条信息
progressbar.setBorderPainted(false); //设置进度条边框不显示
progressbar.setForeground(new Color(0, 210, 40)); //设置进度条的前景色
progressbar.setBackground(new Color(188, 190, 194)); //设置进度条的背景颜色
JPanel My_panel = new JPanel(new BorderLayout());//面板
My_panel.add(progressbar, BorderLayout.SOUTH);
this.setContentPane(My_panel);//窗口添加面板
//this.setResizable(false);
this.setVisible(true);//设置窗口为可见
new Thread(new myRepaint()).start(); //进度条线程开始
}
private class myRepaint implements Runnable{
//另一种方法,创建一个线程运行进度条
public void run() {
while(true)
{
Dimension d = progressbar.getSize();
//设置进度条的值
progressbar.setValue(SCP.z);
Rectangle rect = new Rectangle(0, 0, d.width, d.height);
progressbar.setValue(SCP.z);
progressbar.paintImmediately(rect);
//repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}