hutool/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java
2019-10-14 17:28:57 +08:00

144 lines
3.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cn.hutool.extra.ssh;
import cn.hutool.core.util.StrUtil;
import com.jcraft.jsch.Session;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
/**
* Jsch会话池
*
* @author looly
*/
public enum JschSessionPool {
INSTANCE;
/**
* SSH会话池keyhostvalueSession对象
*/
private Map<String, Session> sessionPool = new ConcurrentHashMap<>();
/**
* 锁
*/
private static final Object lock = new Object();
/**
* 获取Session不存在返回null
*
* @param key 键
* @return Session
*/
public Session get(String key) {
return sessionPool.get(key);
}
/**
* 获得一个SSH跳板机会话重用已经使用的会话
*
* @param sshHost 跳板机主机
* @param sshPort 跳板机端口
* @param sshUser 跳板机用户名
* @param sshPass 跳板机密码
* @return SSH会话
*/
public Session getSession(String sshHost, int sshPort, String sshUser, String sshPass) {
final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort);
Session session = get(key);
if (null == session || false == session.isConnected()) {
synchronized (lock) {
session = get(key);
if (null == session || false == session.isConnected()) {
session = JschUtil.openSession(sshHost, sshPort, sshUser, sshPass);
put(key, session);
}
}
}
return session;
}
/**
* 获得一个SSH跳板机会话重用已经使用的会话
*
* @param sshHost 跳板机主机
* @param sshPort 跳板机端口
* @param sshUser 跳板机用户名
* @param prvkey 跳板机私钥路径
* @param passphrase 跳板机私钥密码
* @return SSH会话
*/
public Session getSession(String sshHost, int sshPort, String sshUser, String prvkey, byte[] passphrase) {
final String key = StrUtil.format("{}@{}:{}", sshUser, sshHost, sshPort);
Session session = get(key);
if (null == session || false == session.isConnected()) {
synchronized (lock) {
session = get(key);
if (null == session || false == session.isConnected()) {
session = JschUtil.openSession(sshHost, sshPort, sshUser, prvkey, passphrase);
put(key, session);
}
}
}
return session;
}
/**
* 加入Session
*
* @param key 键
* @param session Session
*/
public void put(String key, Session session) {
this.sessionPool.put(key, session);
}
/**
* 关闭SSH连接会话
*
* @param key 主机格式为user@host:port
*/
public void close(String key) {
Session session = sessionPool.get(key);
if (session != null && session.isConnected()) {
session.disconnect();
}
sessionPool.remove(key);
}
/**
* 移除指定Session
*
* @param session Session会话
* @since 4.1.15
*/
public void remove(Session session) {
if (null != session) {
final Iterator<Entry<String, Session>> iterator = this.sessionPool.entrySet().iterator();
Entry<String, Session> entry;
while (iterator.hasNext()) {
entry = iterator.next();
if (session.equals(entry.getValue())) {
iterator.remove();
break;
}
}
}
}
/**
* 关闭所有SSH连接会话
*/
public void closeAll() {
Collection<Session> sessions = sessionPool.values();
for (Session session : sessions) {
if (session.isConnected()) {
session.disconnect();
}
}
sessionPool.clear();
}
}