用jsch执行脚本之后,java程序并没有退出,仍然在运行,是什么情况,应该怎么处理
时间: 2024-04-30 07:22:35 浏览: 7
这种情况可能是因为程序中未正确关闭或断开与ssh连接的会话,导致程序一直处于等待状态。为解决这个问题,可以在程序执行完毕后,手动关闭ssh连接,代码示例如下:
```
// 创建会话
Session session = jsch.getSession(username, host, port);
// 设置密码
session.setPassword(password);
// 建立连接
session.connect();
// 执行命令
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.connect();
// 等待命令执行完毕
while (!channel.isClosed()) {
Thread.sleep(1000);
}
// 关闭连接
channel.disconnect();
session.disconnect();
```
在执行命令后,需要等待命令执行完毕,然后手动关闭连接,这样可以避免程序一直处于等待状态。
相关问题
java jsch 调用shell_Java-Jsch-Shell脚本执行后退出
您好!针对您的问题,我可以给出以下解答:
Java JSch 是一个用于远程执行命令和传输文件的 Java 库,通过 JSch,我们可以在 Java 应用程序中连接到远程主机,并执行远程主机上的命令。
针对您的问题,如果您在使用 Java JSch 调用 shell 脚本时,脚本执行后立即退出,可能是因为您的 Java 程序没有等待 shell 脚本执行完毕就立即退出了。
为了解决这个问题,您可以在调用 shell 脚本的代码中,使用 `ChannelExec.setPty(true)` 方法启用伪终端模式,并使用 `ChannelExec.setCommand(command + ";echo finished")` 方法在 shell 脚本执行完毕后输出一个 "finished" 的标识符。然后您可以使用 `ChannelExec.getInputStream()` 方法获取 shell 脚本的输出流,并等待输出流中包含 "finished" 标识符,表示 shell 脚本已经执行完毕,然后再关闭连接。
以下是一个示例代码:
```
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setPty(true);
channelExec.setCommand(command + ";echo finished");
channelExec.setInputStream(null);
channelExec.setErrStream(System.err);
InputStream inputStream = channelExec.getInputStream();
channelExec.connect();
byte[] tmp = new byte[1024];
while (true) {
while (inputStream.available() > 0) {
int i = inputStream.read(tmp, 0, 1024);
if (i < 0) break;
System.out.print(new String(tmp, 0, i));
}
if (channelExec.isClosed()) {
if (inputStream.available() > 0) continue;
System.out.println("exit-status: " + channelExec.getExitStatus());
break;
}
try { Thread.sleep(1000); } catch (Exception ee) {}
}
channelExec.disconnect();
session.disconnect();
```
希望这个解答能够帮到您!
java jsch 切换用户,Java JSch在远程机器上更改用户并执行命令
Java JSch可以在远程机器上切换用户并执行命令。以下是一个示例代码:
```java
import com.jcraft.jsch.*;
public class SSHConnection {
public static void main(String[] args) {
String user = "remote_user";
String password = "remote_password";
String host = "remote_host";
int port = 22;
try {
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
// 切换用户
channelExec.setCommand("sudo su - new_user");
channelExec.connect();
// 执行命令
channelExec.setCommand("ls /home/new_user");
channelExec.connect();
// 读取命令输出
InputStream in = channelExec.getInputStream();
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;
System.out.println("exit-status: " + channelExec.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channelExec.disconnect();
session.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,我们使用了JSch库来连接远程机器。首先,我们创建了一个Session对象并设置了用户名、密码以及远程主机的IP地址和端口号。然后,我们开启一个ChannelExec通道,并执行切换用户的命令。最后,我们执行ls命令,读取输出并打印到控制台。注意,我们需要在执行ls命令之前先连接通道,否则无法获取命令输出。
需要注意的是,切换用户需要输入密码,这里我们假设new_user用户的密码已经配置好了,不需要输入。如果需要输入密码,可以使用Expect库来模拟用户输入。