package com.network.ssh;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.sshd.ClientChannel;
import org.apache.sshd.ClientSession;
import org.apache.sshd.SshClient;
import org.apache.sshd.client.future.AuthFuture;
import org.apache.sshd.common.util.NoCloseInputStream;
import org.apache.sshd.common.util.NoCloseOutputStream;
public class SshTerminal {
public static final int DEFAULT_SSH_PORT = 22;
public static final String ENTER = "\r";
public static final String EXIT = "exit";
private SshClient client;
private ClientSession session;
private ClientChannel channel;
private ByteArrayInputStream input;
private ByteArrayOutputStream output;
private StringBuffer remoteInfo = new StringBuffer();
private boolean isLogin = false;
public SshTerminal() {
client = SshClient.setUpDefaultClient();
client.start();
}
public boolean login(String ip,String userName,String password) throws InterruptedException, IOException{
return login(ip, DEFAULT_SSH_PORT, userName, password);
}
public boolean login(String ip,int port,String userName,String password) throws InterruptedException, IOException{
closeSession();
session = client.connect(userName, new InetSocketAddress(ip, port)).await().getSession();
session.addPasswordIdentity(password);
AuthFuture future = session.auth().await();
isLogin = future.isSuccess();
return isLogin;
}
public void runCMD(String...scripts) throws Exception{
if(!isLogin) throw new Exception("not login!");
StringBuffer buffer = new StringBuffer();
for(String cmd : scripts){
buffer.append(cmd.trim()).append(ENTER);
}
/**
* createShellChannel() create a blocking channel ,use exit release
*/
buffer.append(EXIT).append(ENTER);
closeChannel();
input = new ByteArrayInputStream(buffer.toString().getBytes());
channel = session.createShellChannel();
channel.setIn(new NoCloseInputStream(input));
open();
}
public void runCMD(String cmd) throws Exception{
if(!isLogin) throw new Exception("not login!");
closeChannel();
channel = session.createExecChannel(cmd);
open();
}
private void open() throws IOException{
//session will close,so need to new
output = new ByteArrayOutputStream();
channel.setOut(new NoCloseOutputStream(output));
channel.setErr(new NoCloseOutputStream(output));
channel.open();
channel.waitFor(ClientChannel.CLOSED, 0);
}
private void closeStream(){
try{
if(input != null){
input.close();
input = null;
}
if(output != null){
remoteInfo.append(output.toString());
output.close();
output = null;
}
}catch(IOException e){
e.printStackTrace();
}
}
private void closeChannel(){
closeStream();
if(channel != null){
channel.close(true);
channel = null;
}
}
private void closeSession(){
closeChannel();
if (session != null) {
session.close(true);
session = null;
}
}
public void destory() {
closeSession();
client.stop();
client = null;
}
public String getRemoteInfo() throws Exception{
//the end od if the output not close
if(output != null) remoteInfo.append(output.toString());
return remoteInfo.toString();
}
}