http://www.ganymed.ethz.ch/ssh2/

此程序的目的是执行远程机器上的Shell脚本。

【环境参数】

远程机器IP:172.17.24.212

用户名:root

密码:zhenchaowen

Shell脚本的路径:/home/IFileGenTool /BakProvisionAndOccurEntrance.sh

【具体步骤】

1、在远程机器上,准备Shell脚本。

[root@localhost IFileGenTool]# vim ./load_data.sh

#!/bin/sh

source /etc/profile

dbName=$1

tableName=$2

echo [`date +'%Y-%m-%d %H:%M:%S'`]' start loading data...'

mysql -uroot -p123456 -P3306 ${dbName} -e "LOAD DATA LOCAL INFILE '/home/IFileGenTo    ol_ZhangJian/bak_data/t_acc_subject_provision_data_bak.txt' INTO TABLE ${tableName}     FIELDS TERMINATED BY ';'"

echo [`date +'%Y-%m-%d %H:%M:%S'`]' end loading data...'

exit

EOF

2、导入需要依赖的jar包。

Java远程调用Shell脚本这个程序需要ganymed-ssh2-build210.jar包。

下载地址:http://www.ganymed.ethz.ch/ssh2/

为了调试方便,可以将\ganymed-ssh2-build210\src下的代码直接拷贝到我们的工程里,

此源码的好处就是没有依赖很多其他的包,拷贝过来干干净净。

<dependency>

<groupId>org.jvnet.hudson</groupId>

<artifactId>ganymed-ssh2</artifactId>

<version>build210-hudson-1</version>

</dependency>

3、编写RemoteShellExecutor工具类。

import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;

import ch.ethz.ssh2.ChannelCondition;

import ch.ethz.ssh2.Connection;

import ch.ethz.ssh2.Session;

import ch.ethz.ssh2.StreamGobbler;

public class RemoteShellExecutor {

private Connection conn;

/** 远程机器IP */

private String ip;

/** 用户名 */

private String osUsername;

/** 密码 */

private String password;

private String charset = Charset.defaultCharset().toString();

private static final int TIME_OUT = 1000 * 5 * 60;

/**

* 构造函数

* @param ip

* @param usr

* @param pasword

*/

public RemoteShellExecutor(String ip, String usr, String pasword) {

this.ip = ip;

this.osUsername = usr;

this.password = pasword;

}

/**

* 登录

* @return

* @throws IOException

*/

private boolean login() throws IOException {

conn = new Connection(ip);

conn.connect();

return conn.authenticateWithPassword(osUsername, password);

}

/**

* 执行脚本

*

* @param cmds

* @return

* @throws Exception

*/

public int exec(String cmds) throws Exception {

InputStream stdOut = null;

InputStream stdErr = null;

String outStr = "";

String outErr = "";

int ret = -1;

try {

if (login()) {

// Open a new {@link Session} on this connection

Session session = conn.openSession();

// Execute a command on the remote machine.

session.execCommand(cmds);

stdOut = new StreamGobbler(session.getStdout());

outStr = processStream(stdOut, charset);

stdErr = new StreamGobbler(session.getStderr());

outErr = processStream(stdErr, charset);

session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);

System.out.println("outStr=" + outStr);

System.out.println("outErr=" + outErr);

ret = session.getExitStatus();

} else {

throw new Exception("登录远程机器失败" + ip); // 自定义异常类 实现略

}

} finally {

if (conn != null) {

conn.close();

}

IOUtils.closeQuietly(stdOut);

IOUtils.closeQuietly(stdErr);

}

return ret;

}

/**

* @param in

* @param charset

* @return

* @throws IOException

* @throws UnsupportedEncodingException

*/

private String processStream(InputStream in, String charset) throws Exception {

byte[] buf = new byte[1024];

StringBuilder sb = new StringBuilder();

while (in.read(buf) != -1) {

sb.append(new String(buf, charset));

}

return sb.toString();

}

public static void main(String args[]) throws Exception {

RemoteShellExecutor executor = new RemoteShellExecutor("172.17.24.212", "root", "zhenchaowen");

// 执行myTest.sh 参数为java Know dummy

System.out.println(executor.exec("/home/IFileGenTool/load_data.sh t_users myDataBase01"));

}

}

4、运行结果

outStr=java Know 3

outErr=

0 // getExitStatus方法的返回值

注:一般情况下shell脚本正常执行完毕,getExitStatus方法返回0。

此方法通过远程命令取得Exit Code/status。但并不是每个server设计时都会返回这个值,如果没有则会返回null。

在调用getExitStatus时,要先调用WaitForCondition方法,通过ChannelCondition.java接口的定义可以看到每个条件的具体含义。见以下代码:

ChannelCondition.java的源代码

备注:

https://github.com/super-d2/remoteShell

java的remote shell的更多相关文章

  1. JAVA远程执行Shell脚本类

    1.java远程执行shell脚本类 package com.test.common.utility; import java.io.IOException; import java.io.Input ...

  2. paip. java resin 远程 调试 java resin remote debug

    paip. java resin 远程 调试 java resin remote debug 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 ...

  3. 使用Apache Felix Remote Shell远程管理OSGI

    通过Apache Felix Remote Shell提供的org.apache.felix.shell.remote能使用telnet客户端访问远程的[Apache Felix Shell]和[Ap ...

  4. java 调用bash shell脚本阻塞的小问题的解决

    java  调用bash shell脚本阻塞的小问题的解决 背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结 ...

  5. Java中执行shell笔记

    在java中执行shell有好几种方式:第一种(exec)方式一 public static synchronized void runshell2() {    File superuser = n ...

  6. linux 下启动java jar包 shell

    linux 下启动java jar包 shell #!/bin/sh JAVA_HOME=/usr/local/jdk1.6.0_34/bin/javaJAVA_OPTS="-Xmx256m ...

  7. linux 下停止java jar包 shell

    linux 下停止java jar包 shell http://injavawetrust.iteye.com #!/bin/sh APP_HOME=/home/ap/injavawetrust/ba ...

  8. Windows Remote Shell(WinRM)使用介绍

    最近,为了实验我们安装了台Windows Server Core的服务器,没有图形界面的系统总会给人一种很完全的感觉,我们本着安全到底的想法,使用了Windows Remote Shell 的管理方式 ...

  9. Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

    本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...

随机推荐

  1. Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。

    ######Nginx配置文件nginx.conf中文详解######定义Nginx运行的用户和用户组user www www;#nginx进程数,建议设置为等于CPU总核心数.worker_proc ...

  2. Xcode 生成静态库相关设置:

    Xcode 生成静态库相关设置: #Build Setting1. Architectures ------- Architectures -----> $(ARCHS_STANDARD) -- ...

  3. 玩QQ游戏,见到好几个图像是美女的QQ,就不始玩

    玩QQ游戏,见到好几个图像是美女的QQ,光占坑就是不开始玩 加了一个,发现是传播不良网站的QQ 聊天还是自动的 估计是利用webqq写的程序,也就那几句话来回重复,让你去注册网站什么 可以加这个Q去体 ...

  4. HTTP返回码中301与302的区别 (转载)

    一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved). 302 ...

  5. NOIP2016滚粗计

    啦啦啦,第一次写游记~ Day0 早上浪浪浪,开了几盘CS 坐车到衢州,在车上开了几盘 艾萨克,然而好困啊…… 到衢二后围观XJ杭二合力A ztr,不是很懂为什么事情会变成这样 晚上开杀人游戏,wcz ...

  6. Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)

    错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...

  7. JavaScript 常用正则表达式

    ==========================正则表达式=========================== 常用元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划 ...

  8. Android插件化框架研究-DroidPlugin

    直接贴上我做的ppt.

  9. 人工智能 启发式算法(A,A*)

    启发式算法区别于盲目搜索算法,是搜索策略的一种.主要特点是 可以利用问题自身的一些特征信息(启发式信息)来指导搜索的过程,从而可以缩小搜索范围,提高搜索效率. 实际上,启发式算法也代表了"大 ...

  10. 【TIP】已经上架的app在AppStore上搜不到的解决办法

    相信很多人都遇到过这个问题,天天刷iTunes connect,终于发现app已经上架了,兴奋的跑过去告诉老板,老板说好,大家都装一个吧!然后大家过来问你怎么搜不到,老板看你都是一副这个表情:   这 ...