Java远程调用Shell脚本并获取输出信息【推荐】
本文介绍如何使用Java远程调用Linux服务器上的Shell脚本,并获取执行的输出信息。本文介绍两种方法实现该功能:使用JSch库和使用ProcessBuilder类。以下是具体步骤:
准备工作
在开始之前,你需要了解以下知识点:
- SSH:Secure Shell,即加密的远程登录协议。
- SSH公钥认证:在SSH协议中,使用公钥认证可以免去密码认证的过程,简化远程调用过程。
- JSch库:Java实现的SSH2协议库,可以用于远程操作Linux服务器。
- Shell脚本:是一种用Shell脚本语言编写的脚本程序,可以在Linux系统中运行。
使用JSch库
使用JSch库可以实现在Java程序中通过SSH协议连接到Linux服务器,并执行Shell脚本。
步骤一:引入依赖
在项目中引入JSch依赖,可以通过Maven、Gradle等方式进行添加。以下是Maven中添加JSch依赖的示例:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
步骤二:创建SSH连接
使用JSch库连接到服务器需要以下几个参数:
- host:服务器地址
- port:SSH协议的端口号,默认是22
- username:登录服务器的用户名
- password:登录服务器的密码(或者是SSH公钥的文件路径)
import com.jcraft.jsch.*;
public class SSHConnection {
private JSch jsch = new JSch();
private Session session;
private String host;
private int port;
private String username;
private String password;
public SSHConnection(String host, int port, String username, String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
public void connect() throws JSchException {
session = jsch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
}
public void disconnect() {
if (session != null && session.isConnected()) {
session.disconnect();
}
}
// 在SSH连接上执行Shell脚本
public String exec(String command) throws JSchException, IOException {
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
StringBuilder sb = new StringBuilder();
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
sb.append(new String(tmp, 0, i));
}
if (channel.isClosed()) {
if (in.available() > 0) continue;
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
return sb.toString();
}
}
在上述代码中,我们使用createSession()方法创建SSH连接对象。然后使用exec()方法在SSH连接对象上执行Shell脚本。
步骤三:执行Shell脚本
有了SSH连接对象,就可以在其上使用exec()方法执行Shell脚本了。以下是一个示例:
public class SSHDemo {
public static void main(String[] args) throws JSchException, IOException {
String host = "192.168.1.100";
int port = 22;
String username = "username";
String password = "password";
SSHConnection ssh = new SSHConnection(host, port, username, password);
ssh.connect();
String result = ssh.exec("ls -l");
System.out.println(result);
ssh.disconnect();
}
}
在上述代码中,我们运行了一个基本的Shell脚本命令:ls -l。就可以看到该命令输出了远程服务器中的文件列表。注意:需要根据实际情况修改IP地址、用户名和密码。
使用ProcessBuilder类
如果不想使用JSch ,也可以使用ProcessBuilder类实现在Java程序中执行Shell脚本获得输出信息的功能。
步骤一:编写Shell脚本
为了演示如何使用ProcessBuilder类执行Shell脚本,我们先编写一个示例的Shell脚本。在Linux系统中,新建一个文件 hello.sh,然后输入以下代码:
#!/bin/bash
echo "Hello, World!"
保存后,使用 chmod +x hello.sh 命令授予执行权限。
步骤二:在Java程序中执行Shell脚本
在Java程序中执行Shell脚本,可以使用ProcessBuilder类。以下是一个示例:
public class ShellDemo {
public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "hello.sh");
pb.directory(new File("/home/user"));
Process process = pb.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("Exit code: " + exitCode);
}
}
在上述代码中,我们使用ProcessBuilder类构造一个进程,然后使用start()方法启动进程。通过getInputStream()方法获取进程输出信息,并使用BufferedReader读取输出。使用waitFor()方法等待Shell脚本执行完毕,并且获取脚本执行后的退出码。
至此,我们介绍了两种方法实现Java远程调用Shell脚本并获取输出信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java远程调用Shell脚本并获取输出信息【推荐】 - Python技术站