Jsch处理命令确认是或否

问题描述 投票:1回答:1

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

我的目标命令也会在确认应从输入流中读取的“y”后返回结果。 echo y |使用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");
java linux jsch
1个回答
1
投票

除非被要求,否则PrintWriters不会自动刷新,所以我相信你在没有真正发送y的情况下关闭了频道。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.