java远程调用linux的命令或者脚本
Java通过SSH2协议执行远程Shell脚本(ganymed-ssh2-build210.jar)
使用步骤如下:
一、导ganymed-ssh2-build210.jar包
- <!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 -->
- <dependency>
- <groupId>ch.ethz.ganymed</groupId>
- <artifactId>ganymed-ssh2</artifactId>
- <version>build210</version>
- </dependency>
二、API说明
1. 首先构造一个连接器,传入一个需要登陆的ip地址
Connection conn = new Connection(hostname);
2. 模拟登陆目的服务器 传入用户名和密码
- //它会返回一个布尔值,true 代表成功登陆目的服务器,否则登陆失败
- boolean isAuthenticated = conn.authenticateWithPassword(username, password);
3. 打开一个session,有点象hibernate的session ,执行你需要的Linux 脚本命令 。
- Session sess = conn.openSession();
- sess.execCommand("last");
4. 接收目标服务器上的控制台返回结果,读取br中的内容
- InputStream stdout =newStreamGobbler(sess.getStdout());
- BufferedReader br =newBufferedReader(newInputStreamReader(stdout));
5.得到脚本运行成功与否的标志 :0-成功 非0-失败
- System.out.println("ExitCode: "+ sess.getExitStatus());
6.关闭session和connection
- sess.close();
- conn.close();
备注:
1.通过第2步认证成功后,当前目录就位于/home/username/目录之下,你可以指定脚本文件所在的绝对路径,或者通过cd导航到脚本文件所在的目录,然后传递执行脚本所需要的参数,完成脚本调用执行。
2.执行脚本以后,可以获取脚本执行的结果文本,需要对这些文本进行正确编码后返回给客户端,避免乱码产生。
3.如果你需要执行多个linux控制台脚本,比如第一个脚本的返回结果是第二个脚本的入参,你必须打开多个Session,也就是多次调用
Session sess = conn.openSession();,使用完毕记得关闭就可以了
三、实例代码,这个类可以直接拷贝过去用
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import org.apache.commons.lang.StringUtils;
- import ch.ethz.ssh2.Connection;
- import ch.ethz.ssh2.Session;
- import ch.ethz.ssh2.StreamGobbler;
- /**
- * 远程执行linux的shell script
- * @author Ickes
- * @since V0.1
- */
- publicclassRemoteExecuteCommand{
- //字符编码默认是utf-8
- privatestaticString DEFAULTCHART="UTF-8";
- privateConnection conn;
- privateString ip;
- privateString userName;
- privateString userPwd;
- publicRemoteExecuteCommand(String ip,String userName,String userPwd){
- this.ip = ip;
- this.userName = userName;
- this.userPwd = userPwd;
- }
- publicRemoteExecuteCommand(){
- }
- /**
- * 远程登录linux的主机
- * @author Ickes
- * @since V0.1
- * @return
- * 登录成功返回true,否则返回false
- */
- publicBoolean login(){
- boolean flg=false;
- try{
- conn =newConnection(ip);
- conn.connect();//连接
- flg=conn.authenticateWithPassword(userName, userPwd);//认证
- }catch(IOException e){
- e.printStackTrace();
- }
- return flg;
- }
- /**
- * @author Ickes
- * 远程执行shll脚本或者命令
- * @param cmd
- * 即将执行的命令
- * @return
- * 命令执行完后返回的结果值
- * @since V0.1
- */
- publicString execute(String cmd){
- String result="";
- try{
- if(login()){
- Session session= conn.openSession();//打开一个会话
- session.execCommand(cmd);//执行命令
- result=processStdout(session.getStdout(),DEFAULTCHART);
- //如果为得到标准输出为空,说明脚本执行出错了
- if(StringUtils.isBlank(result)){
- result=processStdout(session.getStderr(),DEFAULTCHART);
- }
- conn.close();
- session.close();
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- return result;
- }
- /**
- * @author Ickes
- * 远程执行shll脚本或者命令
- * @param cmd
- * 即将执行的命令
- * @return
- * 命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
- * @since V0.1
- */
- publicString executeSuccess(String cmd){
- String result="";
- try{
- if(login()){
- Session session= conn.openSession();//打开一个会话
- session.execCommand(cmd);//执行命令
- result=processStdout(session.getStdout(),DEFAULTCHART);
- conn.close();
- session.close();
- }
- }catch(IOException e){
- e.printStackTrace();
- }
- return result;
- }
- /**
- * 解析脚本执行返回的结果集
- * @author Ickes
- * @param in 输入流对象
- * @param charset 编码
- * @since V0.1
- * @return
- * 以纯文本的格式返回
- */
- privateString processStdout(InputStreamin,String charset){
- InputStream stdout =newStreamGobbler(in);
- StringBuffer buffer =newStringBuffer();;
- try{
- BufferedReader br =newBufferedReader(newInputStreamReader(stdout,charset));
- String line=null;
- while((line=br.readLine())!=null){
- buffer.append(line+"\n");
- }
- }catch(UnsupportedEncodingException e){
- e.printStackTrace();
- }catch(IOException e){
- e.printStackTrace();
- }
- return buffer.toString();
- }
- publicstaticvoid setCharset(String charset){
- DEFAULTCHART = charset;
- }
- publicConnection getConn(){
- return conn;
- }
- publicvoid setConn(Connection conn){
- this.conn = conn;
- }
- publicString getIp(){
- return ip;
- }
- publicvoid setIp(String ip){
- this.ip = ip;
- }
- publicString getUserName(){
- return userName;
- }
- publicvoid setUserName(String userName){
- this.userName = userName;
- }
- publicString getUserPwd(){
- return userPwd;
- }
- publicvoid setUserPwd(String userPwd){
- this.userPwd = userPwd;
- }
- }
测试代码:
- publicstaticvoid main(String[] args){
- RemoteExecuteCommand rec=newRemoteExecuteCommand("192.168.168.200","root","123456");
- //执行命令
- System.out.println(rec.execute("ifconfig"));
- //执行脚本
- rec.execute("sh /usr/local/tomcat/bin/statup.sh");
- //这个方法与上面最大的区别就是,上面的方法,不管执行成功与否都返回,
- //这个方法呢,如果命令或者脚本执行错误将返回空字符串
- rec.executeSuccess("ifconfig");
- }
需要导入的包:
- <!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 -->
- <dependency>
- <groupId>ch.ethz.ganymed</groupId>
- <artifactId>ganymed-ssh2</artifactId>
- <version>build210</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.5</version>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.6</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
如果是直接通过导jar包的,附百度云盘下载地址:链接:http://pan.baidu.com/s/1c2dr34 密码:g3l7
四、注意事项
执行命令的时候,比如:jps,Linux系统因为有环境变量,所以命令正确。但是如果是在java中远程调用Linux命令,
那么必须使用绝对路径,如:/usr/local/java/jdk1.8/bin/jps
java远程调用linux的命令或者脚本的更多相关文章
- Java远程调用Linux脚本
参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813 http://blog.csdn.net/a19881029/artic ...
- Java代码调用服务器上的Shell脚本
Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- PHP调用Linux的命令行执行文件压缩命令&&创建文件夹修改权限
一开始,我和普通青年一样,想到用PHP内置的 ZipArchive纠结的是环境上没安装zip扩展,想采用用PHP调用Linux的命令行 ,执行压缩命令,感兴趣的朋友可以了解下,希望本文对你有所帮助 前 ...
- linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)
程序猿都非常懒,你懂的! 近期在开发中,须要用到server的ip和mac信息.可是server是架设在linux系统上的,对于多网口,在获取ip时就产生了非常大的问题.以下是在windows系统上, ...
- linux——常用命令与脚本
linux常用命令 --文件管理pwd --查看当前目录cd --切换当前目录ls --列出当前目录下的所有文件touch --创建文件mkdir --建立目录rmdir --删除空目录rm --删除 ...
- Java远程调用邮件服务器,实现邮件发送
写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器. 邮件服 ...
- Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)
转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...
- java 远程调用 RPC
1. 概念 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).H ...
随机推荐
- linux各种系统下载地址
1.Arch Linux Arch Linux在安装过程中提供了强大的可定制选择,支持你下载和安装自己所需的程序包.虽然这个选择对新手来说没有多大的帮助,但是它确实能够帮助那些使用Arch构建系统和存 ...
- 50_流程控制函数-case结构
case函数的使用一:switch case 的效果 /* Java中 switch(变量或表达式){ case 常量1:语句1:break: ... default:语句n;break; } MyS ...
- 【Python】一些零散的练习
#练习:subprocess模块来产生子进程 import subprocess obj = subprocess.Popen(["python"], stdin=subproce ...
- lintcode 刷题 by python 部分链表题总结(2)
本篇博客对最近做的链表的算法题做个简单的小结,主要描述题目和提供解题思路,具体代码见我的 github:https://github.com/MUSK1881/lintcode-by-python 3 ...
- scala quick check
Scala 特性 面向对象特性 函数式编程 Scala也是一种函数式语言,其函数也能当成值来使用.Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化.Sca ...
- TensorRT caffemodel serialize
1.TensorRT的需要的文件 需要的基本文件(不是必须的) 1>网络结构文件(deploy.prototxt) 2>训练的权重模型(net.caffemodel) TensorRT 2 ...
- js 下载文件的操作方法
https://blog.csdn.net/zhoumengshun/article/details/71405963
- djangorestful framework (三)学习
十.分页器 -简单分页: -from rest_framework.pagination import PageNumberPagination -生成一个对象 -调用对象的.page.paginat ...
- 对中文进行MD5加密的注意事项(Java版,编码问题)
http://blog.csdn.net/tongdao/article/details/20690187 在工作中需要和第三方进行Http通信,在通信内容中有几个参数涉及到了中文.自己在进行MD5加 ...
- 【BZOJ4817】【SDOI2017】树点染色
不算学会lct...... 原题: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种 ...