(1)利用java程序执行sh 或java 的命令行指令
(2)利用java程序登陆到远端的主机,执行远端主机上sh或java命令
(3)利用java程序让后台执行命令,主程序可以直接返回
第一种情况的例子
/**
* 既可以用于linux也可以用于window
* <b>command。</b>
* <p><b>详细说明:</b></p>
* <!-- 在此添加详细说明 -->
* 无。
* @param command
*/
public static void command(String command){
try
{
Process process=new ProcessBuilder(Arrays.asList(command.split(" "))).start(); // \\s+
//标准输入流
BufferedReader result= new BufferedReader(new InputStreamReader(process.getInputStream()));
String s=result.readLine();
while(s!=null){
System.out.println(s);
s=result.readLine();
}
//标准错误输入流
BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
s=error.readLine();
while(s!=null){
System.err.println(s);
s=error.readLine();
}
} catch (Exception e)
{
//纠正
if(!command.startsWith("CMD /C")){
command("CMD /C "+command);
}else{
throw new RuntimeException(e.getMessage());
}
}
}
public static void main(String[] args) {
// OSExecuter.command("dir");
// OSExecuter.command("jps");
//昌平
// OSExecuter.command("java -cp /home/weblogic/test/1106_ftp.jar ftp.FtpUtil /home/weblogic/test/20171107_12.dat"); 从155ftp到205
//亦庄
// OSExecuter.command("java -cp /home/weblogic/test/1106_ftp.jar ftp.FtpUtil "+args[0]);从155ftp到205
// OSExecuter.command("java -cp /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/1106_test.jar ftp.FtpUtil /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/paratemer_js_files/" + args[0]);
// OSExecuter.command("java -cp /home/weblogic/app/ailkapp/alik-precisionMarket/local/1106_test.jar ftp.FtpUtil /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/paratemer_js_files/" + args[0]);
// OSExecuter.command("expect /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/yz.exp " + args[0]);
// OSExecuter.command("expect /home/weblogic/test/yz.exp " + args[0]);
OSExecuter.command("java -cp /home/weblogic/test/1106_bbb.jar test.OSExecuter 20171107_1510051884690.dat");
}
第二种情况的例子 需要依赖jar包
commons-io-2.4.jar
commons-lang-2.6.jar
ganymed-ssh2-build210.jar
//字符编码默认是utf-8
private static String DEFAULTCHART="UTF-8";
private Connection conn;
private String ip;
private String userName;
private String userPwd;
public RemoteExecuteCommand(String ip, String userName, String userPwd) {
this.ip = ip;
this.userName = userName;
this.userPwd = userPwd;
}
public RemoteExecuteCommand() {
}
/**
* 远程登录linux的主机
* @author Ickes
* @since V0.1
* @return
* 登录成功返回true,否则返回false
*/
public Boolean login(){
boolean flg=false;
try {
conn = new Connection(ip);
conn.connect();//连接
flg=conn.authenticateWithPassword(userName, userPwd);//认证
} catch (IOException e) {
e.printStackTrace();
}
return flg;
}
/**
* @author Ickes
* 远程执行shll脚本或者命令
* @param cmd
* 即将执行的命令
* @return
* 命令执行完后返回的结果值
* @since V0.1
*/
public String 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
*/
public String 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
* 以纯文本的格式返回
*/
private String processStdout(InputStream in, String charset){
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(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();
}
public static void setCharset(String charset) {
DEFAULTCHART = charset;
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public static void main(String[] args) {
// RemoteExecuteCommand rec=new RemoteExecuteCommand("192.168.238.133", "root","ickes");
// //执行命令
// System.out.println(rec.execute("ifconfig"));
// //执行脚本
// rec.execute("sh /usr/local/tomcat/bin/statup.sh");
// //这个方法与上面最大的区别就是,上面的方法,不管执行成功与否都返回,
// //这个方法呢,如果命令或者脚本执行错误将返回空字符串
// rec.executeSuccess("ifconfig");
RemoteExecuteCommand rec=new RemoteExecuteCommand("10.140.16.205", "ctgmkt","ctgmkt@123");
//执行命令
// System.out.println(rec.execute("ifconfig"));
//执行脚本
// String aa = args[0];
// rec.execute("java -cp /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/1106_test.jar ftp.FtpUtil /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/paratemer_js_files/"+aa);
//这个方法与上面最大的区别就是,上面的方法,不管执行成功与否都返回,
//这个方法呢,如果命令或者脚本执行错误将返回空字符串
// rec.executeSuccess("java -cp /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/1106_test.jar ftp.FtpUtil /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/paratemer_js_files/"+aa);
rec.executeSuccess("java -cp /home/ctgmkt/mktag_shell_file/model_outomatic_put_files/1106_FileDispatchMain.jar ftp.FileDispatchMain");
}
第三种情况的例子 这里的用法相对简单,当然也可以利用线程池的方式实现
public static void main(String[] args) {
Runtime rt = Runtime.getRuntime();
Process p = null;
String fileLac = "";
try {
fileLac = "java -cp /usr/local/test/1124_main.jar thread.Main";//要调用的程序路径
p = rt.exec(fileLac);
System.out.println("end tooooo");
} catch (Exception e) {
System.out.println("open failure");
}
}