java - 将 Enter 键从 Java 传递到 Shell 脚本

标签 java unix jsch

我正在尝试一个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 时,我想在此处添加 Enter,以便执行该命令。 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 之前对这些内容进行一些研究。

关于java - 将 Enter 键从 Java 传递到 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31005667/

相关文章:

java - JSch session 超时限制

java - 如何使用 Java 执行多个 UNIX 命令并捕获单个输出或错误(如果有)

java - 故障安全迭代器

java - React Native - 从 React Native 屏幕导航到 native Java (Android Studio) 屏幕

java - takePicture 因堆相关错误而失败

java - 通过java数组访问float变量

linux - 期望脚本在运行脚本之前检查文件类型并更改它

c++ - 如何管道/重定向 NCurse 命令的最终标准输出?

linux - 如何在 shell 中保留 $

java - JSch异常: No Configuration was registered named com. sun.security.jgss.krb5.initiate