V1.4.3 Still display prompt after a command fails

master
Ng Yat Yan 1 month ago
parent 8c30a60134
commit 4154340299

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.example.sshd</groupId> <groupId>com.example.sshd</groupId>
<artifactId>echo-sshd-server</artifactId> <artifactId>echo-sshd-server</artifactId>
<version>1.4.2</version> <version>1.4.3</version>
<name>ECHO SSH SERVER</name> <name>ECHO SSH SERVER</name>
<description>Learning Apache Mina SSHD library</description> <description>Learning Apache Mina SSHD library</description>
<parent> <parent>

@ -1,8 +1,7 @@
package com.example.sshd.config; package com.example.sshd.config;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient; import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.async.HttpAsyncClients; import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
@ -19,13 +18,13 @@ public class AppConfig {
@Bean @Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public Map<String, Session> remoteSessionMapping() { public Map<String, Session> remoteSessionMapping() {
return Collections.synchronizedMap(new HashMap<>()); return new ConcurrentHashMap<>();
} }
@Bean @Bean
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public Map<String, String> ipInfoMapping() { public Map<String, String> ipInfoMapping() {
return Collections.synchronizedMap(new HashMap<>()); return new ConcurrentHashMap<>();
} }
@Bean @Bean

@ -110,6 +110,7 @@ public class EchoSessionListener implements SessionListener {
String remoteIpAddress = remoteAddress.getAddress().getHostAddress(); String remoteIpAddress = remoteAddress.getAddress().getHostAddress();
logger.info("removing session: {} -> {}", remoteIpAddress, remoteSessionMapping.get(remoteIpAddress)); logger.info("removing session: {} -> {}", remoteIpAddress, remoteSessionMapping.get(remoteIpAddress));
remoteSessionMapping.remove(remoteIpAddress); remoteSessionMapping.remove(remoteIpAddress);
ipInfoMapping.remove(remoteIpAddress);
} }
} }

@ -11,6 +11,7 @@ import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.PumpStreamHandler; import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
@ -19,9 +20,9 @@ import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Service;
@Component @Service
public class ReplyService { public class ReplyService {
private static final Logger logger = LoggerFactory.getLogger(ReplyService.class); private static final Logger logger = LoggerFactory.getLogger(ReplyService.class);
@ -90,14 +91,18 @@ public class ReplyService {
.replace("\\t", "\t"); .replace("\\t", "\t");
if (reply.isEmpty()) { if (reply.isEmpty()) {
logger.info("[{}] Execute cmd for real: {} ({})", cmdHash, command.trim(), o.get()); logger.info("[{}] Execute cmd for real: {} ({})", cmdHash, command.trim(), o.get());
CommandLine cmdLine = CommandLine.parse(command.trim());
DefaultExecutor executor = DefaultExecutor.builder().get();
ByteArrayOutputStream tempOut = new ByteArrayOutputStream(); ByteArrayOutputStream tempOut = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(tempOut); try {
executor.setStreamHandler(streamHandler); CommandLine cmdLine = CommandLine.parse(command.trim());
int exitValue = executor.execute(cmdLine); DefaultExecutor executor = DefaultExecutor.builder().get();
logger.info("[{}] Result: {} ({})", cmdHash, command.trim(), exitValue); PumpStreamHandler streamHandler = new PumpStreamHandler(tempOut);
reply = new String(tempOut.toByteArray()).replace("\n", "\r\n"); executor.setStreamHandler(streamHandler);
int exitValue = executor.execute(cmdLine);
logger.info("[{}] Result: {} ({})", cmdHash, command.trim(), exitValue);
reply = new String(tempOut.toByteArray()).replace("\n", "\r\n");
} catch (ExecuteException e) {
logger.info("[{}] Execute cmd failed: {} ({})", cmdHash, command.trim(), o.get(), e);
}
out.write(String.format("\r\n%s\r\n%s", reply, prompt).getBytes()); out.write(String.format("\r\n%s\r\n%s", reply, prompt).getBytes());
} else { } else {
logger.info("[{}] Known pattern detected: {} ({})", cmdHash, command.trim(), o.get()); logger.info("[{}] Known pattern detected: {} ({})", cmdHash, command.trim(), o.get());

Loading…
Cancel
Save