java通过ssh连接服务器执行shell命令详解

java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。

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。

示例程序

package com.stormma.demo;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.ArrayList;

import com.jcraft.jsch.Channel;

import com.jcraft.jsch.ChannelExec;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.JSchException;

import com.jcraft.jsch.Session;

public class Shell {

//远程主机的ip地址

private String ip;

//远程主机登录用户名

private String username;

//远程主机的登录密码

private String password;

//设置ssh连接的远程端口

public static final int DEFAULT_SSH_PORT = 22;

//保存输出内容的容器

private ArrayList stdout;

/**

* 初始化登录信息

* @param ip

* @param username

* @param password

*/

public Shell(final String ip, final String username, final String password) {

this.ip = ip;

this.username = username;

this.password = password;

stdout = new ArrayList();

}

/**

* 执行shell命令

* @param command

* @return

*/

public int execute(final String command) {

int returnCode = 0;

JSch jsch = new JSch();

MyUserInfo userInfo = new MyUserInfo();

try {

//创建session并且打开连接,因为创建session之后要主动打开连接

Session session = jsch.getSession(username, ip, DEFAULT_SSH_PORT);

session.setPassword(password);

session.setUserInfo(userInfo);

session.connect();

//打开通道,设置通道类型,和执行的命令

Channel channel = session.openChannel("exec");

ChannelExec channelExec = (ChannelExec)channel;

channelExec.setCommand(command);

channelExec.setInputStream(null);

BufferedReader input = new BufferedReader(new InputStreamReader

(channelExec.getInputStream()));

channelExec.connect();

System.out.println("The remote command is :" + command);

//接收远程服务器执行命令的结果

String line;

while ((line = input.readLine()) != null) {

stdout.add(line);

}

input.close();

// 得到returnCode

if (channelExec.isClosed()) {

returnCode = channelExec.getExitStatus();

}

// 关闭通道

channelExec.disconnect();

//关闭session

session.disconnect();

} catch (JSchException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

return returnCode;

}

/**

* get stdout

* @return

*/

public ArrayList getStandardOutput() {

return stdout;

}

public static void main(final String [] args) {

Shell shell = new Shell("xxx.xxx.xxx.xxx", "username", "password");

shell.execute("uname -s -r -v");

ArrayList stdout = shell.getStandardOutput();

for (String str : stdout) {

System.out.println(str);

}

}

}

MyUserInfo

package com.stormma.demo;

import com.jcraft.jsch.UserInfo;

public class MyUserInfo implements UserInfo {

@Override

public String getPassphrase() {

// TODO Auto-generated method stub

System.out.println("MyUserInfo.getPassphrase()");

return null;

}

@Override

public String getPassword() {

// TODO Auto-generated method stub

System.out.println("MyUserInfo.getPassword()");

return null;

}

@Override

public boolean promptPassphrase(String arg0) {

// TODO Auto-generated method stub

System.out.println("MyUserInfo.promptPassphrase()");

System.out.println(arg0);

return false;

}

@Override

public boolean promptPassword(String arg0) {

// TODO Auto-generated method stub

System.out.println("MyUserInfo.promptPassword()");

System.out.println(arg0);

return false;

}

@Override

public boolean promptYesNo(String arg0) {

// TODO Auto-generated method stub'

System.out.println("MyUserInfo.promptYesNo()");

System.out.println(arg0);

if (arg0.contains("The authenticity of host")) {

return true;

}

return true;

}

@Override

public void showMessage(String arg0) {

// TODO Auto-generated method stub

System.out.println("MyUserInfo.showMessage()");

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例相关推荐

  1. python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解

    最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subpr ...

  2. shell脚本中常见的一些特殊符号和作用详解

    在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展eg: ls my_{finge ...

  3. Shell脚本自动源码包安装LA/NMP架构详解(赠软件包+脚本)

    脚本环境 1.linux centos 7 系统 2.光盘镜像文件已挂载 3.系统可连接外网 4.软件包下载链接 lamp 链接:https://pan.baidu.com/s/1x6PTj_aUN2 ...

  4. 编写shell脚本实现自动化搭建安装LNMP平台全过程配置详解

    注意:如果是输入的是字母的或者是输入等于0时,则会出现以下两种情况!!! 查看端口: 进到Nginx根目录查看创建好的测试网页: 注意:关闭防火墙或者设置防火墙规则!!! 访问Nginx网页: 访问P ...

  5. shell脚本【符号6】“!”重复执行先前命令/非/内部变量

    这一篇博客会介绍"!"符号在不同情境下的使用 1.重复执行先前命令 2.逻辑非 3.作为shell内部变量 4.变量的间接引用 一.重复执行先前命令: ! 在bash中,为了重复执 ...

  6. java上传下载_Java文件上传与文件下载实现方法详解

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传 ...

  7. ubant每30秒运行shell脚本_[mcj]Ubuntu系统定时执行bashshell命令|Ubuntu定时执行指定脚本...

    Linux中,周期执行的任务一般由cron这个守护进程来处理.cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为"crontab",是& ...

  8. java return返回值_java中关于return返回值的用法详解

    我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...

  9. java执行cmd命令详解

    前言 Java应用程序主要是通过Runtime和Process两个类来执行cmd命令. Runtime.exec方法创建本机进程并返回Process子类的实例,该实例可用于控制进程并获取有关它的信息. ...

最新文章

  1. 解决Delphi7的自带的UTF-8编码转换函数BUG
  2. 有效可靠地管理大规模 Kubernetes 集群
  3. nyoj-469--擅长排列的小明 II
  4. 当SRS遇到K8s:如何实现高可用、回滚与灰度发布?
  5. 点击打开自己博客地址通过默认浏览器
  6. Hadoop Mapreduce分区、分组、二次排序过程详解
  7. 上传附件删除、session清空问题
  8. 开放共赢,华为云WeLink生态联盟正式成立!
  9. windows nginx 停止和启动_nginx在window与linux中启动、停止、与关闭
  10. 7z.exe 命令参数
  11. python迭代器、生成器和yield语句
  12. linux vim中文使用教程
  13. 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
  14. 常见乱码产生原因以及锟斤拷的产生过程
  15. 看完这篇,你一定会打开谷歌搜索...
  16. JAVA远程(ssh)执行linux脚本
  17. system data oracle,System.Data.OracleClient大全
  18. 计算机视觉方面相关项目,『哈尔滨985/211大学科研营』计算机视觉项目
  19. Java比较日期时间大小
  20. UX、UI、 IA和IxD

热门文章

  1. 工厂模式——JavaScript
  2. Window.navigator
  3. ASP.NET MVC中如何实现页面跳转
  4. 算法导论-排序(四)计数排序(线性时间排序)
  5. C#自定义开关按钮控件--附带第一个私活项目截图
  6. MySQL之某个表中有近千万数据且CRUD访问缓慢的优化处理
  7. LeetCode Algorithm 572. 另一棵树的子树
  8. 教小学妹学算法:十大经典排序算法深度解析
  9. 大数据WEB阶段(五)jQuery
  10. 大数据WEB阶段(三)CSS