我正在尝试使用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的方法。
任何帮助将不胜感激。
答案 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之前对其进行一些研究。