java scp批量远程传输文件(实现多线程)

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();
				}
			
			}
		}
	}
	
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值