前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过JSch运行远程linux主机上的shell脚本

通过JSch运行远程linux主机上的shell脚本

作者头像
字母哥博客
发布2020-09-23 15:15:31
2.1K0
发布2020-09-23 15:15:31
举报
文章被收录于专栏:写字母的代码哥

如果您看完文章之后,觉得对您有帮助,请帮我点个赞,您的支持是我不竭的创作动力!

运行远程主机上的shell脚本

下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本)。并且通过java程序获得shell脚本的输出。 首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本。

代码语言:javascript
复制
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

当然以下java代码可执行的的前提是,远程主机已经开通SSH服务(也就是我们平时登录主机所使用的服务)。

远程shell脚本

下面的代码放入一个文件:hello.sh,脚本的内容很简单只是用来测试,回显输出“hello <参数1> ”

代码语言:javascript
复制
#! /bin/sh
echo "hello $1\n";

然后我把它放到远程主机的/root目录下面,远程主机的IP是1.1.1.1(当然我真实测试时候不是这个IP,我不能把我的真实IP写到这个文章里面,以免被攻击)。并且在远程主机上,为这个脚本设置可执行权限,方法如下:

代码语言:javascript
复制
$ chmod +x hello.sh

本地java程序

我们可以使用下面的代码,去远程的linux 主机执行shell脚本,详细功能请看代码注释

代码语言:javascript
复制
import com.jcraft.jsch.*;
import java.io.IOException;
import java.io.InputStream;
public class RunRemoteScript {
//远程主机IP
private static final String REMOTE_HOST = "1.1.1.1";
//远程主机用户名
private static final String USERNAME = "";
//远程主机密码
private static final String PASSWORD = "";
//SSH服务端口
private static final int REMOTE_PORT = 22;
//会话超时时间
private static final int SESSION_TIMEOUT = 10000;
//管道流超时时间(执行脚本超时时间)
private static final int CHANNEL_TIMEOUT = 5000;
public static void main(String[] args) {
//脚本名称及路径,与上文要对上
String remoteShellScript = "/root/hello.sh";
Session jschSession = null;
try {
JSch jsch = new JSch();
//SSH授信客户端文件位置,一般是用户主目录下的.ssh/known_hosts
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
// 密码认证
jschSession.setPassword(PASSWORD);
// 建立session
jschSession.connect(SESSION_TIMEOUT);
//建立可执行管道
ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");
// 执行脚本命令"sh /root/hello.sh zimug"
channelExec.setCommand("sh " + remoteShellScript + " zimug");
// 获取执行脚本可能出现的错误日志
channelExec.setErrStream(System.err);
//脚本执行结果输出,对于程序来说是输入流
InputStream in = channelExec.getInputStream();
// 5 秒执行管道超时
channelExec.connect(CHANNEL_TIMEOUT);
// 从远程主机读取输入流,获得脚本执行结果
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
//执行结果打印到程序控制台
System.out.print(new String(tmp, 0, i));
}
if (channelExec.isClosed()) {
if (in.available() > 0) continue;
//获取退出状态,状态0表示脚本被正确执行
System.out.println("exit-status: "
+ channelExec.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channelExec.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
} finally {
if (jschSession != null) {
jschSession.disconnect();
}
}
}
}

最终在本地控制台,获得远程主机上shell脚本的执行结果。如下

代码语言:javascript
复制
hello zimug
exit-status: 0

当然,我只是为大家演示这样一个例子,上面的代码可以通过更好的封装,从而提供更简单的使用方式。

喜欢 (1)or分享 (0)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行远程主机上的shell脚本
    • 远程shell脚本
      • 本地java程序
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档