将输入密钥从Java传递给Shell脚本

时间:2015-06-23 14:30:59

标签: java unix jsch

我正在尝试使用Java程序在unix环境中运行多个命令。我需要在每个命令后传递'ENTER'。有没有办法在EnterStream中传入Enter。

        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的方法。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

根据JSch javadoc,您必须在setInputStream()之前致电getOutputStream()connect()。你只能这样做一次。

出于您的目的,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之前对其进行一些研究。