1. 程式人生 > >七、java呼叫ssh往遠端linux上傳檔案

七、java呼叫ssh往遠端linux上傳檔案

1.匯入maven依賴jar包

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
		<dependency>
		    <groupId>com.jcraft</groupId>
		    <artifactId>jsch</artifactId>
		    <version>0.1.44-1</version>
		</dependency>

2.建立SSH2Util類
package com.ksy.fw.base.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;

/**
 * java遠端上傳檔案
 * @author lenovo
 *
 */
public class SSH2Util {

	private String host;

	private String user;

	private String password;

	private int port;

	private Session session;

	/**
	 * 建立一個連線
	 * 
	 * @param host
	 *            地址
	 * @param user
	 *            使用者名稱
	 * @param password
	 *            密碼
	 * @param port
	 *            ssh2埠
	 */
	public SSH2Util(String host, String user, String password, int port) {
		this.host = host;
		this.user = user;
		this.password = password;
		this.port = port;
	}

	private void initialSession() throws Exception {
		if (session == null) {
			JSch jsch = new JSch();
			session = jsch.getSession(user, host, port);
			session.setUserInfo(new UserInfo() {

				public String getPassphrase() {
					return null;
				}

				public String getPassword() {
					return null;
				}

				public boolean promptPassword(String arg0) {
					return false;
				}

				public boolean promptPassphrase(String arg0) {
					return false;
				}

				public boolean promptYesNo(String arg0) {
					return true;
				}

				public void showMessage(String arg0) {
				}

			});
			session.setPassword(password);
			session.connect();
		}
	}

	/**
	 * 關閉連線
	 * 
	 * @throws Exception
	 */
	public void close() throws Exception {
		if (session != null && session.isConnected()) {
			session.disconnect();
			session = null;
		}
	}

	/**
	 * 上傳檔案
	 * 
	 * @param localPath
	 *            本地路徑,若為空,表示當前路徑
	 * @param localFile
	 *            本地檔名,若為空或是“*”,表示目前下全部檔案
	 * @param remotePath
	 *            遠端路徑,若為空,表示當前路徑,若伺服器上無此目錄,則會自動建立
	 * @throws Exception
	 */
	public void putFile(String localPath, String localFile, String remotePath)
			throws Exception {
		this.initialSession();
		Channel channelSftp = session.openChannel("sftp");
		channelSftp.connect();
		ChannelSftp c = (ChannelSftp) channelSftp;
		String remoteFile = null;
		if (remotePath != null && remotePath.trim().length() > 0) {
			try {
				c.mkdir(remotePath);
			} catch (Exception e) {
			}
			remoteFile = remotePath + "/.";
		} else {
			remoteFile = ".";
		}
		String file = null;
		if (localFile == null || localFile.trim().length() == 0) {
			file = "*";
		} else {
			file = localFile;
		}
		if (localPath != null && localPath.trim().length() > 0) {
			if (localPath.endsWith("/")) {
				file = localPath + file;
			} else {
				file = localPath + "/" + file;
			}
		}
		c.put(file, remoteFile);

		channelSftp.disconnect();
	}

	// public static void main(String[] args) {
	// Ssh2Util ssh = new Ssh2Util("192.168.1.189", "root", "test" , 22);
	// try {
	// String rs = ssh.runCommand("ddddd");
	// } catch (Exception e) {
	// e.printStackTrace();
	// }
	// }
	// command 命令
	public String runCommand(String command) throws Exception {
		// CommonUtil.printLogging("[" + command + "] begin", host, user);

		this.initialSession();
		InputStream in = null;
		InputStream err = null;
		BufferedReader inReader = null;
		BufferedReader errReader = null;
		int time = 0;
		String s = null;
		boolean run = false;
		StringBuffer sb = new StringBuffer();

		Channel channel = session.openChannel("exec");
		((ChannelExec) channel).setCommand(command);
		channel.setInputStream(null);
		((ChannelExec) channel).setErrStream(null);
		err = ((ChannelExec) channel).getErrStream();
		in = channel.getInputStream();
		channel.connect();
		inReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
		errReader = new BufferedReader(new InputStreamReader(err, "UTF-8"));

		while (true) {
			s = errReader.readLine();
			if (s != null) {
				sb.append("error:" + s).append("\n");
			} else {
				run = true;
				break;
			}
		}
		while (true) {
			s = inReader.readLine();
			if (s != null) {
				sb.append("info:" + s).append("\n");
			} else {
				run = true;
				break;
			}
		}

		while (true) {
			if (channel.isClosed() || run) {
				// CommonUtil.printLogging("[" + command + "] finish: " +
				// channel.getExitStatus(), host, user);
				break;
			}
			try {
				Thread.sleep(1000);
			} catch (Exception ee) {
			}
			if (time > 180) {
				// CommonUtil.printLogging("[" + command + "] finish2: " +
				// channel.getExitStatus(), host, user);
				break;
			}
			time++;
		}

		inReader.close();
		errReader.close();
		channel.disconnect();
		session.disconnect();
		System.out.println(sb.toString());
		return sb.toString();
	}

	public static void main(String[] args) throws Exception {
		SSH2Util ssh2Util = new SSH2Util("127.0.0.1", "root","root", 22);
		ssh2Util.putFile("C:\\Users\\lenovo\\Desktop", "99999.sh","/usr/ksybak/tomcats");
	}
}