java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
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命令详解及实例相关推荐
- python调用shell脚本的参数_使用python执行shell脚本 并动态传参 及subprocess的使用详解
最近工作需求中 有遇到这个情况 在web端获取配置文件内容 及 往shell 脚本中动态传入参数 执行shell脚本这个有多种方法 最后还是选择了subprocess这个python标准库 subpr ...
- shell脚本中常见的一些特殊符号和作用详解
在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展eg: ls my_{finge ...
- Shell脚本自动源码包安装LA/NMP架构详解(赠软件包+脚本)
脚本环境 1.linux centos 7 系统 2.光盘镜像文件已挂载 3.系统可连接外网 4.软件包下载链接 lamp 链接:https://pan.baidu.com/s/1x6PTj_aUN2 ...
- 编写shell脚本实现自动化搭建安装LNMP平台全过程配置详解
注意:如果是输入的是字母的或者是输入等于0时,则会出现以下两种情况!!! 查看端口: 进到Nginx根目录查看创建好的测试网页: 注意:关闭防火墙或者设置防火墙规则!!! 访问Nginx网页: 访问P ...
- shell脚本【符号6】“!”重复执行先前命令/非/内部变量
这一篇博客会介绍"!"符号在不同情境下的使用 1.重复执行先前命令 2.逻辑非 3.作为shell内部变量 4.变量的间接引用 一.重复执行先前命令: ! 在bash中,为了重复执 ...
- java上传下载_Java文件上传与文件下载实现方法详解
本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传 ...
- ubant每30秒运行shell脚本_[mcj]Ubuntu系统定时执行bashshell命令|Ubuntu定时执行指定脚本...
Linux中,周期执行的任务一般由cron这个守护进程来处理.cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为"crontab",是& ...
- java return返回值_java中关于return返回值的用法详解
我们输入一个条件时,系统就会对这个条件进行判断,然后给出一个返回时的结论,我们把这个结果看做是返回值.在java里可以使用return语句来进行返回,从字面意思就能很好的理解它的用法了.下面我们就re ...
- java执行cmd命令详解
前言 Java应用程序主要是通过Runtime和Process两个类来执行cmd命令. Runtime.exec方法创建本机进程并返回Process子类的实例,该实例可用于控制进程并获取有关它的信息. ...
最新文章
- 解决Delphi7的自带的UTF-8编码转换函数BUG
- 有效可靠地管理大规模 Kubernetes 集群
- nyoj-469--擅长排列的小明 II
- 当SRS遇到K8s:如何实现高可用、回滚与灰度发布?
- 点击打开自己博客地址通过默认浏览器
- Hadoop Mapreduce分区、分组、二次排序过程详解
- 上传附件删除、session清空问题
- 开放共赢,华为云WeLink生态联盟正式成立!
- windows nginx 停止和启动_nginx在window与linux中启动、停止、与关闭
- 7z.exe 命令参数
- python迭代器、生成器和yield语句
- linux vim中文使用教程
- 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
- 常见乱码产生原因以及锟斤拷的产生过程
- 看完这篇,你一定会打开谷歌搜索...
- JAVA远程(ssh)执行linux脚本
- system data oracle,System.Data.OracleClient大全
- 计算机视觉方面相关项目,『哈尔滨985/211大学科研营』计算机视觉项目
- Java比较日期时间大小
- UX、UI、 IA和IxD