Jsch实践(二):JSch的HostKeyRepository接口如何使用

Jsch实践(二):JSch的HostKeyRepository接口如何使用

JSch 的 HostKeyRepository 接口用于存储和验证远程服务器的 SSH 主机密钥。当连接到一个新的远程服务器时,JSch 会请求服务器的主机密钥,并期望用户确认是否接受这个密钥。在生产环境中,你不应该每次都接受一个新的主机密钥,因为这可能是一个中间人攻击的标志。相反,你应该使用一个 HostKeyRepository 来存储之前接受过的密钥,并自动验证后续的连接。

下面是一个简单的示例,展示了如何使用 JSch 的 HostKeyRepository 接口来存储和验证主机密钥:

import com.jcraft.jsch.*;  import java.util.Properties;  public class JschHostKeyRepositoryExample {  public static void main(String[] args) {  String host = "your.remote.host";  int port = 22;  String user = "your_username";  String password = "your_password";  JSch jsch = new JSch();  // 使用一个自定义的 HostKeyRepository  jsch.setHostKeyRepository(new MyHostKeyRepository());  Session session = null;  try {  session = jsch.getSession(user, host, port);  session.setPassword(password);  // 设置严格的主机密钥检查  Properties config = new Properties();  config.put("StrictHostKeyChecking", "yes");  session.setConfig(config);  // 连接到服务器  session.connect();  // 打开一个执行命令的通道  ChannelExec channelExec = (ChannelExec) session.openChannel("exec");  InputStream in = channelExec.getInputStream();  // 设置命令,这里假设脚本有执行权限  channelExec.setCommand("sh " + scriptPath);  // 连接到远程命令的输入/输出/错误流  channelExec.connect();  // 读取命令输出  byte[] tmp = new byte[1024];  while (true) {  while (in.available() > 0) {  int i = in.read(tmp, 0, 1024);  if (i < 0) break;  System.out.print(new String(tmp, 0, i));  }  if (channelExec.isClosed()) {  if (in.available() > 0) continue;  System.out.println("exit-status: " + channelExec.getExitStatus());  break;  }  try {  Thread.sleep(1000);  } catch (Exception ee) {  // 忽略  }  }  // 断开连接  channelExec.disconnect();   // 断开连接  session.disconnect();  } catch (JSchException e) {  e.printStackTrace();  } finally {  if (session != null && session.isConnected()) {  session.disconnect();  }  }  }  static class MyHostKeyRepository implements HostKeyRepository {  // 使用一个内部存储来保存主机密钥  private final java.util.HashMap<String, HostKey> hostKeys = new java.util.HashMap<>();  @Override  public HostKey check(String host, Session session) {  // 检查我们是否之前存储了这个主机密钥  return hostKeys.get(host);  }  @Override  public void add(HostKey hostkey, String host) {  // 添加新的主机密钥到存储中  hostKeys.put(host, hostkey);  }  @Override  public void remove(String host, String type) {  // 根据主机和类型移除主机密钥,这里我们简化处理,不实现这个方法  }  @Override  public void remove(String host) {  // 根据主机移除主机密钥,这里我们简化处理,不实现这个方法  }  @Override  public String getHostKeyAlias(String host) {  // 获取主机密钥的别名,这里我们简化处理,不实现这个方法  return null;  }  @Override  public void setHostKeyAlias(String host, String alias) {  // 设置主机密钥的别名,这里我们简化处理,不实现这个方法  }  }  
}

在上面的代码中,你需要替换your.remote.host、your_username、your_password和/path/to/your/script.sh为实际的远程服务器地址、用户名、密码和脚本路径。

注意:

  • “StrictHostKeyChecking”, “no” 设置为 no 意味着在连接过程中不会检查远程主机密钥的合法性。在生产环境中,这是一个不安全的做法,因为它容易受到中间人攻击。你应该使用JSch的HostKeyRepository接口来安全地存储和验证主机密钥。

  • 这个示例没有处理异常或错误,只是简单地将它们打印到控制台。在实际的应用程序中,你应该根据需要对异常和错误进行适当处理。

  • 如果你的脚本需要输入参数,你可以将它们附加到setCommand方法的字符串中,例如channelExec.setCommand(“sh " + scriptPath + " arg1 arg2”)。

  • 在实际部署时,密码不应硬编码在代码中,而应该使用环境变量、配置文件或安全的密钥管理系统来管理。

  • 确保远程服务器上的脚本具有执行权限,否则脚本无法运行。你可以使用chmod +x /path/to/your/script.sh命令来添加执行权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决C#连接MySQL数据库报错: SslMode=None;

2024/3/12 13:30:30_Program:中文提示 : 连接数据库过程中发生错误&#xff0c;检查服务器是否正常连接字符串是否正确&#xff0c;错误信息&#xff1a;Couldnt connect to serverDbType"MySql";ConfigId"". English Message : Connection open error . …

01、JS实现:去除数组中重复项的算法之一

数组去除重复项的算法&#xff1a; Ⅰ、删除排序数组中的重复项(注意&#xff1a;是已经排好序的)&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅳ、小结&#xff1a; Ⅰ、删除排序数组中的重复项(注意&#xff1a;是已经排好序的)&…

【OceanBase诊断调优】 —— 敏捷诊断工具obdiag一键收集诊断信息实践

最近总结一些诊断OCeanBase的一些经验&#xff0c;出一个【OceanBase诊断调优】专题&#xff0c;也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 obdiag定位为OceanBase敏捷诊断工具。整体使用上备以下的特点&#xff1a; 部署简单&#xff1a;提供rpm包和OBD上部署的模…

ConcurrentHashMap 为什么不能插入 null?

1、典型回答 简单来说&#xff0c;ConcurrentHashMap 不允许插入 null 值是JDK 源码规定的&#xff0c;如下源码所示(此源码基于JDK 1.8)&#xff1a; 从上述源码可以看出&#xff0c;在添加方法的第一句就加了判断&#xff1a;如果 key 值为 null 或者是 value 值为 null&…

齐聚“向上的力量”,维谛技术(Vertiv)2024年合作伙伴大会成功举办

3月13日&#xff0c;维谛技术&#xff08;Vertiv&#xff0c;NYSE&#xff1a;VRT&#xff09;2024年合作伙伴大会在广东佛山顺利召开&#xff0c;本次大会以“向上的力量”为主题&#xff0c;维谛技术与数百家优秀合作伙伴&#xff08;含港台&#xff09;欢聚一堂&#xff0c;…

【25届秋招备战C++】算法篇-贪心算法(Greedy)

【25届秋招备战C】算法篇-贪心算法 一、简介二、解题思路三、应用场景四、模板函数五、参考 一、简介 一种在每次决策时&#xff0c;总是采取在当前状态下的最好选择&#xff0c;从而希望导致结果是最好或最优的算法。通常用于解决一些最优化问题&#xff0c;如找零问题、霍夫…

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404解决方法

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404&#xff0c;或者域名后带路径参数刷新就报404 解决方法&#xff1a; 宝塔中站点配置修改&#xff1a;【配置文件】中添加下面代码&#xff0c;具体如图&#xff1a; location / {try_files $uri $uri/ /index.html…

【MySQL 系列】MySQL 引擎篇

存储引擎是 MySQL 的组件&#xff0c;用于处理不同表类型的 SQL 操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以获得特定的功能。 文章目录 1、MySQL 引擎介绍1.1、MySQL 引擎介绍1.2、常见引擎及其区别和…

Editor.md-编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda&#xff0c;恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件&#xff0c;将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议&#xff1a;文件传输的桥梁 在数字化时代&#xff0c;文件传输协议&#xff08;FTP&#xff09;是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件&#xff0c;无论是上传还是下载&#xff0c;都提供了一种稳定且高效的方式。本文将深…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

macOS 安装使用 python 虚拟机

在macOS上安装Conda的步骤相对简单。Conda通常通过Anaconda或Miniconda进行安装&#xff0c;Anaconda是一个包含了Conda、Python和许多科学包及其依赖的发行版&#xff0c;而Miniconda则是一个更轻量级的版本&#xff0c;只包含Conda和Python。以下是在macOS上安装Anaconda的步…

Spring Boot启动时执行初始化操作的几种方式

场景 项目中&#xff0c;经常需要在启动过程中初始化一些数据&#xff0c;如从数据库读取一些配置初始化&#xff0c;或从数据库读取一些热点数据到redis进行初始化缓存。 方式一:实现CommandLineRunner 接口重写run方法逻辑 CommandLineRunner是Spring提供的接口&#xff0…

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们&#xff0c;今天给大家分享一篇stack、queue模拟…

数据库学习案例20240311 -mysql xtrabackup 备份与恢复

下载使用 Software Downloads - Percona 下载需要的依赖包 yum install perl-DBI -y yum install perl-DBD-MySQL -y yum install perl-Time-HiRes -y yum install perl-IO-Socket-SSL -y yum install perl-TermReadKey.x86_64 -y 下载安装配置完环境变量&#xff0c;然后做…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 &#xff1a; 主要是下面这段代码&#xff1a; "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…

Clickhouse 单机部署安装

前言 在大数据的时代背景下&#xff0c;数据的处理和分析能力成为企业竞争力的关键。ClickHouse&#xff0c;作为一款由俄国Yandex公司开发的分布式数据分析型数据库&#xff0c;凭借其卓越的性能和稳定性&#xff0c;赢得了业界的广泛关注。本文将介绍ClickHouse的基本概念、…

Qt/QML编程之路:基于QWidget编程及各种2D/3D/PIC绘制的示例(45)

关于使用GWidget,这里有一个示例,看了之后很多图形绘制,控件使用,及最基本的QWidget编程都比较清楚了。ui的绘制: 运行后的界面如 工程中有非常丰富的关于各种图形的绘制,比如上图中circle,还有image。有下面一段readme的说明: # EasyQPainter Various operation pra…

回到街头 - 数字时尚嘉年华:Web3的时尚未来,4月香港兰桂坊盛大启幕

随着区块链技术的不断发展&#xff0c;Web3世界正在逐渐改变我们的生活方式。作为这一变革的重要推动者&#xff0c;Vertex Labs荣幸地宣布&#xff0c;将在香港举办一场前所未有的“回到街头-数字时尚嘉年华”。这不仅是一场时尚与科技的完美结合&#xff0c;更是全球顶级IP和…