mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix code
This commit is contained in:
parent
6b4c5ede6a
commit
d27f91c083
@ -22,4 +22,11 @@ import java.io.Closeable;
|
|||||||
* @author looly
|
* @author looly
|
||||||
*/
|
*/
|
||||||
public interface Session extends Wrapper<Object>, Closeable {
|
public interface Session extends Wrapper<Object>, Closeable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否连接状态
|
||||||
|
*
|
||||||
|
* @return 是否连接状态
|
||||||
|
*/
|
||||||
|
boolean isConnected();
|
||||||
}
|
}
|
||||||
|
@ -75,6 +75,12 @@ public class GanymedSession implements Session {
|
|||||||
return raw;
|
return raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isConnected() {
|
||||||
|
// 未找到合适的方法判断是否在线
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
if (raw != null) {
|
if (raw != null) {
|
||||||
|
@ -60,12 +60,7 @@ public class JschSession implements Session {
|
|||||||
return this.raw;
|
return this.raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* 是否连接状态
|
|
||||||
*
|
|
||||||
* @return 是否连接状态
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
return null != this.raw && this.raw.isConnected();
|
return null != this.raw && this.raw.isConnected();
|
||||||
}
|
}
|
||||||
@ -103,10 +98,7 @@ public class JschSession implements Session {
|
|||||||
* @throws SshException 端口绑定失败异常
|
* @throws SshException 端口绑定失败异常
|
||||||
*/
|
*/
|
||||||
public boolean bindLocalPort(final String remoteHost, final int remotePort, final String localHost, final int localPort) throws SshException {
|
public boolean bindLocalPort(final String remoteHost, final int remotePort, final String localHost, final int localPort) throws SshException {
|
||||||
if (!isConnected()) {
|
if (isConnected()) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.raw.setPortForwardingL(localHost, localPort, remoteHost, remotePort);
|
this.raw.setPortForwardingL(localHost, localPort, remoteHost, remotePort);
|
||||||
} catch (final JSchException e) {
|
} catch (final JSchException e) {
|
||||||
@ -114,6 +106,8 @@ public class JschSession implements Session {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解除远程端口映射
|
* 解除远程端口映射
|
||||||
@ -139,10 +133,7 @@ public class JschSession implements Session {
|
|||||||
* @throws SshException 端口绑定失败异常
|
* @throws SshException 端口绑定失败异常
|
||||||
*/
|
*/
|
||||||
public boolean bindRemotePort(final int bindPort, final String host, final int port) throws SshException {
|
public boolean bindRemotePort(final int bindPort, final String host, final int port) throws SshException {
|
||||||
if (!isConnected()) {
|
if (isConnected()) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
this.raw.setPortForwardingR(bindPort, host, port);
|
this.raw.setPortForwardingR(bindPort, host, port);
|
||||||
} catch (final JSchException e) {
|
} catch (final JSchException e) {
|
||||||
@ -150,6 +141,8 @@ public class JschSession implements Session {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解除远程端口映射
|
* 解除远程端口映射
|
||||||
|
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
||||||
|
* Hutool is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* https://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.dromara.hutool.extra.ssh.engine.mina;
|
||||||
|
|
||||||
|
import org.apache.sshd.client.SshClient;
|
||||||
|
import org.apache.sshd.client.channel.ChannelShell;
|
||||||
|
import org.apache.sshd.client.session.ClientSession;
|
||||||
|
import org.dromara.hutool.core.io.IORuntimeException;
|
||||||
|
import org.dromara.hutool.core.io.IoUtil;
|
||||||
|
import org.dromara.hutool.extra.ssh.Connector;
|
||||||
|
import org.dromara.hutool.extra.ssh.Session;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apache MINA SSHD(https://mina.apache.org/sshd-project/)会话封装
|
||||||
|
*
|
||||||
|
* @author looly
|
||||||
|
*/
|
||||||
|
public class MinaSession implements Session {
|
||||||
|
|
||||||
|
private final SshClient sshClient;
|
||||||
|
private final ClientSession raw;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*
|
||||||
|
* @param connector 连接信息
|
||||||
|
*/
|
||||||
|
public MinaSession(final Connector connector) {
|
||||||
|
this.sshClient = MinaUtil.openClient();
|
||||||
|
this.raw = MinaUtil.openSession(this.sshClient, connector);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getRaw() {
|
||||||
|
return this.raw;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isConnected() {
|
||||||
|
return null != this.raw && this.raw.isOpen();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws IOException {
|
||||||
|
IoUtil.closeQuietly(this.raw);
|
||||||
|
if (null != this.sshClient) {
|
||||||
|
this.sshClient.stop();
|
||||||
|
}
|
||||||
|
IoUtil.closeQuietly(this.sshClient);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行Shell命令
|
||||||
|
*
|
||||||
|
* @param cmd 命令
|
||||||
|
* @param charset 发送和读取内容的编码
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public String exec(final String cmd, final Charset charset) {
|
||||||
|
return exec(cmd, charset, System.err);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行Shell命令(使用EXEC方式)
|
||||||
|
* <p>
|
||||||
|
* 此方法单次发送一个命令到服务端,不读取环境变量,执行结束后自动关闭channel,不会产生阻塞。
|
||||||
|
* </p>
|
||||||
|
* 参考:https://github.com/apache/mina-sshd/blob/master/docs/client-setup.md#running-a-command-or-opening-a-shell
|
||||||
|
*
|
||||||
|
* @param cmd 命令
|
||||||
|
* @param charset 发送和读取内容的编码
|
||||||
|
* @param errStream 错误信息输出到的位置
|
||||||
|
* @return 执行结果内容
|
||||||
|
*/
|
||||||
|
public String exec(final String cmd, final Charset charset, final OutputStream errStream) {
|
||||||
|
try {
|
||||||
|
return this.raw.executeRemoteCommand(cmd, errStream, charset);
|
||||||
|
} catch (final IOException e) {
|
||||||
|
throw new IORuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行Shell命令
|
||||||
|
* <p>
|
||||||
|
* 此方法单次发送一个命令到服务端,自动读取环境变量,执行结束后自动关闭channel,不会产生阻塞。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param cmd 命令
|
||||||
|
* @param charset 发送和读取内容的编码
|
||||||
|
* @param errStream 异常输出位置
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public String execByShell(final String cmd, final Charset charset, final OutputStream errStream){
|
||||||
|
final ChannelShell shellChannel;
|
||||||
|
try {
|
||||||
|
shellChannel = this.raw.createShellChannel();
|
||||||
|
if(null != errStream){
|
||||||
|
shellChannel.setErr(errStream);
|
||||||
|
}
|
||||||
|
shellChannel.open().verify();
|
||||||
|
} catch (final IOException e) {
|
||||||
|
throw new IORuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
IoUtil.write(shellChannel.getInvertedIn(), charset, false, cmd);
|
||||||
|
return IoUtil.read(shellChannel.getInvertedOut(),charset);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2023 looly(loolly@aliyun.com)
|
||||||
|
* Hutool is licensed under Mulan PSL v2.
|
||||||
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||||||
|
* You may obtain a copy of Mulan PSL v2 at:
|
||||||
|
* https://license.coscl.org.cn/MulanPSL2
|
||||||
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
||||||
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
||||||
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
||||||
|
* See the Mulan PSL v2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.dromara.hutool.extra.ssh.engine.mina;
|
||||||
|
|
||||||
|
import org.apache.sshd.client.SshClient;
|
||||||
|
import org.apache.sshd.client.session.ClientSession;
|
||||||
|
import org.dromara.hutool.core.io.IORuntimeException;
|
||||||
|
import org.dromara.hutool.extra.ssh.Connector;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apache MINA SSHD(https://mina.apache.org/sshd-project/)相关工具类
|
||||||
|
*
|
||||||
|
* @author looly
|
||||||
|
*/
|
||||||
|
public class MinaUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开一个客户端对象
|
||||||
|
* @return 客户端对象
|
||||||
|
*/
|
||||||
|
public static SshClient openClient(){
|
||||||
|
final SshClient sshClient = SshClient.setUpDefaultClient();
|
||||||
|
sshClient.start();
|
||||||
|
|
||||||
|
return sshClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打开一个新的Session
|
||||||
|
*
|
||||||
|
* @param sshClient 客户端
|
||||||
|
* @param connector 连接信息
|
||||||
|
* @return {@link ClientSession}
|
||||||
|
*/
|
||||||
|
public static ClientSession openSession(final SshClient sshClient, final Connector connector){
|
||||||
|
final ClientSession session;
|
||||||
|
final boolean success;
|
||||||
|
try {
|
||||||
|
session = sshClient
|
||||||
|
.connect(connector.getUser(), connector.getHost(), connector.getPort())
|
||||||
|
.verify()
|
||||||
|
.getSession();
|
||||||
|
|
||||||
|
session.addPasswordIdentity(connector.getPassword());
|
||||||
|
success = session.auth().verify().isSuccess();
|
||||||
|
} catch (final IOException e) {
|
||||||
|
throw new IORuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!success){
|
||||||
|
throw new IORuntimeException("Authentication failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return session;
|
||||||
|
}
|
||||||
|
}
|
@ -74,11 +74,7 @@ public class SshjSession implements Session {
|
|||||||
return raw;
|
return raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* 是否连接状态
|
|
||||||
*
|
|
||||||
* @return 是否连接状态
|
|
||||||
*/
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
return null != this.raw && (null == this.ssh || this.ssh.isConnected());
|
return null != this.raw && (null == this.ssh || this.ssh.isConnected());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user