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 ...
随机推荐
- 利用itext生成pdf的简单例子
一.itext简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文 ...
- Java学习笔记8(面向对象3:接口)
接口的概念: 接口是功能的集合,同样可以看最做事一种数据类型,是比抽象类更为抽象的"类”. 接口之描述所应该具备的方法,并没有具体实现,具体的实现有接口的实现类(相当于接口的子类)来完成.这 ...
- mybatis Condition查询
Condition condition = new Condition(ACurrentTotal.class); condition.createCriteria().andCondition(&q ...
- C# 曲线控件 曲线绘制 实时曲线 多曲线控件 开发
Prepare 本文将使用一个NuGet公开的组件来实现曲线的显示,包含了多种显示的模式和配置来满足各种不同的应用场景,方便大家进行快速的开发系统. 在Visual Studio 中的NuGet管理器 ...
- HDU1754-I Hate It (线段树)
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...
- Fatal error: Call to undefined function mb_strlen()
php配置的时候出现:Fatal error: Call to undefined function mb_strlen() 表示php不能加载mbstring模块,在php 的配置文件php.in ...
- Python学习笔记第二十五周(Django补充)
1.render_to_reponse() 不同于render,render_to_response()不用包含request,直接写template中文件 2.locals() 如果views文件中 ...
- JavaBasic_10
JVM中的对一个对象的所有初始化动作,是javac在字节码文件中帮我们生成的 1.成员变量的显式初始化 2.初始化代码块(构造代码块) 3.构造方法 初始化静态的东西 在Java中,一个没有方法体的方 ...
- 各种浏览器兼容trim()的方法
一.利用while方法解决 function trim(str) { while (str[0] == ' ') { str = str.slice(1); } while (str[str.leng ...
- 51Nod 1084:矩阵取数问题 V2(多维DP)
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励 ...