【发布时间】:2019-01-14 19:49:32
【问题描述】:
我正在尝试发送 CTRL + C (^C) 或 CTRL + D ( ^D) 使用 Java 的 JSCH 对 SSH 服务器的行为。
我目前不知道如何通过 exec 或 ssh 通道发送 EOF 消息。
谁能帮我解决这个问题?
编辑:
在我尝试执行的代码下方:
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.InputStream;
public class Test {
private static final JSch JSCH_INSTANCE = new JSch();
public static void main(String[] args) throws Exception {
Session session = JSCH_INSTANCE.getSession("username", "domain");
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setInputStream(null);
InputStream err = channel.getErrStream();
InputStream in = channel.getInputStream();
channel.setCommand("sudo service rscedit start");
channel.connect();
while (channel.getExitStatus() == -1) {
Thread.sleep(10);//command stays stuck here because EOF isn't being sent?
}
InputStream result = err.available() > 0 ? err : in;
StringBuilder responseBuilder = new StringBuilder();
while(result.available() > 0) {
responseBuilder.append((char) result.read());
}
System.out.println(responseBuilder);
channel.disconnect();
session.disconnect();
}
}
服务正在执行以下 bash 脚本:
#!/bin/sh
(java -jar -Xmx20480m /home/path/Somejar.jar)
read –n1
我可以在命令末尾添加 EOF 吗?
【问题讨论】:
-
在讨论您的问题时,添加用于通过 jsch 将数据发送到远程系统的代码会对您有所帮助。在代码中突出显示您要发送这些字符的位置。
-
有什么用?处理
Ctrl+C/D是在交互式shell 会话中完成的。在自动执行命令时,您通常应该使用不同的技术。所以请解释一下,你想达到什么目的。 -
我已经用代码更新了问题。
-
那么当你在shell中运行
sudo service rscedit start时,它不会自行返回提示符?你真的需要按Ctrl+C/D吗? -
是的。这是一个 gif:i.imgur.com/3c09zIx.gif 我必须复制 CTRL + C 行为,否则在执行命令时我无法在我的 exec 通道中得到响应。