将输入键从 Java 传递到 Shell 脚本

pass enter key from Java to Shell script

我正在尝试 Java 程序在 unix 环境中 运行 多个命令。我需要在每个命令后传递 'ENTER'。有什么方法可以在 InputStream 中传递输入。

        JSch jsch=new JSch();
        Session session=jsch.getSession("MYUSERNAME", "SERVER", 22);
        session.setPassword("MYPASSWORD");
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();

        Channel channel= session.openChannel("shell");
        channel.setInputStream(getInputStream("ls -l"));
        channel.setInputStream(getInputStream("\r\n"));
        channel.setInputStream(getInputStream("pwd"));
        channel.setInputStream(getInputStream("\r\n"));
        channel.connect();

当我执行ls -l时,我想在这里添加回车,以便执行命令。 getInputStream是将String转换为InputStream的方法。

如有任何帮助,我们将不胜感激。

根据 JSch javadoc,您必须在 connect() 之前调用 setInputStream()getOutputStream()。您只能执行其中一项,一次。

就您的目的而言,getOutputStream() 似乎更合适。有了 OutputStream 后,您可以将其包装在 PrintWriter 中,以便更轻松地发送命令。

同样,您可以使用 channel.getInputStream() 获取一个 InputStream,您可以从中读取结果。

OutputStream os = channel.getOutputStream();
PrintWriter writer = new PrintWriter(os);
InputStream is = channel.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
channel.connect();
writer.println("ls -l");
String response = reader.readLine();
while(response != null) {
    // do something with response
    response = reader.readLine();
}
writer.println("pwd");

如果您决定使用 setInputStream() 而不是 getOutputStream() 那么您只能这样做一次,因此您必须将所有行放入一个字符串中:

    channel.setInputStream(getInputStream("ls -l\npwd\n"));

(我认为您不需要 \r,但如果需要请重新添加)

如果您不熟悉使用流、写入器和读取器,请在使用 JSch 之前对这些进行一些研究。