使用java批量生成Xshell session(*.xsh)文件

背景

工作中需要管理多套环境, 有时需要同时登陆多个节点, 且每个环境用户名密码都一样, 因此需要一个方案来解决动态的批量登录问题.

XShell

Xshellsession管理功能:

  1. 提供了包括记住登录主机、用户名、密码及登录时执行命令或脚本(js,py,vbs)的功能

  2. session被存储在xsh文件中, 默认的存储在%USERPROFILE%\Documents\NetSarang Computer\7\Xshell\Sessions文件夹下

  3. 使用xshell可以直接打开存储在xsh文件中的用户登录信息, 比如: /d/Program_Files/Xshell/Xshell 192.168.31.6.xsh

  4. xsh文件使用UTF-16LE编码

  5. xsh采用与ini相同的格式进行配置

  6. xsh有许多配置项, 这里列举比较重要的:

    1. [CONNECTION].Host: 登录用户名

    2. [CONNECTION:AUTHENTICATION].UserName: 登录用户名

    3. [CONNECTION:AUTHENTICATION].Password: 登录密码, 使用XShell自有加解密算法, 因此在生成时需要先根据加解密算法生成加密后的密码, 参考how-does-Xmanager-encrypt-password1, 我通过pyinstaller -F XShellCryptoHelper.py将其打包为exejava使用

    4. [CONNECTION:AUTHENTICATION].UseInitScript: 是否使用登录脚本, 1表示开启, 0表示不使用

      XShell同时提供了与expect一样的交互功能, 可以和脚本共同使用, 但由于脚本本身具备这种功能, 并且移植性好, 所以本文不考虑expect

    5. [CONNECTION:AUTHENTICATION].ScriptPath: 登录脚本存储位置

需求

通过java生成一个/d/test.xsh文件(能生成一个就能生成N个), 并且在登录的同时执行一个python脚本, 效果如下:

在这里插入图片描述

所需信息:

  1. 用户名root

  2. 密码test@2023

  3. 登录主机192.168.31.6

  4. 执行脚本D:\init.py:

    def Main():# 等待root用户登录成功xsh.Screen.WaitForString('#')xsh.Screen.Send("echo hello word\r")
    

思路

XShell提供了一个默认的session配置文件: %USERPROFILE%\Documents\NetSarang Computer\7\Xshell\Sessions\default:

  1. 读取它, 并且根据关键字一一替换:
    1. Host= -> Host=192.168.31.6
    2. UserName= -> UserName=root
    3. Password= -> Password=xxx, 这里根据自己生成的密码密文进行替换
    4. UseInitScript=0 -> UseInitScript=1
    5. ScriptPath= -> ScriptPath=D:\init.py
  2. 使用UTF-16LE进行编码并保存在/d/test.xsh
  3. 使用XShell /d/test.xsh进行测试, 成功登录并且打印出hello world即可

实现

使用java17进行编码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;public class Xsh {private static final String XSHELL_CRYPTO_HELPER_LOCATION = "D:/XShellCryptoHelper.exe";private static final String[] ENCRYPT_CMD = new String[]{"cmd", "/c", XSHELL_CRYPTO_HELPER_LOCATION, "-e", "test@2023"};private static final String DEFAULT_SESSION_LOCATION = System.getenv("USERPROFILE") + "\\Documents\\NetSarang Computer\\7\\Xshell\\Sessions\\default";private static final String TEST_XSH_LOCATION = "D:\\test.xsh";private static final String[] RUN_XSHELL_CMD = new String[]{"cmd", "/k", "start D:\\Program_Files\\Xshell\\XShell.exe " + TEST_XSH_LOCATION};public static void main(String[] args) throws IOException, InterruptedException {String xshContent = Files.readAllLines(Paths.get(DEFAULT_SESSION_LOCATION), StandardCharsets.UTF_16LE).stream().map(line -> {if (line == null || line.isBlank()) {return line;}return switch (line.trim()) {case "Host=" -> "Host=192.168.31.6";case "UserName=" -> "UserName=root";case "Password=" -> "Password=" + encrypt();case "UseInitScript=0" -> "UseInitScript=1";case "ScriptPath=" -> "ScriptPath=D:\\init.py";default -> line;};}).collect(Collectors.joining(System.lineSeparator()));Path path = Paths.get(TEST_XSH_LOCATION);Files.deleteIfExists(path);Files.writeString(path, xshContent, StandardCharsets.UTF_16LE);CompletableFuture.runAsync(() -> {try {Runtime.getRuntime().exec(RUN_XSHELL_CMD);} catch (IOException e) {throw new RuntimeException(e);}});TimeUnit.SECONDS.sleep(3);}private static String encrypt() {InputStream is = null;InputStreamReader isr = null;BufferedReader br = null;try {Process process = Runtime.getRuntime().exec(ENCRYPT_CMD);process.waitFor();is = process.getInputStream();isr = new InputStreamReader(is);br = new BufferedReader(isr);// 只有一行输出return br.readLine();} catch (Exception e) {throw new RuntimeException(e);} finally {try {br.close();isr.close();is.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

参考

  1. Using Script

  1. 本项目原作者很长时间没有更新, 本来不支持7.*版本的加密, 我参考XDecrypt项目对其进行了补充, 当前已支持XShell全系列加解密!! ↩︎

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

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

相关文章

[二分查找]LeetCode2009 :使数组连续的最少操作数

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552:优化了6版的1324模式 题目 给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。 如果 nums 满足以下条件,那么它是 连续的 …

勒索解密后oracle无法启动故障处理----惜分飞

客户linux平台被勒索病毒加密,其中有oracle数据库.客户联系黑客进行解密【勒索解密oracle失败】,但是数据库无法正常启动,dbv检查数据库文件报错 [oraclehisdb ~]$ dbv filesystem01.dbf DBVERIFY: Release 11.2.0.1.0 - Production on 星期一 11月 27 21:49:17 2023 Copyrig…

详解Spring中基于注解的Aop编程以及Spring对于JDK和CGLIB代理方式的切换

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

《管家婆》辉煌2005+(V4.0)简单教程

《管家婆》辉煌2005(V4.0)简单教程 呉師傅 运行环境:   操作系统推荐使用Win2000(32位)、WinXP(32位)、Win7(位) 兼容:Win7(64位&#xff09…

机器学习笔记 - 异常检测之OneClass SVM算法简述

一、异常检测是什么? 如下图,理想中我们可以找到一个框住大部分正常样本的决策边界,而在边界外部的数据点(蓝点)即视为异常。 但实际情况下数据都没有标签,因此很难定义正常还是不正常。异常检测的主要挑战如下:正常与异常行为之间的界限往往并不明确、不同的应…

一文搞懂设计模式之责任链模式

大家好,我是晴天。我们又见面了,本周我们继续学习设计模式,本周将同大家一起学习责任链模式。 场景引入 我们回想一下自己曾经经历过的考学场景,我们是如何一步一步考上大学的(为了简化过程只提取核心环节&#xff09…

Fiddler抓包工具之fiddler的命令行窗口用法

fiddler的命令行窗口的相关命令 在fiddler官网有QuickExec使用教程,地址是QuickExec Reference - Fiddler Classic QuickExec 命令行窗口位于fiddler左下角黑色输入框,如下图: 按ALT Q,将焦点快速设置到QuickExec框。如果Fiddl…

代码随想录第二十二天(一刷C语言)|组合总数电话号码的字母组合

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、组合总数 思路:参考carl文档和视频 1、需要一维数组path来存放符合条件的结果,二维数组result来存放结果集。 2、targetSum 目标和,也就是题目中的…

Python语言学习笔记之七(JOSN应用)

本课程对于有其它语言基础的开发人员可以参考和学习,同时也是记录下来,为个人学习使用,文档中有此不当之处,请谅解。 1、认识Json JSON (JavaScript Obiect Notation)是一种轻量级的数据交换格式,它是ECMAScript的一…

电源需要考虑的因素

做产品的都离不开电源,产品出问题也首先检查供电是否正常。今天给大家分享的是做好一个电源需要考虑哪些因素。 一. 描述输入电压影响输出电压几个指标形式 1. 稳压系数 A.稳压系数:表示负载不变时,稳压电源…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS (1)HTTP (2)HTTPS (3)HTTP与HTTPS区别 (4)HTTPS对HTTP的改进:双问的身份认证 三、TCP协议 (1)TCP三次握手…

vue项目node-sass^4.14.1 python gyp 报错解决办法

npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass/参考链接:链接

浅析 TLS(ECDHE)协议的握手流程(图解)

浅析 TLS(ECDHE)协议的握手流程(图解) 通过 wireshark 抓取 HTTPS 包,理解 TLS 1.2 安全通信协议的握手流程。 重点理解几个点: TLS 握手流程:通过 wireshark 抓取 HTTPS 包理解。协商加密&a…

一文解决msxml3.dll文件缺失问题,快速修复msxml3.dll

在了解问题之前,我们必须首先清楚msxml3.dll到底是什么。DLL(Dynamic Link Libraries)文件是Windows操作系统使用的一个重要组成部分,用于存储执行特定操作或任务的代码和数据。msxml3.dll为Windows系统提供处理XML文档的功能。如…

文件上传---阿里云OSS

1.注册阿里云账户(注册完成后需要实名认证) 2.注册完账号之后,就可以登录阿里云 3. 创建bucket 4.创建 AccesskeyId 选择自己的开发语言 5. 阿里云Oss工具类 package com.sky.utils;import com.aliyun.oss.ClientException; import com.ali…

Redis缓存的使用

什么是缓存 缓存就是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载提高读写效率,降低响应时间 缓存的成本: 数据一致性成本代码维护成本运维成本 Redis特点 键值型数据库…

Upsert 及冲突(GORM)

GORM支持了数据库的upsert操作 upsert操作对于插入一条数据而言的,如果插入数据之前,没有这条数据,则会插入该条数据;如果插入数据之前就存在这条数据(索引值),就更新这条记录。 创建结构体 …

基于景区智慧灯杆、智能指路牌基础设施的景区建设应用

智慧景区是指运用现代信息技术手段,将景区内的资源、服务、管理等进行数字化、网络化和智能化整合,打造出高效便捷、安全舒适、互动体验和可持续发展的景区。智慧景区可以从以下几个方面进行体现: 智慧导览:通过使用智能化的导览…

vue 解决响应大数据表格渲染崩溃问题

如果可以实现记得点赞分享,谢谢老铁~ 1.场景描述 发起请求获取上万条数据,进行表格渲染,使浏览器卡顿,导致网页崩溃。 2.分析原因 1.大量数据加载,过多操作Dom,消耗性能。 2.表格中包含其他…

Linux 基础认识

文章目录 前言Linux历史window历史Linux地位发行版本 前言 建议只看概述 Linux历史 概述: 由一个研究生受Minix操作系统启发编写的,因为功能实用,代码开源被世界人接收和开发 ,最终正式发布 。 详情: 1991年10月5日…