Shell for SSH

/**   
 * Copyright © 2016 Hefei Wo Yi Information Technology Co., Ltd. All rights reserved.
 * 
 * @Title  SSHShell.java 
 * @Prject  Mhub-comm
 * @Package  com.woyi.mhub.util 
 * @author  wangzi   
 * @date  2016年8月25日 下午3:25:06 
 * @version  V1.0   
 */
package com.wz;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.SequenceInputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import com.trilead.ssh2.Connection;
import com.trilead.ssh2.SCPClient;
import com.trilead.ssh2.SFTPv3Client;
import com.trilead.ssh2.Session;
import com.trilead.ssh2.StreamGobbler;

/**
 * 利用ssh执行shell
 * @ClassName SSHShell
 * @author wangzi
 * @date 2016年8月25日 下午3:25:06
 */
public class SSHShell {
	/**
	 * Windows
	 */
	public static final String OSTYPE_WINDOWS = "Windows";
	/**
	 * Linux
	 */
	public static final String OSTYPE_LINUX = "Linux";
	/**
	 * 连接
	 */
	private Connection conn;

	/**
	 * 构造方法
	 * @Title SSHShell
	 * @param ip
	 * @param port
	 * @param username
	 * @param password
	 * @throws Exception
	 */
	public SSHShell(String ip, int port, String username, String password) throws Exception {
		conn = new Connection(ip, port);
		conn.connect();
		boolean isAuthenticated = conn.authenticateWithPassword(username, password);
		if (!isAuthenticated) {
			throw new RuntimeException("Authenticat fail!");
		}
	}
	/**
	 * 在远程服务器上执行命令
	 * @Title runRomoteScript
	 * @author wangzi
	 * @param cmds
	 * @param OSType
	 * @return
	 * @throws Exception
	 * @return List<String>
	 */
	public List<String> runRomoteScript(String[] cmds, String osType) throws Exception {
		List<String> result = new ArrayList<String>();
		if (cmds.length == 0) {
			return result;
		}
		Session session = conn.openSession();
		String separator = "";
		if (osType.equals(OSTYPE_WINDOWS)) {
			separator = " && ";
		} else {
			separator = " ; ";
		}
		String cmd = "";
		for (int i = 0; i < cmds.length; i++) {
			if (i == 0) {
				cmd = cmds[i];
			} else {
				cmd = cmd + separator + cmds[i];
			}
		}
		session.execCommand(cmd);
		InputStream stream1 = session.getStdout();
		InputStream stream2 = session.getStderr();
		SequenceInputStream stream = new SequenceInputStream(stream1, stream2);
		InputStream stdout = new StreamGobbler(stream);
		BufferedReader br = new BufferedReader(
				new InputStreamReader(stdout, Charset.forName("GBK")));
		while (true) {
			String line = br.readLine();
			if (line == null){
				break;
			}
			result.add(line);
		}
		br.close();
		session.close();
		return result;
	}
	/**
	 * 从远程服务器获取文件
	 * @Title getFileFromRemote
	 * @author wangzi
	 * @param remoteFileName
	 * @param localDir
	 */
	public void getFileFromRemote(String remoteFileName, String localDir) throws Exception{
		File inputFile = new File(localDir);
		if (!inputFile.exists()) {
			inputFile.mkdirs();
		}
		SCPClient scpClient;
		try {
			scpClient = conn.createSCPClient();
			scpClient.get(remoteFileName, localDir);
		} catch (IOException e) {
			throw new Exception("Get file from remote fail!");
		}
	}
	/**
	 * 将文件发送至服务器
	 * @Title putFileToRemote
	 * @author wangzi
	 * @param localFileName
	 * @param remoteDir
	 */
	public void putFileToRemote(String localFileName, String remoteDir)
			throws Exception{
		try{
			SCPClient scpClient = conn.createSCPClient();
			scpClient.put(localFileName, remoteDir);
		}catch(Exception e){
			throw new Exception("Put file to remote fail!");
		}
	}
	/**
	 * 删除服务器文件
	 * @Title delRemoteFile
	 * @author wangzi
	 * @param remoteFileName
	 */
	public void delRemoteFile(String remoteFileName) throws Exception{
		try{
			SFTPv3Client client = new SFTPv3Client(conn);
			client.rm(remoteFileName);
		}catch(Exception e){
			throw new Exception("Delete remote file fail!");
		}
	}
	
	/**
	 * 断开连接
	 * @Title disConnect
	 * @author wangzi
	 */
	public void disConnect() {
		if (conn != null) {
			conn.close();
		}
	}
	
	public static void main(String[] args) {
		SSHShell shell;
		String cmd;
		try{
			//Windows + MySql
			//注:Windows下每次执行命令后,都要断开连接,重新执行别的操作
			shell = new SSHShell("192.168.1.120", 22, "Administrator", "123");
			cmd = "mysqldump -uroot -ppass --default-character-set=utf8 --no-autocommit --skip-opt --skip-tz-utc"
					+ " -R --verbose --hex-blob --databases ahtxgljapp > C:/120.sql";
			List<String> list = shell.runRomoteScript(new String[]{cmd}, OSTYPE_WINDOWS);
			for(String s:list){
				System.out.println(s);
			}
			shell.disConnect();
			shell = new SSHShell("192.168.1.120", 22, "Administrator", "123");
			shell.getFileFromRemote("C:/120.sql", "C:/");
			shell.disConnect();
			shell = new SSHShell("192.168.1.120", 22, "Administrator", "123");
			shell.delRemoteFile("C:/120.sql");
			shell.disConnect();
			
			//Windows + Oracle
			/*shell = new SSHShell("192.168.1.184", 22, "Administrator", "123");
			cmd = "exp mhub/mhub owner='(mhub)' file = C:/184.dmp";
			List<String> list = shell.runRomoteScript(new String[]{cmd}, OSTYPE_WINDOWS);
			for(String s:list){
				System.out.println(s);
			}
			shell.disConnect();
			shell = new SSHShell("192.168.1.184", 22, "Administrator", "123");
			shell.getFileFromRemote("C:/184.dmp", "C:/");
			shell.disConnect();
			shell = new SSHShell("192.168.1.184", 22, "Administrator", "123");
			shell.delRemoteFile("C:/184.dmp");
			shell.disConnect();*/
			
			//Linux + MySql
			/*shell = new SSHShell("192.168.1.239", 22, "wangzi", "123");
			cmd = "mysqldump -uroot -p123456 --default-character-set=utf8 --no-autocommit --skip-opt --skip-tz-utc"
					+ " -R --verbose --hex-blob --databases test > /home/wangzi/239.sql";
			List<String> list = shell.runRomoteScript(new String[]{cmd}, OSTYPE_LINUX);
			for(String s:list){
				System.out.println(s);
			}
			shell.getFileFromRemote("/home/wangzi/239.sql", "C:/");
			shell.delRemoteFile("/home/wangzi/239.sql");
			shell.disConnect();*/
			
			//Linux + MySql
			/*shell = new SSHShell("192.168.1.239", 22, "wangzi", "123");
			cmd = "exp mhub/mhub owner='(mhub)' file = C:/239.dmp";
			List<String> list = shell.runRomoteScript(new String[]{cmd}, OSTYPE_LINUX);
			for(String s:list){
				System.out.println(s);
			}
			shell.getFileFromRemote("/home/wangzi/239.dmp", "C:/");
			shell.delRemoteFile("/home/wangzi/239.dmp");
			shell.disConnect();*/
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}



orion-ssh2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值