一、

1、JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。

<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.53</version>
</dependency>

<dependency><groupId>com.github.cverges.expect4j</groupId><artifactId>expect4j</artifactId><version>1.9</version>
</dependency>

二、代码样例

参考链接:http://www.cnblogs.com/xuxiuxiu/p/6266583.html

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;import org.apache.log4j.Logger;
import org.apache.oro.text.regex.MalformedPatternException;import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;import expect4j.Closure;
import expect4j.Expect4j;
import expect4j.ExpectState;
import expect4j.matches.EofMatch;
import expect4j.matches.Match;
import expect4j.matches.RegExpMatch;
import expect4j.matches.TimeoutMatch;public class Shell {private static Logger log = Logger.getLogger(Shell.class);private Session session;private ChannelShell channel;private static Expect4j expect = null;private static final long defaultTimeOut = 1000;private StringBuffer buffer=new StringBuffer();public static final int COMMAND_EXECUTION_SUCCESS_OPCODE = -2;public static final String BACKSLASH_R = "\r";public static final String BACKSLASH_N = "\n";public static final String COLON_CHAR = ":";public static String ENTER_CHARACTER = BACKSLASH_R;public static final int SSH_PORT = 22;//正则匹配,用于处理服务器返回的结果public static String[] linuxPromptRegEx = new String[] { "~]#", "~#", "#",":~#", "/$", ">" };public static String[] errorMsg=new String[]{"could not acquire the config lock "};//ssh服务器的ip地址private String ip;//ssh服务器的登入端口private int port;//ssh服务器的登入用户名private String user;//ssh服务器的登入密码private String password;public Shell(String ip,int port,String user,String password) {this.ip=ip;this.port=port;this.user=user;this.password=password;expect = getExpect();}/*** 关闭SSH远程连接*/public void disconnect(){if(channel!=null){channel.disconnect();}if(session!=null){session.disconnect();}}/*** 获取服务器返回的信息* @return 服务端的执行结果*/public String getResponse(){return buffer.toString();}//获得Expect4j对象,该对用可以往SSH发送命令请求private Expect4j getExpect() {try {log.debug(String.format("Start logging to %s@%s:%s",user,ip,port));JSch jsch = new JSch();session = jsch.getSession(user, ip, port);session.setPassword(password);Hashtable<String, String> config = new Hashtable<String, String>();config.put("StrictHostKeyChecking", "no");session.setConfig(config);localUserInfo ui = new localUserInfo();session.setUserInfo(ui);session.connect();// 建立通信通道channel = (ChannelShell) session.openChannel("shell");Expect4j expect = new Expect4j(channel.getInputStream(), channel.getOutputStream());channel.connect();log.debug(String.format("Logging to %s@%s:%s successfully!",user,ip,port));return expect;} catch (Exception ex) {log.error("Connect to "+ip+":"+port+"failed,please check your username and password!");ex.printStackTrace();}return null;}/*** 执行配置命令* @param commands 要执行的命令,为字符数组* @return 执行是否成功*/public boolean executeCommands(String[] commands) {//如果expect返回为0,说明登入没有成功if(expect==null){return false;}log.debug("----------Running commands are listed as follows:----------");for(String command:commands){log.debug(command);}log.debug("----------End----------");Closure closure = new Closure() {public void run(ExpectState expectState) throws Exception {buffer.append(expectState.getBuffer());expectState.exp_continue();}};List<Match> lstPattern = new ArrayList<Match>();String[] regEx = linuxPromptRegEx;if (regEx != null && regEx.length > 0) {synchronized (regEx) {for (String regexElement : regEx) {try {RegExpMatch mat = new RegExpMatch(regexElement, closure);lstPattern.add(mat);} catch (MalformedPatternException e) {return false;} catch (Exception e) {return false;}}lstPattern.add(new EofMatch(new Closure() { public void run(ExpectState state) {}}));lstPattern.add(new TimeoutMatch(defaultTimeOut, new Closure() {public void run(ExpectState state) {}}));}}try {boolean isSuccess = true;for (String strCmd : commands){isSuccess = isSuccess(lstPattern, strCmd);}//防止最后一个命令执行不了isSuccess = !checkResult(expect.expect(lstPattern));//找不到错误信息标示成功String response=buffer.toString().toLowerCase();for(String msg:errorMsg){if(response.indexOf(msg)>-1){return false;}}return isSuccess;} catch (Exception ex) {ex.printStackTrace();return false;}}//检查执行是否成功private boolean isSuccess(List<Match> objPattern, String strCommandPattern) {try {boolean isFailed = checkResult(expect.expect(objPattern));if (!isFailed) {expect.send(strCommandPattern);expect.send("\r");return true;}return false;} catch (MalformedPatternException ex) {return false;} catch (Exception ex) {return false;}}//检查执行返回的状态private boolean checkResult(int intRetVal) {if (intRetVal == COMMAND_EXECUTION_SUCCESS_OPCODE) {return true;}return false;}//登入SSH时的控制信息//设置不提示输入密码、不显示登入信息等public static class localUserInfo implements UserInfo {String passwd;public String getPassword() {return passwd;}public boolean promptYesNo(String str) {return true;}public String getPassphrase() {return null;}public boolean promptPassphrase(String message) {return true;}public boolean promptPassword(String message) {return true;}public void showMessage(String message) {}}}

转载于:https://www.cnblogs.com/yufeng218/p/6551070.html

SSH登录到远程linux机器并执行命令相关推荐

  1. Pssh -- 使用单个终端在多个远程Linux服务器上执行命令

    OpenSSH毫无疑问是可用于Linux的使用最广泛和强大工具之一,它允许你通过一个shell安全地连接到远程Linux系统,并且允许你与远程系统之间来回传输文件. 但OpenSSH的最大缺点是你不同 ...

  2. java远程执行功能_Java远程连接Linux服务器并执行命令及上传文件功能

    Java远程连接Linux服务器并执行命令及上传文件功能 发布于 2020-3-6| 复制链接 摘记:  最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记.此种连接方法中有考虑到并 ...

  3. c 远程编辑linux文件,makefile - 在远程Linux机器上编译C ++ - “检测到时钟偏差”警告...

    makefile - 在远程Linux机器上编译C ++ - "检测到时钟偏差"警告 我通过PuTTY和WinSCP连接到我大学的小型Linux集群,使用后者传输文件,并使用前者编 ...

  4. 如何对linux文件进行编译,linux编译和执行命令都有哪些?该如何实现?

    我们知道,Linux是比如手机.平板电脑.路由器.台式计算机计算机设备的核心,它们都使用着Linux系统.以现在来说,一个合格的开发者必须要对Linux有一定的了解,那么,下面就跟小编一起来看看Lin ...

  5. linux 的中断 命令,linux skill命令参数及用法详解(linux中断进程执行命令)

    linux skill命令参数及用法详解(linux中断进程执行命令) 发布时间:2012-07-21 12:09:37   作者:佚名   我要评论 linux 冻结进程命令 skill 使用详解 ...

  6. Java实现通过ssh远程连接主机并执行命令

    需要用到的jar包: 主体代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

  7. 在Linux使用exec执行命令时报的哪些错

    问题1:find: paths must precede expression [root@localhost data]# find /oracle/backup/exp/data -name ex ...

  8. linux sudo不能执行命令,为什么linux中sudo执行会“找不到命令”

    sudo:command not found 在本地装了个Ubuntu虚拟机,golang环境搭好了并加入PATH环境变量,make编译源码时显示Permission denied,然后sudo执行编 ...

  9. python ssh远程连接服务器并执行命令或相关操作

    import paramikoclass SSHConnection:# 初始化连接创建Transport通道def __init__(self, host='127.0.0.1', port=22, ...

  10. linux开机自动执行命令或自动启动程序(rc.local)

    linux开机的最后会执行/etc/rc.local,因此可以在此脚本里面添加shell命令自动执行或者自动启动某个进程. 比如 自动输出信息: #!/bin/sh -e # # rc.local # ...

最新文章

  1. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...
  2. makefile中使用变量
  3. Codevs 1049 棋盘染色
  4. python extended,python list中的append 与 extended 的区别
  5. linux中memcpy实现分析,ARM64 的 memcpy 优化与实现
  6. Object类中hashCode()和equals()方法详解(附图)
  7. 带前后翻页的图片关东 js特效
  8. 紫色飞猪:基于K8s的集群稳定架构
  9. 附资料:工程总承包项目管理流程图(全套)
  10. Zemax OpticsBuilder
  11. 交互设计如何为业务赋能——谈谈网易严选企业采购的主页设计
  12. pc恶意程序木马分析 启动流程 逆向分析 数据解密
  13. javascript_video_2
  14. Activity、Service、子线程之间的消息传递轻松实现
  15. js splice的三个用法
  16. 中国象棋对局软件设计(一)
  17. SQL优化(三) 查询条件优化
  18. attiny13a程序实例_基于ATtiny13的手电筒(头灯)控制电路和程序
  19. python远程使用ants中的配准命令和N4biasfiledcorrection注意点
  20. Latex: 使 tabular 居中

热门文章

  1. NYOJ 2括号配对 栈的运用
  2. winform把html一起生成,联合 MSHTML 与 WebBrowser 生成美观实用的 WinForm 利用过程。...
  3. java输入语句buffer_Java输入流之BufferReader和Scanner的用法!
  4. 电脑用电量_为什么换了智能电表后,我家用电量一下子多了这么多呢?
  5. 翻译:protocol的高阶用法,在Swift 5中使用协议protocol构建自定义集合Collection
  6. Charles 4.2 HTTPS抓包,乱码设置,证书信任,证书安装
  7. php想做一个无刷新弹窗,php+ajax实现无刷新的新闻留言系统
  8. java为什么要连接Mysql_为什么要启动mysql workbech,java才能连接mysql数据库呢?
  9. 文字描边加粗_这些PPT描边字,效果好到没朋友~
  10. LeetCode--Reverse Integer(整数反转)Python