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 ...
随机推荐
- 2019-03-15-day011-递归生成器
函数的进阶: 动态参数: 两种: 动态位置参数 > 动态默认参数 打散(聚合): 实参处打散 形参处聚合 不在函数中第一次使用*打散,第二次是聚合 在数据库中快速写入数据的时候,**dic 名称 ...
- JAVA项目中的常用的异常处理
1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象 ...
- linux系统nginx的https的跳转
环境:系统ubuntu16 申请证书是腾讯云免费证书 首先我在安装nginx SSL证书的时候犯了个错误,nginx是需要安装SSl的模块不然没法配置完成.需要安装一个 http_ssl_module ...
- Ubuntu16.04安装OpenCV3.2以及PCL1.8
最近在学习slam14讲,需要配置一些环境<视觉slam十四讲> 这本书中已经给出如何配置相关环境的比较详细的说明,但是有些环境并无卵用,比如OpenCV以及PCL 这里给出自己屡试不爽的 ...
- Python用re正则化模块在字符串查找特定字符串
实验需要,在一个含有几亿个字符的txt文件中查找特定的字符串,首先用re模块进行查找 from time import clock import re start=clock() label_file ...
- 【算法】QuickSort
快速排序,时间复杂度O(N*logN),要能熟练掌握! 以下主要参考http://blog.csdn.net/morewindows/article/details/6684558, 感谢原博主! 该 ...
- input标签(图像域和隐藏域)
图像域(图像提交按钮): <input type="image" name="..." src="imageurl" /> 隐 ...
- HDU5658:CA Loves Palindromic (回文树,求区间本质不同的回文串数)
CA loves strings, especially loves the palindrome strings. One day he gets a string, he wants to kno ...
- sudo命令 和限制root 远程登陆
1.对sudo命令的配制,输入 visudo 然后,找到92行进行以下配制 以下就是效果 比如: 如果要同时给两个普通用户设置这样子的权限,就可以用另一种方式,下面这种方式不可取的 而是用这种 效果如 ...
- poj1504 Adding Reversed Numbers
Adding Reversed Numbers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17993 Accepted: 9 ...