JAVA执行shell命令小工具
May 28, 2014
在我们的项目中,大部分环境的服务器用的都是Linux,从而使用JAVA与Linux shell通讯,就成了一项很常见的事情。
Ganymed SSH是一个Java实现SSH的项目
Java 实现SSH协议的项目有很多,如JFTP,trilead SSH,JSCH,ganymed SSH等
下面我们主要说的是关于ganymed SSH的一些小使用。
Ganymed SSH-2 for Java是用纯Java实现SSH-2协议的一个项目。可以通过它直接在Java程序中连接SSH服务器,实现基于SSH协议的服务访问。 如远程命令执行和shell访问,本地和远程端口转发,本地数据流转发,X11转发,SCP,SFTP等功能。
散仙测试的demo如下:
package com.qin.shell; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.mortbay.log.Log; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; public class ExecShell{ private String IP;//要远程登录的IP地址 private String username;//用户名 private String password;//密码 public ExecShell(String IP, String username,String password){ this.IP=IP; this.username=username; this.password=password; } //命令执行 public boolean exec( String command ) throws InterruptedException{ Log.info("command: "+command); boolean rtn = false; try { Connection conn = new Connection(IP); conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false){ throw new IOException("Authentication failed."); } Session sess = conn.openSession(); sess.execCommand(command); InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); InputStream stderr = new StreamGobbler(sess.getStderr()); BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr)); String line = null; while ( (line = br.readLine())!=null ) { Log.info("GanyMedUtil out> "+line); } while (true) { line = stderrReader.readLine(); if (line == null) break; Log.info("GanyMedUtil out> "+line); } /* Show exit status, if available (otherwise "null") */ Log.info("ExitCode: " + sess.getExitStatus()+" "+IP+":"+command); sess.close(); conn.close(); rtn = new Integer(0).equals(sess.getExitStatus()); return rtn; } catch (IOException e) { Log.warn("Error ......................",e); e.printStackTrace(); System.exit(2); return rtn; } } public static void main(String[] args) throws InterruptedException { ExecShell es = new ExecShell("192.168.75.130","root","dongliang"); System.out.println("==========================================单个命令测试执行=========================================="); es.exec("ls");//执行单行命令 System.out.println("==========================================多个命令测试执行=========================================="); es.exec("cd /root/apache-nutch-1.8/ && ls && date");//多个命令之间使用&&隔开 //ganyMedUtil.execMoreShellCommand(""); //ganyMedUtil.exec("ls"); } }
输出的内容如下所示:
2014-05-28 15:27:19.076:INFO::Logging to STDERR via org.mortbay.log.StdErrLog 2014-05-28 15:27:19.076:INFO::command: ls 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> 2 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> abc.txt 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> anaconda-ks.cfg 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-ant-1.9.2 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-ant-1.9.2-bin.tar.gz 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-nutch-1.8 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> apache-nutch-1.8-src.zip 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> a.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> bb.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> b.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> case.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> cip.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> c.sh 2014-05-28 15:27:19.454:INFO::GanyMedUtil out> date 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> d.sh 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> e.sh 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> f.sh 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia_20140327155418.zip 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-devel-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmetad-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmond-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-gmond-python-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> ganglia-web-3.1.7-3.el6.rf.x86_64.rpm 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> gg.sh 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> hadoop1.2 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> hadoop-1.2.0.tar.gz 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> installganglia.sh 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> install.log 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> install.log.syslog 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jdk1.7 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jdk-7u51-linux-x64.tar.gz 2014-05-28 15:27:19.455:INFO::GanyMedUtil out> jmxtrans-20121016.145842.6a28c97fbb-0.noarch.rpm 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libconfuse-2.7-6.2.x86_64.rpm 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libevent-2.0.21-stable 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> libevent-2.0.21-stable.tar.gz 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> memcached-1.4.15 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> memcached-1.4.15.tar.gz 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> my.sh 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> pp 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> solr-4.3.1.tgz 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> test.jar 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> test.py 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> zookeeper 2014-05-28 15:27:19.456:INFO::GanyMedUtil out> zookeeper.zip 2014-05-28 15:27:19.456:INFO::ExitCode: 0 192.168.75.130:ls ==========================================多个命令测试执行========================================== 2014-05-28 15:27:19.458:INFO::command: cd /root/apache-nutch-1.8/ && ls && date 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> bb.sh 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> build 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> build.xml 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> CHANGES.txt 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> conf 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> default.properties 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> docs 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> ivy 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> lib 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> LICENSE.txt 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> NOTICE.txt 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> README.txt 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> runtime 2014-05-28 15:27:19.789:INFO::GanyMedUtil out> src 2014-05-28 15:27:19.790:INFO::GanyMedUtil out> 2014年 05月 28日 星期三 23:27:19 CST 2014-05-28 15:27:19.790:INFO::ExitCode: 0 192.168.75.130:cd /root/apache-nutch-1.8/ && ls && date
能够在在应用程序中,执行shell脚本是非常有用的,我们可以自己写一个shell脚本,把多个shell命令,封装起来,然后执行一次shell即可。
(原文链接)
0 Comments