java如何执行远程服务器上的.sh文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java如何执行远程服务器上的.sh文件相关的知识,希望对你有一定的参考价值。

你可以使用JSch

JSch全称是“Java Secure Channel”

是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。同时也是支持执行命令;

以下是大概运行的代码,只是提供大致思路,可以去查官方API和demo

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpATTRS;
import com.jcraft.jsch.SftpException;

.......
try
Session session = new JSch().getSession(user, ip, port);
session.setPassword(pwd);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("userauth.gssapi-with-mic", "no");
session.connect();

ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand("ifconfig");//这里是你要执行的命令,部分命令不支持,具体自己执行下
ByteArrayOutputStream bao = new ByteArrayOutputStream();
exec.setOutputStream(bao);
ByteArrayOutputStream baerr = new ByteArrayOutputStream();
exec.setErrStream(baerr);
exec.connect();
while (!exec.isEOF())
;
String errmsg = new String(baerr.toByteArray(), "utf-8");
if (StringUtils.notNull(errmsg)) 
throw new RuntimeException(errmsg);
 else 
System.out.println(new String(bao.toByteArray(), "utf-8"));

catch(Exception e)
    e.printStackTrace();
finally
    //关闭session等操作
参考技术A 拖不周奖澳填平慷

如何从linux上的rest服务执行sh文件

我在linux机器上用java编写了一个休息服务。

我正在使用:

p = Runtime.getRuntime().exec(cmmnd);

要么

ProcessBuilder pb = new ProcessBuilder(cmmnd).inheritIO();
p = pb.start();

p.waitFor();

我可以执行像mkdirtouch这样的命令......但是当我尝试运行sh文件时没有任何反应(例如:sudo sh /home/mydir/myfile.sh

这是一个许可问题吗?我怎么解决这个问题?

答案

这里只有文件执行权限不够。首先从命令提示符手动运行命令sudo sh /home/mydir/myfile.sh并检查是否工作?你在sodo要求输入密码吗?您执行命令的Web服务帐户是否有权以sudo身份执行?还要检查您的Web应用程序是否具有位置的文件访问权限(意味着它是否可以执行cd /home/mydir//home/mydir/myfile.sh

同样在你的代码中读取输出并检查实际错误是什么?

p.getOutputStream();

也尝试: -

    ProcessBuilder pb = new ProcessBuilder("sudo sh /home/mydir/myfile.sh");
    pb.redirectOutput(new File("/new_path/out.txt"));
    Process p = pb.start();
    try {
        p.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

以上是关于java如何执行远程服务器上的.sh文件的主要内容,如果未能解决你的问题,请参考以下文章

linux怎么远程执行另一台linux机器上的shell文件?

Java监控远程服务器JVM

sh 特定远程服务器上的Gulp init文件(可以在任何地方应用)

命令行登录FTP下,如何远程执行服务器上的可执行文件?不是在本机执行,而是远程执行,命令是啥呢。求高

sh 将文件复制到远程服务器并在之后执行命令

如何远程管理tomcat的关闭,启动,重启