SSH登录到远程linux机器并执行命令
一、
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) { }
} }
SSH登录到远程linux机器并执行命令的更多相关文章
- 新建用户无法通过SecureSRT进行ssh登录到远程linux (zz)
root新建了一个普通用户oracle,并且设置了密码:通过SecureSRT连接远程linux,连不上[注:用的是之前新建过的以root为用户名的SecureSRT已有连接,如192.168.1.1 ...
- jenkins:用jenkins通过ssh部署jar包到远程linux机器(jdk 15 / jenkins 2.257)
一,远程linux机器上安装java15(如已安装,跳过此步) 说明:演示用的linux机器ip: 192.168.1.47 1,下载: [root@blog ~]# cd /usr/local/so ...
- 用python登录远程salt,并执行命令
用python操作saltstack,如果是在本地,则可以用python的salt模块,但如果要操作远程saltstack,则不行,今天就来看看怎么操作. 用python操作远程的saltstack, ...
- ssh远程连接linux服务器并执行命令
详细方法: SSHClient中的方法 参数和参数说明 connect(实现ssh连接和校验) hostname:目标主机地址 port:主机端口 username:校验的用户名 password:登 ...
- SSH只能用于远程Linux主机?那说明你见识太小了!
开源Linux 长按二维码加关注~ 今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章.本文从SSH是什么出发,讲述了SSH的基本用法,之后在远程登录.端口转发等多种场景下进行独立的讲述,希望能 ...
- 使用VNC远程linux机器
一,在Windows机器上下载vnc客户端 vnc viewer是一款vnc远程客户端,可以很方便的从Windows机器远程安装了图形界面和vnc服务器的linux机器. 从官网下载https://w ...
- linux shell并发执行命令
一般我们在linux上十一shell命令的批量执行操作,一般使用for或者while 循环进行操作,但是这样有一个问题,for或者while本质上是串行的,并不能,如果某一个命令执行耗费的时间比较长, ...
- Jmeter中使用SSH插件,连接远程linux机器执行命令
一.Why 在云主机测试中,需要使用SSH协议连接云主机进行相关操作 在python中使用paramiko库很好实现,在如果要使用jmeter做性能测试时,怎么做? 二.解决 既然原生jmeter没有 ...
- Window ssh免密登录到远程Linux服务器
SSH采用的是”非对称密钥系统”,即耳熟能详的公钥私钥加密系统. 1. 基于口令的安全验证 这种方式使用用户名密码进行联机登录,一般情况下我们使用的都是这种方式.整个过程大致如下: (1)客户端发起连 ...
随机推荐
- 编写函数digit(num, k),函数功能是:求整数num从右边开始的第k位数字的值,如果num位数不足k位则返回0。
function digit(num,k){ var knum = 0; for(var i=1; i<=k; i++){ knu ...
- HTML5 新特性(一)
1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...
- ftps加密服务器
咱不废话,理论不提,直接上步骤,[linux下的ftps服务器系统搭建步骤如下,按此步骤,即可搭建ftps服务器系统] 1.[安装vsftpd] yum -y install vsftpd 2.[安装 ...
- python入门-文件
1 读取文件 with open('1.txt') as file_ojbect: contents = file_ojbect.read() print(contents.rstrip()) wit ...
- 代码:css小图标
向下小箭头 .icon-tip{ border-color: transparent transparent #bb0808 transparent; border-style:solid; bord ...
- phpExcel中文帮助手册
phpExcel中文帮助手册 Admin 2011年11月13日 名人名言:上人生的旅途吧.前途很远,也很暗.然而不要怕.不怕的人的面前才有路.——有岛武郎 下面是总结的几个应用办法 include ...
- 9. MyEclipse中的SVN操作手册
该文章转载出处:http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html 1.导入项目 点击工具栏上的[File-Import],进入下图 (如果你的 ...
- Spring 配置 web.xml (防止spring 内存溢出)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " ...
- 4.Spring中使用Log4j
转自:https://blog.csdn.net/luohai859/article/details/52250807 这里要实现web项目中利用Spring来使用Log4j (1)接上面的工程,然后 ...
- php 3DES|DES 加密解密(通用)
<?php //set_include_path(get_include_path().PATH_SEPARATOR.'phpseclib'); include('Crypt/DES.php') ...