JSch连接关闭后,"tail -f"进程不会退出

wan*_*020 6 java ssh jsch

我使用JSch来拖尾远程计算机中的文件.但我发现在程序退出后,"tail -f"进程仍然存在于远程计算机中.如果我删除"-f"参数,一切都OK.

我试过使用"sendSignal()",但它不起作用.似乎OpenSSH没有实现该功能.

这是测试代码.

public static void main(String[] args) throws Exception {
    String usr = args[0];
    String host = args[1];
    String password = args[2];
    JSch jsch = new JSch();
    Session session = jsch.getSession(usr, host);
    String pwd = password;
    session.setPassword(pwd);
    Hashtable<String, String> config = new Hashtable<String, String>();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect(15000);
    session.setServerAliveInterval(15000);


    ChannelExec m_channelExec = (ChannelExec) session.openChannel("exec");
    String cmd = "tail -f /var/log/messages";
    m_channelExec.setCommand(cmd);
    InputStream m_in = m_channelExec.getInputStream();
    m_channelExec.connect();
    BufferedReader m_bufferedReader = new BufferedReader(new InputStreamReader(m_in));
    int i = 0;
    while (++i < 10) {

        if (m_bufferedReader.ready()) {
            String line = m_bufferedReader.readLine();
            System.out.println(line);
        }
        Thread.sleep(1000);
    }
    m_bufferedReader.close();
    m_channelExec.sendSignal("SIGINT");
    m_channelExec.disconnect();
    session.disconnect();
    System.out.println("exit");
}
Run Code Online (Sandbox Code Playgroud)

有没有解决方案可以解决这个问题?

Pet*_*esh 4

execCommand 不会通道分配控制 tty,因此 tail 实际上正在写入管道。它将继续,直到有更多数据发送给它(它将收到 SIGPIPE)。

最简单的解决方案是分配一个 tty - 使用:

m_channelExec.setPty(true);
Run Code Online (Sandbox Code Playgroud)

在之前的行m_channelExec.connect();

这应该给你想要的行为。