Java-web项目如何远程调用shell脚本

发布于 2017-01-04 00:13:39 字数 71 浏览 1505 评论 3

如题,A服务器上运行的web项目如何去远程调用B服务器上的上的shell脚本?比如
/opt/test/test.sh

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泛泛之交 2017-07-22 13:56:18

我在openwrt环境下做的实验:这里的openwrt就相当于你问题中的B端

openwrt上部署有uhttpd服务器,web目录为/www/cgi-bin,我将测试的脚本hello.sh放到web目录下,在远端浏览器中输入:http://192.168.1.1/cgi-bin/hello.sh就可以执行该脚本。
执行不是出于web目录下的脚本,就需要根据“龙觉忠”同学的方法了。我使用的是通过php编写接口来调用各个目录的脚本文件。

夜无邪 2017-03-12 10:48:10

可以使用ssh方式调用远程服务器的shell脚本,
下边是从网上找的一个类:

/** *//**
* 远程执行shell脚本类
* @author l
*/
public class RmtShellExecutor {

/** *//** */
private Connection conn;
/** *//** 远程机器IP */
private String ip;
/** *//** 用户名 */
private String usr;
/** *//** 密码 */
private String psword;
private String charset = Charset.defaultCharset().toString();

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

/** *//**
* 构造函数
* @param param 传入参数Bean 一些属性的getter setter 实现略
*/
public RmtShellExecutor(ShellParam param) {
this.ip = param.getIp();
this.usr = param.getUsername();
this.psword = param.getPassword();
}

/** *//**
* 构造函数
* @param ip
* @param usr
* @param ps
*/
public RmtShellExecutor(String ip, String usr, String ps) {
this.ip = ip;
this.usr = usr;
this.psword = ps;
}

/** *//**
* 登录
*
* @return
* @throws IOException
*/
private boolean login() throws IOException {
conn = new Connection(ip);
conn.connect();
return conn.authenticateWithPassword(usr, psword);
}

/** *//**
* 执行脚本
*
* @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 AppException("登录远程机器失败" + 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 {
RmtShellExecutor exe = new RmtShellExecutor("***.**.**.***", "sshapp", "sshapp");
// 执行myTest.sh 参数为java Know dummy
System.out.println(exe.exec("sh /webapp/myshell/myTest.sh java Know dummy"));
// exe.exec("uname -a && date && uptime && who");
}
}

原文:http://www.pin5i.com/showtopic-java-ssh-shell.html

归属感 2017-01-08 16:25:17

方法1:如果B服务器也有WEB环境,可以在B服务器写接口供A调用,根据传递的参数信息取执行相应的shell脚本,当然必须要有权限。
方法2:可以在B服务器写一个守护进程监听某一端口,A在执行脚本时发消息到B服务器的该端口;程序根据请求信息执行相应的脚本。(可以考虑NodeJs来进行端口监听)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文