java ssh 密钥方式上传和操作远程服务器

使用ssh公共密钥身份验证连接到远程系统是一种健壮,安全的替代使用帐户密码或密码登录方法。ssh公钥认证依赖于生成一对单独的密钥(即密钥对),一个“私有”和另一个“公共”的非对称密码算法。将私钥保密并将其存储在用来连接远程系统的计算机上。公钥保存在需要远程登陆的服务器上,~/.ssh/authorized_keys文件里

ssh-keygen (选项)
选项
-b:指定密钥长度;
-e:读取openssh的私钥或者公钥文件;
-C:添加注释;
-f:指定用来保存密钥的文件名;
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥;
-l:显示公钥文件的指纹数据;
-N:提供一个新密语;
-P:提供(旧)密语;
-q:静默模式;
-t:指定要创建的密钥类型。
ssh-keygen -t rsa -P 123456 -f host -C 'my host key'

 

 


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
 
import org.apache.log4j.Logger;
 
import com.viewhigh.vadp.framework.data.util.StringUtils;
 
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
 
/**
 * 
 * 描述:连接linux服务器并执行相关的shell命令
 */
public class ConnectLinuxCommand {
	private static final Logger logger = Logger.getLogger(ConnectLinuxCommand.class);
 
	private static String DEFAULTCHARTSET = "UTF-8";
	private static Connection conn;
 
    /**
     * 
     * @Title: login  
     * @Description: 用户名密码方式  远程登录linux服务器
     * @return: Boolean     
     * @throws
     */
	public static Boolean login(RemoteConnect remoteConnect) {
		boolean flag = false;
		try {
			conn = new Connection(remoteConnect.getIp());
			conn.connect();// 连接
			flag = conn.authenticateWithPassword(remoteConnect.getUserName(), remoteConnect.getPassword());// 认证
			if (flag) {
				logger.info("认证成功!");
			} else {
				logger.info("认证失败!");
				conn.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return flag;
	}
    /**
     * 
    * @Title: loginByKey
    * @Description: 秘钥方式  远程登录linux服务器
    * @param remoteConnect 
    * @param keyFile  一个文件对象指向一个文件,该文件包含OpenSSH密钥格式的用户的DSA或RSA私钥(PEM,不能丢失"-----BEGIN DSA PRIVATE KEY-----" or "-----BEGIN RSA PRIVATE KEY-----"标签
    * @param keyfilePass 如果秘钥文件加密 需要用该参数解密,如果没有加密可以为null
    * @return Boolean
    * @throws
     */
	public static Boolean loginByFileKey(RemoteConnect remoteConnect, File keyFile, String keyfilePass) {
		boolean flag = false;
		// 输入密钥所在路径
		// File keyfile = new File("C:\Users\LiShiJu\.ssh\id_rsa");
		try {
			conn = new Connection(remoteConnect.getIp());
			conn.connect();
			// 登录认证
			flag = conn.authenticateWithPublicKey(remoteConnect.getUserName(), keyFile, keyfilePass);
			if (flag) {
				logger.info("认证成功!");
			} else {
				logger.info("认证失败!");
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}
    
    /**
     * 
    * @Title: loginByCharsKey
    * @Description: 秘钥方式  远程登录linux服务器
    * @param remoteConnect
    * @param keys  一个字符[],其中包含用户的DSA或RSA私钥(OpenSSH密匙格式,您不能丢失“----- begin DSA私钥-----”或“-----BEGIN RSA PRIVATE KEY-----“标签。char数组可以包含换行符/换行符。
    * @param keyPass 如果秘钥字符数组加密  需要用该字段解密  否则不需要可以为null 
    * @return Boolean
    * @throws
     */
	public static Boolean loginByCharsKey(RemoteConnect remoteConnect, char[] keys, String keyPass) {
 
		boolean flag = false;
		// 输入密钥所在路径
		// File keyfile = new File("C:\\temp\\private");
		try {
			conn = new Connection(remoteConnect.getIp());
			conn.connect();
			// 登录认证
			flag = conn.authenticateWithPublicKey(remoteConnect.getUserName(), keys, keyPass);
			if (flag) {
				logger.info("认证成功!");
			} else {
				logger.info("认证失败!");
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}
    /**
     * 
     * @Title: execute  
     * @Description: 远程执行shll脚本或者命令
     * @param cmd 脚本命令
     * @return: result 命令执行完毕返回结果     
     * @throws
     */
    public static String execute(String cmd){
		String result = "";
		try {
			Session session = conn.openSession();// 打开一个会话
			session.execCommand(cmd);// 执行命令
			result = processStdout(session.getStdout(), DEFAULTCHARTSET);
			// 如果为得到标准输出为空,说明脚本执行出错了
			if (StringUtils.isBlank(result)) {
				result = processStdout(session.getStderr(), DEFAULTCHARTSET);
			}
			conn.close();
			session.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
    }
    /**
    * @Title: executeSuccess
    * @Description: 远程执行shell脚本或者命令
    * @param shell脚本或者命令
    * @return String 命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
    * @throws
     */
    public static String executeSuccess(String cmd){
		String result = "";
		try {
			Session session = conn.openSession();// 打开一个会话
			session.execCommand(cmd);// 执行命令
			result = processStdout(session.getStdout(), DEFAULTCHARTSET);
			conn.close();
			session.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
    }
    /**
     * 
    * @Title: processStdout
    * @Description: 解析脚本执行的返回结果
    * @param in 输入流对象
    * @param charset 编码
    * @return String 以纯文本的格式返回
    * @throws
     */
    public static String processStdout(InputStream in, String charset){
		InputStream stdout = new StreamGobbler(in);
		StringBuffer buffer = new StringBuffer();
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
			String line = null;
			while ((line = br.readLine()) != null) {
				buffer.append(line + "\n");
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return buffer.toString();
    }
    
    /**
     * 
    * @Title: ConnectLinux
    * @Description: 通过用户名和密码关联linux服务器
    * @return
    * @return String
    * @throws
     */
    public static boolean connectLinux(String ip,String userName,String password,String commandStr) {
    	
		logger.info("ConnectLinuxCommand  scpGet===" + "ip:" + ip + "  userName:" + userName + "  commandStr:"
				+ commandStr);
		
		String returnStr = "";
		boolean result = true;
 
		RemoteConnect remoteConnect = new RemoteConnect();
		remoteConnect.setIp(ip);
		remoteConnect.setUserName(userName);
		remoteConnect.setPassword(password);
		try {
			if (login(remoteConnect)) {
				returnStr = execute(commandStr);
				System.out.println(result);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		if (StringUtils.isBlank(returnStr)) {
			result = false;
		}
		return result;
    }
    /**
     * 
    * @Title: scpGet
    * @Description: 从其他服务器获取文件到本服务器指定目录
    * @param host ip(其他服务器)
    * @param username 用户名(其他服务器)
    * @param password 密码(其他服务器)
    * @param remoteFile 文件位置(其他服务器)
    * @param localDir 本服务器目录
    * @throws IOException
    * @return void
    * @throws
     */
	public static void scpGet(String ip, String userName, String password, String remoteFile, String localDir)
			throws IOException {
		
		logger.info("ConnectLinuxCommand  scpGet===" + "ip:" + ip + "  userName:" + userName + "  remoteFile:"
				+ remoteFile + "  localDir:" + localDir);
		RemoteConnect remoteConnect = new RemoteConnect();
		remoteConnect.setIp(ip);
		remoteConnect.setUserName(userName);
		remoteConnect.setPassword(password);
 
		if (login(remoteConnect)) {
			SCPClient client = new SCPClient(conn);
			client.get(remoteFile, localDir);
			conn.close();
		}
	}
	/**
	 * 
	* @Title: scpPut
	* @Description: 将文件复制到其他计算机中
	* @param host 
	* @param username
	* @param password
	* @param localFile
	* @param remoteDir
	* @throws IOException
	* @return void
	* @throws
	 */
	public static void scpPut(String ip, String userName, String password, String localFile, String remoteDir)
			throws IOException {
		logger.info("ConnectLinuxCommand  scpPut===" + "ip:" + ip + "  userName:" + userName + "  localFile:"
				+ localFile + "  remoteDir:" + remoteDir);
 
		RemoteConnect remoteConnect = new RemoteConnect();
		remoteConnect.setIp(ip);
		remoteConnect.setUserName(userName);
		remoteConnect.setPassword(password);
 
		if (login(remoteConnect)) {
			SCPClient client = new SCPClient(conn);
			client.put(localFile, remoteDir);
			conn.close();
		}
	}
}

如果涉及到多台服务器   A服务器1   B服务器2   C java客户端执行机
需要将文件从A复制到B  只需要  配置A和B进行密钥登陆   通过java shell  脚本直接执行

SCP  命令去进行服务器端的复制

你可能感兴趣的:(java,Linux,虚拟机)