// 将链接 公共化 可能会出现问题 自己琢磨的
public static ChannelShell channelShell;
@RequestMapping("/addWindow")
public Result goNewAddServer() {
// 开启一个session 链接 自定义的getSession 方法
Session session = ShellUtils.getSession("192.168.200.XXX", "root", "root", 22);
try{
// 链接session 设置session 长链接
channelShell = ShellUtils.ChannelShell(session);
return new Result(true,"");
}catch (Exception e){
return new Result(false,"");
}
}
@RequestMapping("/linux")
public ResultList getLinux(@RequestBody String cmd) throws UnsupportedEncodingException {
// 控制台 打印 模拟linux 黑窗口
System.out.println("\n-----------------Linux Shell-----------------\n");
System.out.println("执行命令: " + cmd);
String res="";
// 判断 输入的命令 如果是 这三个 展示命令 会将 渲染的颜色取消 否则 变成 字符串 会出现乱码
if(cmd.equals("ls") || cmd.equals("ll") ||cmd.equals("vi")){
res = ShellUtils.executeNewFlow(channelShell, cmd +" --color=never"+ " \n");
System.out.println(res);
}else {
// 否则就正常输出命令
res = ShellUtils.executeNewFlow(channelShell, cmd + " \n");
}
// 遍历执行结果 按照 \r\n 分隔
String[] str ={} ;
str = res.split("\r\n");
Listlist = new ArrayList();
for (String st:str){
list.add(st);
}
// 将结果返回给前台页面
return new ResultList(true, list);
}
package com.icbc.gateway.util;
import com.jcraft.jsch.*;
import java.io.*;
public class ShellUtils {
/**
* 创建session
* @param host 主机名称/ip地址
* @param user 登陆用户名
* @param psw 密码
* @param port 端口
* @return
*/
public static Session getSession(String host,String user,String psw,int port){
JSch jsch=new JSch();
Session session=null;
try {
session = jsch.getSession(user, host, port);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(psw);
session.connect();
} catch (JSchException e) {
System.out.println("连接linux主机失败");
e.printStackTrace();
}
return session;
}
/**
* 得到可以执行命令的连接
* @param session 连接session
* @return 可以执行命令的ChannelExec
*/
public static ChannelExec getChanel(Session session){
ChannelExec openChannel=null;
try {
if(null !=session){
openChannel = (ChannelExec) session.openChannel("exec");
}
} catch (JSchException e) {
e.printStackTrace();
}
return openChannel;
}
/**
*
* @param openChannel
* @param command
* @return
*/
public static String getExcRes(ChannelExec openChannel,String command){
InputStream in =null;
BufferedReader reader=null;
StringBuffer result=new StringBuffer();
try {
try {
openChannel.setCommand(command);
int exitStatus = openChannel.getExitStatus();
System.out.println(exitStatus);
openChannel.connect();
in = openChannel.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
String buf = null;
while ((buf = reader.readLine()) != null) {
result.append(new String(buf.getBytes("gbk"),"UTF-8")+"
\r\n");
}
//reader.close();
} catch (JSchException e) {
result.append(e.getMessage());
e.printStackTrace();
}
} catch (IOException e) {
result.append(e.getMessage());
e.printStackTrace();
} /*finally {
//try {
//reader.close();
//} catch (IOException e) {
//e.printStackTrace();
//}
}*/
return result.toString();
}
public static ChannelShell ChannelShell(Session session) {
ChannelShell channel = null;
try {
if (null != session) {
channel = (ChannelShell) session.openChannel("shell");
channel.connect();
}
} catch (JSchException e) {
e.printStackTrace();
}
return channel;
}
public static String executeNewFlow(ChannelShell channel, String command) {
InputStream in =null;
OutputStream out=null;
String msg=null;
BufferedReader reader=null;
StringBuffer result=new StringBuffer();
try {
in = channel.getInputStream();
out = channel.getOutputStream();
out.write(command.getBytes());
out.flush();
// reader = new BufferedReader(new InputStreamReader(in));
// while ((msg =reader.readLine()) !=null ){
// System.out.println(msg);
// }
byte[] tmp=new byte[1024];
while (true){
int i=0;
//线程等待 200ms
Thread.currentThread().sleep(200);
while(in.available()>0){
i=in.read(tmp, 0, 1024);
if(i<0)break;
}
System.out.print(new String(tmp, 0, i));
return new String(tmp, 0, i);
// if(channel.isClosed()){
// if(in.available()>0) continue;
// System.out.println("exit-status: "+channel.getExitStatus());
// break;
// }
}
}catch (Exception e){
result.append(e.getMessage());
e.printStackTrace();
}
return null;
}
public static void disConnect(Session session,ChannelExec openChannel){
if(session!=null&&!openChannel.isClosed()){
openChannel.disconnect();
}
if(session!=null&&session.isConnected()){
session.disconnect();
}
}
// public static void main(String[] args) {
// Session session=getSession("192.168.230.129", "root", "123456", 22);
// ChannelExec chanel=getChanel(session);
// String res=getExcRes(chanel, "cd /home;ls;");
// System.out.println(res);
// ChannelExec chanel2=getChanel(session);
// String ss=getExcRes(chanel2, "ls;");
// System.out.println(ss);
// }
}
这是我借鉴来的 链接linux 方法 需要注意的 有两个
channel = (ChannelShell) session.openChannel(“shell”);
openChannel = (ChannelExec) session.openChannel(“exec”);
这两个地方开启的链接是不同的 一个是一次性链接 一个是 长链接 好像是 具体的有点忘记了
前台 使用的 是angular 还有 借鉴过来的 ajax 黑框口 使用的 layer.js
Title
黑框口的设置 之前 可以随意修改 主体是一个input 框 每次 执行命令 将后台的结果 展示到append 到前台 展示
命令行窗口
- ----------------------命令Demo----------------------------
- 关闭进程方式1:
- exit //退出 进程
- ----------------------开始操作----------------------------
package com.icbc.gateway.pojo;
import java.io.Serializable;
public class Result implements Serializable {
private boolean flag;
private String message;
@Override
public String toString() {
return "Result{" +
"flag=" + flag +
", message='" + message + '\'' +
'}';
}
public Result(boolean flag, String message) {
super();
this.flag = flag;
this.message = message;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
就放全了吧 根据 要改的 linux 端口号 修改即可 jdk 1.8 ssh2 库
记录一下自己之前写的 不然隔几天就给忘记了