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 ...
随机推荐
- python day08作业答案
1. a f=open('11.txt','r',encoding='utf-8') a=f.read() print(a) f.flush() f.close() b. f=open('11.txt ...
- 【Python】多线程-3
#练习:线程等待 Event e.set() e.wait() from threading import Thread, Lock import threading import time ...
- 单交换机划分VLAN配置
实验要求:相同vlan的主机能够通信,不同vlan的主机不能通讯 拓扑如下: 涉及内容有: 1.端口trunk模式设置 2.VTP的创建和设置 3.vlan的划分 配置如下: A enable 进入特 ...
- shell 中变获取值及运算的几种方法
num=$(tail ./image/1.txt -n 1) num=$(($num+1))
- vim 使用 Tricks
vim + /etc/fstab:打开文档时直接光标直接置于最后一行首部: 1. 最小影响的修改:非 insert mode 修改 del/x:删除光标所在字符: r:replace,替换光标所在的字 ...
- sizeof和strlen区别(转)
char str[20]="0123456789"; int a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int ...
- [LeetCode&Python] Problem 606. Construct String from Binary Tree
You need to construct a string consists of parenthesis and integers from a binary tree with the preo ...
- File available()方法
File类中的length()方法与IO中InputStream类中的available()方法功能重复? 只是返回值类型不同 前者返回long后者返回int 但本质上都一样表示文件的字节数 a ...
- servlet简单介绍
什么是Servlet? servlet是一种Java编程语言类,用于扩展托管通过请求 - 响应编程模型访问的应用程序的服务器的功能.尽管servlet可以响应任何类型的请求,但它们通常用于扩展Web服 ...
- css实现三栏布局,两边定宽,中间自适应
1.利用定位实现 css代码如下: .box{overflow: hidden;height: 100px;margin: 10px 0;} .box>div{height: 100%;} #b ...