1.POM
<!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
2.连接ssh远程服务器 执行shell指令代码
package com.ccit.vpn.utils;
import ch.ethz.ssh2.Session;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.StreamGobbler;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DMruntimeUtil {
private static final String DEFAULT_CHARSET = "utf-8";
private static final Logger LOGGER = LoggerFactory.getLogger(DMruntimeUtil.class);
public static Connection login(String ip, String userName, String userPwd,Integer prot) {
boolean flg = false;
Connection conn = null;
try {
conn = new Connection(ip,prot);
conn.connect();
flg = conn.authenticateWithPassword(userName, userPwd);
if (flg) {
LOGGER.info("=========登录成功=========" + conn);
return conn;
}
} catch (IOException e) {
LOGGER.error("=========登录失败=========" + e.getMessage());
e.printStackTrace();
}
return conn;
}
public static Map<String, Object> execute(Connection conn, String cmd) {
Map<String, Object> result = new HashMap<String, Object>();
try {
if (conn != null) {
Session session = conn.openSession();
session.execCommand(cmd);
result = processStdout(session.getStdout(), DEFAULT_CHARSET);
if (StringUtils.isBlank(result.get("value")+"")) {
LOGGER.info("得到标准输出为空,链接conn:" + conn + ",执行的命令:" + cmd);
result = processStdout(session.getStderr(), DEFAULT_CHARSET);
} else {
LOGGER.info("执行命令成功,链接conn:" + conn + ",执行的命令:" + cmd);
}
conn.close();
session.close();
}
} catch (IOException e) {
LOGGER.info("执行命令失败,链接conn:" + conn + ",执行的命令:" + cmd + " " + e.getMessage());
e.printStackTrace();
result= null;
}
return result;
}
private static Map<String, Object> processStdout(InputStream in, String charset) {
List<String> arrString = new ArrayList<String>();
InputStream stdout = new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
String line = null;
while ((line = br.readLine()) != null) {
buffer.append(line + "\n");
arrString.add(line);
}
} catch (UnsupportedEncodingException e) {
LOGGER.error("解析脚本出错:" + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
LOGGER.error("解析脚本出错:" + e.getMessage());
e.printStackTrace();
}
Map<String, Object> result = new HashMap<String, Object>();
result.put("arrString", arrString);
result.put("value", buffer.toString());
return result;
}
}
3.实体类
package com.ccit.vpn.entity;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class FireWall implements Serializable {
private static final long serialVersionUID = 1L;
private Integer count;
private String network;
private String tactics;
private String agreement;
private String sourceAddress;
private String targetAddress;
private String portNumber;
private String ptks;
private String isok;
}
4.处理shell返回结果 转换对象接收
package com.ccit.vpn.utils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ccit.vpn.entity.FireWall;
import ch.ethz.ssh2.Connection;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class FireUtil {
private static String ip = "";
private static String root="";
private static String pwd="";
private static Integer prot = 22;
private static String[] chains = {"INPUT","OUTPUT","FORWARD"};
public static List<FireWall> executeCmd(String target,String chain) {
List<FireWall> listFire = new ArrayList<FireWall>();
Connection conn = DMruntimeUtil.login(ip, root, pwd,prot);
Map<String, Object> results = new HashMap<String, Object>();
if(target.equals("ACCEPT")) {
String cmd = "iptables -P "+chain+" ACCEPT";
results = DMruntimeUtil.execute(conn, cmd);
}else if(target.equals("DROP")){
String cmd = "iptables -P "+chain+" DROP";
results = DMruntimeUtil.execute(conn, cmd);
}else {
log.info("-==[ 防火墙策略参数错误! ]==-");
return null;
}
if(Arrays.asList(chains).contains(chain)) {
conn = DMruntimeUtil.login(ip, root, pwd,prot);
String cmd = "iptables -t filter -vnL "+chain+" --line-number";
results = DMruntimeUtil.execute(conn, cmd);
if (results != null) {
log.info("-==[ shell指令运行完成! ]==-");
log.info("shell指令运行结果:"+results);
List<String> arrString = (List<String>) results.get("arrString");
for (int i = 2; i < arrString.size(); i++) {
FireWall fireEntity = new FireWall();
String val = arrString.get(i);
String [] arr = val.split("\\s+");
if(arr.length<11) {
fireEntity.setCount(Integer.valueOf(arr[0])).setNetwork(arr[4]).setTactics(arr[3])
.setAgreement(arr[4]).setSourceAddress(arr[8]).setTargetAddress(arr[9])
.setPortNumber("").setPtks(arr[1]+"-"+arr[2]).setIsok("Y");
System.out.println(fireEntity.toString());
}else {
fireEntity.setCount(Integer.valueOf(arr[0])).setNetwork(arr[4]).setTactics(arr[3])
.setAgreement(arr[4]).setSourceAddress(arr[8]).setTargetAddress(arr[9])
.setPortNumber(arr[11]).setPtks(arr[1]+"-"+arr[2]).setIsok("Y");
System.out.println(fireEntity.toString());
}
listFire.add(fireEntity);
}
} else {
log.info("-==[ shell指令运行失败! ]==-");
}
return listFire;
}else {
return null;
}
}
public static void main(String[] args) {
FireUtil.executeCmd("ACCEPT","INPUT");
}
}