【问题标题】:Java JSCH - send EOF in exec or shell channelJava JSCH - 在 exec 或 shell 通道中发送 EOF
【发布时间】: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 通道中得到响应。

标签: java jsch


【解决方案1】:

对我来说,这看起来像是“rscedit”服务启动脚本中的一个错误。

因此,没有正确解决方案——您所寻找的只是最好的解决方法。

从您的 cmets 看来,您实际上不需要发送 Ctrl+C。当启动脚本 *hangs 时,服务已经启动并运行。

所以您可以改为关闭频道,也许在很短的时间间隔后。这实际上与 Ctrl+C 在交互式终端中所做的相同。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2013-12-31
    • 1970-01-01
    • 2011-05-10
    • 2019-02-28
    • 2017-02-25
    • 2013-10-14
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多