package com.example.sshd.config; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.Properties; import org.apache.commons.lang3.StringUtils; import org.apache.sshd.SshServer; import org.apache.sshd.server.PasswordAuthenticator; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.server.session.ServerSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; @Configuration public class SshConfig { private static final Logger logger = LoggerFactory.getLogger(SshConfig.class); @Value("${ssh-server.port}") private int port; @Value("${ssh-server.private-key.location}") private String pkLocation; @Value("${ssh-server.root.username:root}") private String rootUsername; @Value("${ssh-server.automatic-replies.location}") private String repliesProperties; @Autowired ApplicationContext applicationContext; @Bean public SshServer sshd() throws IOException, NoSuchAlgorithmException { SshServer sshd = SshServer.setUpDefaultServer(); sshd.setPort(port); sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File(pkLocation).getPath(), "RSA", 2048)); sshd.setPasswordAuthenticator(new PasswordAuthenticator() { @Override public boolean authenticate(final String username, final String password, final ServerSession session) { logger.info("Login Attempt: username = {}, password = {}", username, password); return StringUtils.equals(username, rootUsername); } }); sshd.setShellFactory(applicationContext.getBean(EchoShellFactory.class)); sshd.setCommandFactory(command -> applicationContext.getBean(OnetimeCommand.class, command)); sshd.start(); return sshd; } @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public Properties repliesProperties() throws IOException { Properties prop = new Properties(); File configFile = new File(repliesProperties); FileInputStream stream = new FileInputStream(configFile); prop.load(stream); return prop; } }