Jsch处理命令确认是或否

Jsch handling command confirm yes or no

我正在尝试使用 Jsch 的 linux 命令来处理确认问题 (y/n)。我能够在错误流中得到问题。但是在输出流中写入 'y' 作为答案后,命令没有得到它。我尝试使用的 SAMPLE 命令是 'rm -i file1.txt' 并且在写入 'y' 之后文件没有被删除。

我的目标命令在确认 'y' 后也 returns 结果应该从输入流中读取。回声 | target 命令对我来说不是一个选项。

        java.util.Properties config = new java.util.Properties();

        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        session.setPassword(password);
        session.setConfig(config);
        session.connect();
        System.out.println("Connected");

        System.out.println(command);
        ChannelExec channel = (ChannelExec) session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        channel.setInputStream(null);

        InputStream in = channel.getInputStream();
        OutputStream outChannel = channel.getOutputStream();
        InputStream errStream = channel.getErrStream();
        PrintWriter writer = new PrintWriter(outChannel);
        channel.connect();

        byte[] errTmp = new byte[1024];
        while (errStream.available() > 0) {
            int i = errStream.read(errTmp, 0, 1024);
            if (i < 0)
                break;
            sysout = new String(errTmp, 0, i);
            System.out.println("Error Line:"+sysout);
            if(sysout.toLowerCase().contains("remove regular file")) {
                writer.println("y"); // Works till here but not deleting file
            }
        }

        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) { 
                int i = in.read(tmp, 0, 1024);
                if (i < 0)
                    break;
                sysout = new String(tmp, 0, i);                 
                System.out.println(sysout);
            }
            if (channel.isClosed()) {
                System.out.println("exit-status: " + channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
            }
            channel.disconnect();
        }
        session.disconnect();
        out.close();
        System.out.println("DONE");

PrintWriters 除非被要求否则不会自动刷新,所以我相信你关闭频道而没有真正发送 y.

您可以创建一个 PrintWriter,它会在使用 PrintWriter(OutputStream out, boolean autoflush) 构造函数调用 println 时自动刷新。

我还认为您应该避免在等待结果的 while (true) 循环中调用 channel.disconnect(),因为您可以确定一旦关闭频道就不会得到结果。