Java实践 — SSH远程执行Shell脚本

Java通过ssh连接服务器 Java ssh连接服务器 阅读详情

Java实践 — SSH远程执行Shell脚本http://

原文地址: http://blog.youkuaiyun.com/jmyue/article/details/14003783      作者:supereagle

1. SSH简介

        SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议。SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接。SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基于密码的认证比较简单,只要知道远程主机的用户名和密码,就可以进行登录。基于密匙的认证比较麻烦,而且连接比较耗时,这里不详细介绍。
        有很多基于SSH协议的客户端,例如: PuTTY、 OpenSSH、Xshell 4等,可以远程连接几乎所有UNIX平台。同时,可以通过Linux命令行ssh uername@host连接到某主机。
        在项目中,如何利用代码实现SSH,远程执行Shell脚本呢?JSch是Java Secure Channel的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考 JSch官网。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包: jsch-0.1.50.jar。

2. 实现原理

        1. 根据远程主机的IP地址,用户名和端口,建立会话(Session);
        2. 设置用户信息(包括密码和Userinfo),然后连接session;
        3. 在session上建立指定类型的通道(Channel),本文示例中采用ChannelExec类型的;
        4. 设置channel上需要远程执行的Shell脚本,连接channel,就可以远程执行该Shell脚本;
        5. 可以读取远程执行Shell脚本的输出,然后依次断开channel和session的连接。

3. 示例代码及分析

  • SSHCommandExecutor.java:
[java]  view plain copy
  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3. import java.util.Vector;  
  4.   
  5. import com.jcraft.jsch.Channel;  
  6. import com.jcraft.jsch.ChannelExec;  
  7. import com.jcraft.jsch.JSch;  
  8. import com.jcraft.jsch.JSchException;  
  9. import com.jcraft.jsch.Session;  
  10.   
  11. /** 
  12.  * This class provide interface to execute command on remote Linux. 
  13.  */  
  14.   
  15. public class SSHCommandExecutor {  
  16.     private String ipAddress;  
  17.   
  18.     private String username;  
  19.   
  20.     private String password;  
  21.   
  22.     public static final int DEFAULT_SSH_PORT = 22;  
  23.   
  24.     private Vector<String> stdout;  
  25.   
  26.     public SSHCommandExecutor(final String ipAddress, final String username, final String password) {  
  27.         this.ipAddress = ipAddress;  
  28.         this.username = username;  
  29.         this.password = password;  
  30.         stdout = new Vector<String>();  
  31.     }  
  32.   
  33.     public int execute(final String command) {  
  34.         int returnCode = 0;  
  35.         JSch jsch = new JSch();  
  36.         MyUserInfo userInfo = new MyUserInfo();  
  37.   
  38.         try {  
  39.             // Create and connect session.  
  40.             Session session = jsch.getSession(username, ipAddress, DEFAULT_SSH_PORT);  
  41.             session.setPassword(password);  
  42.             session.setUserInfo(userInfo);  
  43.             session.connect();  
  44.   
  45.             // Create and connect channel.  
  46.             Channel channel = session.openChannel("exec");  
  47.             ((ChannelExec) channel).setCommand(command);  
  48.   
  49.             channel.setInputStream(null);  
  50.             BufferedReader input = new BufferedReader(new InputStreamReader(channel  
  51.                     .getInputStream()));  
  52.   
  53.             channel.connect();  
  54.             System.out.println("The remote command is: " + command);  
  55.   
  56.             // Get the output of remote command.  
  57.             String line;  
  58.             while ((line = input.readLine()) != null) {  
  59.                 stdout.add(line);  
  60.             }  
  61.             input.close();  
  62.   
  63.             // Get the return code only after the channel is closed.  
  64.             if (channel.isClosed()) {  
  65.                 returnCode = channel.getExitStatus();  
  66.             }  
  67.   
  68.             // Disconnect the channel and session.  
  69.             channel.disconnect();  
  70.             session.disconnect();  
  71.         } catch (JSchException e) {  
  72.             // TODO Auto-generated catch block  
  73.             e.printStackTrace();  
  74.         } catch (Exception e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.         return returnCode;  
  78.     }  
  79.   
  80.     public Vector<String> getStandardOutput() {  
  81.         return stdout;  
  82.     }  
  83.   
  84.     public static void main(final String [] args) {  
  85.         SSHCommandExecutor sshExecutor = new SSHCommandExecutor("xx.xx.xx.xx", "username", "password");  
  86.         sshExecutor.execute("uname -s -r -v");  
  87.           
  88.         Vector<String> stdout = sshExecutor.getStandardOutput();  
  89.         for (String str : stdout) {  
  90.             System.out.println(str);  
  91.         }  
  92.     }  
  93. }  
        getSession()只是创建一个session,需要设置必要的认证信息之后,调用connect()才能建立连接。
        调用openChannel(String type) 可以在session上打开指定类型的channel。该channel只是被初始化,使用前需要先调用connect()进行连接。
        Channel的类型可以为如下类型:
  • shell - ChannelShell 
  • exec - ChannelExec 
  • direct-tcpip - ChannelDirectTCPIP 
  • sftp - ChannelSftp 
  • subsystem - ChannelSubsystem
        其中,ChannelShell和ChannelExec比较类似,都可以作为执行Shell脚本的Channel类型。它们有一个比较重要的区别:ChannelShell可以看作是执行一个交互式的Shell,而ChannelExec是执行一个Shell脚本。
  • MyUserInfo:
[java]  view plain copy
  1. import com.jcraft.jsch.UserInfo;  
  2.   
  3. /** 
  4.  * This class provide interface to feedback information to the user. 
  5.  */  
  6. public class MyUserInfo implements UserInfo {  
  7.     private String password;  
  8.   
  9.     private String passphrase;  
  10.   
  11.     @Override  
  12.     public String getPassphrase() {  
  13.         System.out.println("MyUserInfo.getPassphrase()");  
  14.         return null;  
  15.     }  
  16.   
  17.     @Override  
  18.     public String getPassword() {  
  19.         System.out.println("MyUserInfo.getPassword()");  
  20.         return null;  
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean promptPassphrase(final String arg0) {  
  25.         System.out.println("MyUserInfo.promptPassphrase()");  
  26.         System.out.println(arg0);  
  27.         return false;  
  28.     }  
  29.   
  30.     @Override  
  31.     public boolean promptPassword(final String arg0) {  
  32.         System.out.println("MyUserInfo.promptPassword()");  
  33.         System.out.println(arg0);  
  34.         return false;  
  35.     }  
  36.   
  37.     @Override  
  38.     public boolean promptYesNo(final String arg0) {  
  39.         System.out.println("MyUserInfo.promptYesNo()");  
  40.         System.out.println(arg0);  
  41.         if (arg0.contains("The authenticity of host")) {  
  42.             return true;  
  43.         }  
  44.         return false;  
  45.     }  
  46.   
  47.     @Override  
  48.     public void showMessage(final String arg0) {  
  49.         System.out.println("MyUserInfo.showMessage()");  
  50.     }  
  51. }  
        MyUserInfo实现了接口UserInfo,主要是为获得运行执行的用户信息提供接口。大部分实现方法中,没有做实质性的工作,只是输出一下trace信息,帮助判断哪个方法被执行过。

4. 执行结果分析

        1. 如果不设置UserInfo,会抛出JSchException异常,提示找不到host:


        2. 如果MyUserInfo实现了接口UserInfo,但是只是@Override一些函数,会出现如下错误:


             虽然可以找到host,但是会拒绝访问host。发现所有@Override函数中,get方法返回的都是null,prompt方法返回的都是false。

        3. 为了判断这些Override的methods中,那些是有用的,在每个method中加入trace信息。发现只有promptYesNo(final String)会被调用到,输出如下图所示:


        4. promptYesNo(final String)是向用户提出一个yes或者no的问题,来决定是否允许连接远程主机。这才是决定连接是否成功的一个关键函数。如果返回值为true,则允许连接;如果返回值为false,则拒绝连接。最后正确连接后的输出入下图所示:


Reference

        JSch官网 
        JSch API


Java远程执行Shell指令 JSch(Java Secure Channel)是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,进而使用端口转发,X11转发,文件传输等等功能。在前面的博客里,有介绍到如何使用JSch实现SFTP的相关操作,本文这里主要介绍如何利用JSch进行远程Shell操作。 软硬件环境说明:Windows10、IntelliJ IDEA、SpringBoot 2.1.... 阅读详情

相关推荐

简单实用!shell脚本实现ssh远程链接的三种方法

请将${REMOTE_U​SER}和${REMOTE_IP}替换为实际的远程电脑用户名和IP地址。这个命令会要求你输入远程电脑的密码。请确保将REMOTE_IP、REMOTE_USER和REMOTE_PASSWORD变量替换为实际的远程电脑IP地址、用户名和密码。请确保将REMOTE_IP和REMOTE_USER变量替换为实际的远程电脑IP地址和用户名。当运行此脚本时,系统会提示输入远程电脑的密码,输入密码后,将成功连接到远程电脑。按照提示操作,可以选择默认的文件路径和空密码。id_rsa(私钥)

ericdowney 1万+

java实现ssh登录linux并执行命令的三种方法

Java 实现ssh连接远程服务器的方法

小李的专栏 1万+

在Linux下利用SSHPASS自动执行远程脚本

sshpass 是一个用于自动化地通过命令行输入密码来执行 SSH 命令的工具。它简化了自动脚本的编写,使得无须人工干预即可执行需要认证的 SSH 操作。对于需要定期执行的远程管理任务来说,这是一个非常实用的工具。在使用sshpass与环境变量结合的同时,还有一种更为安全的方法是使用加密文件。可以将密码或密钥文件进行加密处理,只有需要时才进行解密使用。这里推荐使用GnuPG作为加密工具,它是一种广泛使用的开源加密软件。

weixin_35750953的博客 1178

java远程调用 shell_Java实践 — SSH远程执行Shell脚本

SSHCommandExecutor.java:import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Vector;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch....

weixin_31360095的博客 512

Java操作Linux服务器的简易指南

SSH框架是一种用于Java平台的开源框架,它整合了Struts、Spring和Hibernate三个开源框架,以提供一套完整的Java EE Web应用程序的解决方案。SSH框架将Web层、业务逻辑层和数据访问层分离,使得Java开发人员可以更加高效地构建企业级应用。

weixin_34064233的博客 1082

Jsch批量执行多条命令,包含切换用户输入密码

参考expect4j的交互式操作方式控制输入输出流实现批量执行多条shell命令同时支持切换用户输入密码提权执行命令输入密码等操作 有完整的测试用例,便于理解 模板化执行命令示例 [$]send[su - root] [Password:]password[123456] [#]send[cd /etc] [#]send[] [#]send[] [#]send[exit] [$]send[exit] 具体模板参数意义下载解压缩后查看batch.list中有解释

Java实践 — SSH远程执行Shell脚本(转)

原文地址:http://www.open-open.com/lib/view/open1384351384024.html 1. SSH简介 SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议。SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接。SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基...

weixin_30325971的博客 121

详解Java使用Jsch与sftp服务器实现ssh免密登录

主要介绍了详解Java使用Jsch与sftp服务器实现ssh免密登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

java调用本地及远程shell脚本

文章目录场景:需求:方法:java调用本地shell脚本java通过ssh方式调用远程shell脚本安全注意 场景: 在linux服务器上有这样一个脚本文件 /home/xxxx/my_script/run_dev_job_etl_usermonitor_task_list.sh 需求: 在java代码中直接调用此sh脚本文件 方法: 定义一个接口 com.xxx.service.ShellService java调用本地shell脚本 @Override public int exec(String[]

u013905744的专栏 2178

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式】

解压激活工具 →连接数据线 轻松搞定激活!

Amy_mumu的博客 142万+

主流仿真软件Sigrity/HFSS/Siwave/Hyperlynx/ADS差异

在电子设计自动化(EDA)领域,各种仿真软件如Cadence Sigrity、Mentor Graphics的HyperLynx、Keysight的ADS以及ANSYS的SIwave等,都广泛应用于不同的应用场景中。综上所述,这些EDA仿真软件在各自的应用场景中发挥着重要作用,帮助工程师在设计阶段就能够评估和优化电子产品的性能,提高设计的可靠性和效率。:Sigrity由全球最大的EDA公司Cadence推出,Cadence还推出了Orcad和Allegro等著名软件。:由安捷伦(现是德科技)公司开发。

Geektec的专栏 9406

Java通过SSH2协议执行远程Shell脚本

Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar) 该工具Jar包可在:http://www.ganymed.ethz.ch/ssh2/下载 ganymed-ssh2简介: Ganymed SSH-2

ANLJF的专栏 5778

CDH Hue连接Hbase报错TSocket read 0 bytes

问题描述 安装好CDH集群后,在Hue中查看HBase信息时,Hue界面报错如下: Api 错误:TSocket read 0 bytes Hue日志报错: exceptions_renderable ERROR Potential trace: [('/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hue/apps/hbase/src/hbase/api.py', 46, 'query', 'return getattr(self

邢为栋 3493

java实现远程执行Linux下的shell脚本

最近有个项目,需要在Linux下的服务器内写了一部分Python脚本,业务处理却是在Java内,那么就想能不能在Java里面,来远程执行Linux下的Python脚本,就是把shell命令写到Java里面。我们想要去执行Linux下的shell命令,那我们第一步的操作就是应该去连接服务器,先和服务器打通才能进行下一步。如果想要执行的输出结果的话,我们可以加上InputStream输出流,来确认是否执行成功。当我们连接上服务器后,我们就需要打开一个Session,来执行我们的脚本shell命令。

热爱技术,享受生活 3万+

【CODESYS】-软件Bug与处理方法(20240710更)

【CODESYS】-软件Bug与处理方法(不定期更新)

qq_35316470的博客 5186

Java程序SSH远程执行Shell脚本

转载自http://www.open-open.com/lib/view/open1384351384024.html

綦侬BLOG 4338

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

shell脚本ssh到远程服务器并执行命令

shell远程执行:   经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。 前提条件:   配置ssh免密码登陆 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,...

微信公众号:一颗向上的草莓 9356

Linux内核模块开发实战指南(2025版)

2025年Linux内核模块开发迎来革命性突破!本文将从零开始手把手教你构建可动态加载的AI加速驱动模块,揭秘最新内核特性与开发技巧,更包含独家性能调优方案与跨架构移植秘籍。文末附赠价值百万的调试脚本,助你轻松突破开发瓶颈!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1810

倍福---EL2262模块飞拍配置

控制器安装了twincat3,用EL2262实现相机飞拍功能。本文档只介绍如何通过EL2262实现飞拍的触发,并不涉及视觉方面的处理 参考文章: https://author.baidu.com/home?from=bjh_article&app_id=1669190598708386 https://mp.weixin.qq.com/s/r4Iq8kOP-o4_M8vCce5M9g 1、 飞拍的应用 在大多数场合,只能当被检测工件和相机都处于静止状态下才能进行拍照,拍照完成后,再移动工件或相机,进

weixin_41883890的博客 3743

Java SSH远程执行Shell脚本实现

此程序需要ganymed-ssh2-build210.jar包。 下载地址:http://www.ganymed.ethz.ch/ssh2/ 为了调试方便,可以将\ganymed-ssh2-build210\src下的代码直接拷贝到我们的工程里, 此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净。 此程序的目的是执行远程机器上的Shell脚本。 远程机器IP:***.**.**

zhouyh7的专栏 1523

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: secureCRT端口转发功能突破防火墙限制
下一篇: postgreSQL jdbc(java连接)
achang21
博客等级 码龄21年 269粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值