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

2023-11-06

使用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  命令去进行服务器端的复制

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java ssh 密钥方式上传和操作远程服务器 的相关文章

  • 如何停止使用扫描仪从标准输入读取多行?

    我正在做一个 JAVA 作业 应该处理多行输入 指令显示 输入是从标准输入读取的 给出了示例输入的示例 one 1 two 2 three 3 我不明白上面的示例输入 从标准输入读取 是什么意思 这是我编写的一个测试程序 它可以消除我的困惑
  • 想要从java中的char数组创建字符流

    我想从 char 数组构造一个流以使用 java 8 功能 例如过滤器和映射 char list a c e Stream
  • 限制 JPQL 中的结果数量

    如何限制从数据库检索结果的数量 select e from Entity e I need only 10 results for instance 您可以尝试像这样给出 10 个要显式获取的结果 entityManager createQ
  • 如何修复maven错误JAVA_HOME环境变量未正确定义

    当我在虚拟环境中检查maven的版本时 出现以下错误 The JAVA HOME environment variable is not defined correctly This environment variable is need
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 使用java在网页中进行字符编码

    如何使用java找出网页中的字符编码类型 打开与 URL 的连接 使用URL openConnection http download oracle com javase 6 docs api java net URL html openC
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 如何将测试类打包到jar中而不运行它们?

    我正在努力将我的测试类包含到 jar 包中 但不运行它们 经过一番谷歌搜索后 我尝试过mvn package DskipTests 但我的测试类根本没有添加到 jar 中 有任何想法吗 如果您遵循 Maven 约定 那么您的测试类位于src
  • 在Java中将日期“2020-05-22T12:51:20.765111Z”解析为Instant [重复]

    这个问题在这里已经有答案了 如何解析 2020 05 22T12 51 20 732111Z Java 中的 Instant I used LocalDateTime parse startTime DateTimeFormatter of
  • Java8 项目上的 SonarQube 给出 jacoco-Exception

    我刚刚下载了最新版本 SonarQube 4 3 然后尝试使用以下命令构建 java 8 项目 mvn clean install mvn sonar sonar 这给了我下面的例外 谷歌搜索 我的印象是这是一个早期的问题 应该已经解决 h
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java 常量枚举[重复]

    这个问题在这里已经有答案了 可能的重复 理解 Java 中的枚举 https stackoverflow com questions 1419835 understanding enums in java 为什么我们应该使用枚举而不是 Ja
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • 内部类的访问修饰符[重复]

    这个问题在这里已经有答案了 可能的重复 受保护 公共内部类 https stackoverflow com questions 595179 protected public inner classes 我确信这个问题已经被问过 但我找不到
  • 检查 Java 字符串实例是否可能包含垃圾邮件数据的最简单方法

    我有一个迭代 String 实例的过程 每次迭代对 String 实例执行很少的操作 最后 String 实例被持久化 现在 我想为每次迭代添加一个检查 String 实例是否可能是垃圾邮件的检查 我只需验证 String 实例不是 成人材
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • Apifox自动生成接口文档

    1 安装 1 1 Apifox安装 官方文档 Apifox API 文档 调试 Mock 测试一体化协作平台 接口文档工具 接口自动化测试工具 接口Mock工具 API文档工具 API Mock工具 API自动化测试工具 1 2 IDEA
  • 结构体对齐计算方式

    目录 法则一 结构体成员的偏移量必须是成员大小的整数倍 数组除外 法则二 结构体大小必须是所有成员大小的整数倍 数组 结构体除外 带数组的结构体大小计算 带结构体的结构体大小计算 带联合体的结构体大小计算 pragma pack 4 向4对
  • Django模板的使用

    模板文件夹在工程目录下 配置路径 测试 视图 路由 模板 测试 查询数据返回显示在模板中 视图 模板 测试
  • AR开发 - 入门笔记

    文章目录 C C 基础 环境编程 C C 进阶 性能优化 图像处理库 OpenCV 图形学和 OpenGL 深度学习推理库 ncnn GUI框架imgui 多视图几何与 SLAM Unity AR 教程 C C 基础 语法 C99 C 03
  • 前、后端登录验证逻辑

    一 前端先进行第一层校验 前端主要做一些格式的校验 比如用户名 密码的输入符不符合规范 是否为空 验证码输入是否正确 一般验证码的校验在前端 如果验证码都不匹配的话 则不需要调用登录接口 直接return 如果后端给的是图片地址 也可以放在
  • C++中双括号初始化问题

    在刷题时用到了一个栈 网上参考了答案无意中发现了这个双大括号初始化的方法 查阅后发现java有这种用法 说其这本质上是匿名内部类加实例化代码块 但这边个跟类有什么关系 嗯 又想到明明之前用到栈的时候并没有初始化 于是再次定义了一个未初始化的
  • 13. 集群安全

    文章目录 K8S安全机制说明 Authentication 认证 HTTPS 证书需要认证的节点 两种类型 安全性说明 证书颁发 Kubeconfig ServiceAccount Secret 与 SA 的关系 Authorization
  • 【AI面试】降低过拟合的方式方法横评探究

    对于一个 训练调参工程师 来说 在训练过程遇到过拟合现象 是常事 当然 如何降低过拟合 也是在面试过程中 经常被面试官问到的问题 没啥可问的 就只能这样问了 以下是我们会常考虑常事使用的解决方法 按照重要程度依次排列 数据增强 Data A
  • [离散数学]命题逻辑P_3:命题符号化及其应用

    离散数学 命题逻辑P 3 命题符号化及其应用 前言 1 命题联结词的总结 命题联结词 命题联结词的真值表 例子 2 命题联结词的优先级 优先级顺序 例子 3 复合命题符号化 例子 4 联结词应用 开关电路 逻辑电路 网页检索 位运算 总结
  • MYSQL:事务

    事务 理解事务 事务操作 案例 事务的特性 事务的隔离级别 事务的隔离级别 操作 在MySQL中的事务 Transaction 是由存储引擎实现的 在MySQL中 只有InnoDB存储引擎才支持事务 事务处理可以用来维护数据库的完整性 保证
  • 大中型企业网项目实战2021-10-07

    1 问答题 大中型企业网项目实战 实验作业 一 安全管理 1 依据图中拓扑 为全网设备定义主机名 关闭域名解析 并在 Console 和VTY 线路下关闭线路超时并开启输出同步 依据图中拓扑在GNS3 IOU中搭建企业网 外链图片转存失败
  • 小程序封装form表单

    小程序封装form表单 在小程序中 表单是开发中最常用的组件之一 表单可以接收用户的输入数据 并提交给服务器进行处理 为了提高表单的复用性和减少代码重复 我们可以考虑对表单进行封装 使得表单可以在不同的页面中进行复用 本文将分享如何在小程序
  • 查看Linux系统信息

    1 登录到linux服务器执行 lsb release a 命令 即可查看所有版本信息 这个命令适用于所有的linux 包括Redhat SuSE Debian等发行版 注意 centos需要安准lsb LSB是一套核心标准 它保证了LIN
  • dubbo源码实践-serialize层的例子

    目录 1 serialize层概述 2 序列化的简单例子 2 1 项目截图 2 2 三个类的源码 2 2 1 ABC是实体类 2 2 2 TestSeriarsWrite把ABC对象序列化到文件中 2 2 3 TestSeriarsRead
  • Linux内核——cli()和sti()——标志寄存器的中断标志

    cli 和sti 有点类似于汇编指令中的CLI和STL 当某个任务在执行的过程中不想被中断 则可以在任务的开始出执行cli 在任务的结束处执行sti 恢复中断的执行 为了避免竞争条件和中断对临界代码区的干扰 在Linux 0 12内核代码中
  • IDEA中使用Junit测试

    文章目录 一 创建一个Maven项目 二 在Maven项目中添加JUnit依赖 三 创建测试类 一 创建一个Maven项目 二 在Maven项目中添加JUnit依赖 在pom xml中添加JUnit依赖
  • 【图解】用虚拟机做服务器

    最近在学nodejs 不知道有没有人跟我有一样的困惑 每次学新东西配置实验环境都是个麻烦事 其实也没那么麻烦 主要是当自己的电脑装了一堆环境 一堆IDE后 总会变得臃肿不堪 而且经常遇到莫名其妙的问题 解决麻烦 还容易造成系统的不稳定 而且
  • 支付宝支付回调代码(验签,订单状态,金额,appid等校验),支付, 提现相关demo

    1 支付回调 注意金额 用字符串 否则容易失真 验证失败 RequestMapping callBack public JSONMessage payCheck HttpServletRequest request HttpServletR
  • hadoop-3.0.0完整版HA部署

    一 环境准备 Linux7 2 hadoop 3 0 0 tar gz JDK1 8 二 下载源 hadoop3 0 0下载地址 https archive apache org dist hadoop common zookeeper 3
  • java ssh 密钥方式上传和操作远程服务器

    使用ssh公共密钥身份验证连接到远程系统是一种健壮 安全的替代使用帐户密码或密码登录方法 ssh公钥认证依赖于生成一对单独的密钥 即密钥对 一个 私有 和另一个 公共 的非对称密码算法 将私钥保密并将其存储在用来连接远程系统的计算机上 公钥