如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!
如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!
如果您看完文章之后,感觉对您有帮忙,请帮我点个赞,您的反对是我不竭的创作能源!
运行近程主机上的shell脚本
上面的例子是教给大家如何通过java程序,运行近程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是应用用户名明码去执行有用户认证资格的主机上的shell脚本)。并且通过java程序取得shell脚本的输入。
首先通过maven坐标引入JSch依赖库,咱们正是通过JSch去执行近程主机上的脚本。
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
当然以下java代码可执行的的前提是,近程主机曾经开明SSH服务(也就是咱们平时登录主机所应用的服务)。
近程shell脚本
上面的代码放入一个文件:hello.sh
,脚本的内容很简略只是用来测试,回显输入“hello <参数1> ”
#! /bin/sh
echo "hello $1\n";
而后我把它放到近程主机的/root
目录上面,近程主机的IP是1.1.1.1
(当然我实在测试时候不是这个IP,我不能把我的实在IP写到这个文章外面,免得被攻打)。并且在近程主机上,为这个脚本设置可执行权限,办法如下:
$ chmod +x hello.sh
本地java程序
咱们能够应用上面的代码,去近程的linux 主机执行shell脚本,具体性能请看代码正文
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脚本的执行后果。如下
hello zimug
exit-status: 0
当然,我只是为大家演示这样一个例子,下面的代码能够通过更好的封装,从而提供更简略的应用形式。
欢送关注我的博客,外面有很多精品合集
- 本文转载注明出处(必须带连贯,不能只转文字):字母哥博客。
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源! 。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端拆散RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
发表回复