Jsch в режиме оболочки Я хочу последовательно выполнять команды. Я попытался использовать приведенный ниже код. Проблема с кодом - это код ожидания readLine(). Может ли кто-нибудь предложить решение. Если вы можете, пожалуйста, исправить приведенный ниже кодПоследовательный запуск и вывод команды АОH
Примечание: я хочу, чтобы выполнить команды в режиме оболочки только
public class SSHClient1 {
private Session session;
private ChannelShell channel;
private String username = "";
private String password = "";
private String hostname = "";
public SSHClient1(String username, String password, String hostname) throws Exception {
super();
this.username = username;
this.password = password;
this.hostname = hostname;
startSession();
intializeChannel();
}
private void startSession() throws Exception{
if(session == null || !session.isConnected()){
session = connect(hostname,username,password);
}
}
private void intializeChannel() throws Exception{
if(channel == null || !channel.isConnected()){
try{
channel = (ChannelShell)session.openChannel("shell");
channel.setPty(false);
channel.connect();
}catch(Exception e){
}
}
}
private Session connect(String hostname, String username, String password) throws Exception{
JSch jSch = new JSch();
try {
session = jSch.getSession(username, hostname, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();
System.out.println("Connected successfully to host "+ hostname);
}catch(Exception e){
}
return session;
}
public void executeCommands(List<String> commands) throws Exception{
PrintStream out = null;
try{
out = new PrintStream(channel.getOutputStream());
for(String command : commands){
out.println(command);
out.flush();
printResult();
}
}catch(Exception e){
} finally{
if(out != null)
out.close();
}
}
private void printResult() throws IOException{
try{
InputStream in = channel.getInputStream();
String line = "";
BufferedReader br =new BufferedReader(new InputStreamReader(in));
while((line = br.readLine()) != null){
System.out.println(line);
}
}catch(Exception e){
}
}
public void close(){
if(channel != null)
channel.disconnect();
if(session != null)
session.disconnect();
}
public static void main(String[] args) throws Exception{
SSHClient1 ssh = new SSHClient1("admin", "password", "192.168.2.9");
List<String> commands = new ArrayList<String>();
commands.add("enable");
commands.add("configure terminal");
commands.add("show running-config");
ssh.executeCommands(commands);
ssh.close();
}
}
если я изменить два метода выше кода я смог достичь того, чего я хочу, то проблема с подходом заключается в том, что мне нужно поместить Thread.sleep после создания буфера, иначе он ничего не напечатает.
public void executeCommands(List<String> commands) throws Exception{
PrintStream out = null;
try{
out = new PrintStream(channel.getOutputStream(),true);
for(String command : commands){
out.println(command);
out.flush();
printResult();
}
}catch(Exception e){
} finally{
if(out != null)
out.close();
}
}
private void printResult() throws IOException{
try{
InputStream in = channel.getInputStream();
BufferedReader br =new BufferedReader(new InputStreamReader(in));
Thread.sleep(10000);
boolean ready = false;
int c = 0;
StringBuilder line = new StringBuilder();
while((ready = br.ready()) == true){
ready = br.ready();
c = br.read();
System.out.print(String.valueOf((char)c));
}
}catch(Exception e){
}
}
Yair в моем случае это невозможно. –
, поэтому вы можете добавить новую команду, которая будет разделять ваши команды: «echo» # END # »« и использовать тот же код в printResult. вам придется отправлять 2 команды каждый раз, прежде чем читать. –
Я не работаю на Linux-машине. его маршрутизатор с поддержкой ssh, который имеет только несколько команд. Во-вторых, в моем случае команда br.readLine сама приостанавливает –