当前位置: 首页 > 知识库问答 >
问题:

Apache MINA SSHD-连接到服务器时身份验证方法的问题

甄胡非
2023-03-14

下面是我的服务器的代码。我必须手动为服务器设置身份验证方法吗?还是我做错了什么?

sshd = SshServer.setUpDefaultServer();
sshd.setPort(3333);

List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
sshd.setUserAuthFactories(userAuthFactories);

sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));

sshd.start();

共有1个答案

谢铭
2023-03-14

我刚刚创建了一个为我工作的样本。我使用Putty连接到Apache SSHD。我使用的Lib版本是'apache-sshd-0.9.0'(下载于:2014-02-04)。JDK 1.7。

我的示例的主要内容如下所示:

public static void main(String[] args) throws IOException
{
  SshServer sshd = SshServer.setUpDefaultServer();
  sshd.setPort(22);
  sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("./keys/mysample", 
            SimpleGeneratorHostKeyProvider.SSH_RSA));

  List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
  userAuthFactories.add(new UserAuthPassword.Factory());
  sshd.setUserAuthFactories(userAuthFactories);

  sshd.setPasswordAuthenticator(new PasswordAuthenticator() {
  public boolean authenticate(String username, String password, ServerSession session) {
    return "tomek".equals(username) && "123".equals(password);
    }
  });

  sshd.setShellFactory(new MyCommandFactory());

  sshd.start();
  while (true) ;
}

正如您所看到的,我这样创建了自己的命令工厂:(顺便说一句,关于SO的这个问题对我很有帮助)

public class MyCommandFactory  implements CommandFactory, Factory<Command>
{
  public Command createCommand(String s)
  {
    System.out.println("command requested: " + s);
    return new MyCommand(s);
  }

  public Command create()
  {
    return createCommand("none");
  }
}

出于测试目的,创建如下命令:

public class MyCommand implements Command
{

  private String name;

  private InputStream inputStream;
  private OutputStream outputStream;
  private ExitCallback exitCallback;

  public MyCommand(String name)
  {
    this.name = name;
  }

  public void setInputStream(final InputStream inputStream)
  {
    System.out.println("input stream was set on command: " + name);
    this.inputStream = inputStream;
  }

  public void setOutputStream(final OutputStream outputStream)
  {
    System.out.println("output stream was set on command: " + name);
    this.outputStream = outputStream;
  }

  public void setErrorStream(OutputStream outputStream)
  {
    System.out.println("error stream was set on command: " + name);
  }

  public void setExitCallback(ExitCallback exitCallback)
  {
    System.out.println("exit callback was set on command: " + name);
    this.exitCallback = exitCallback;
  }

  public void start(Environment environment) throws IOException
  {
    try
    {

      final PrintWriter writer = new PrintWriter(outputStream, true);
      writer.println("Welcome to Java SSH echo server!");
      writer.flush();

      // ... here you gonna read input from remote client ...
      // use writer to write back responses
    }
    catch (final Exception e)
    {
      e.printStackTrace();
    }
  }

  public void destroy()
  {
    System.out.println("destroy was called on command: " + name);
    // client or server closed connection, clean up resources here
  }
}

如您所见,我使用了一个密钥文件'./keys/mysample'。要创建这样一个密钥文件,请尝试以下操作:(顺便说一句,关于SO的这个问题对此很有帮助)

keytool -genkey -keystore ./keys/mysample" -keyalg RSA

瞧:

我希望这对某人有帮助。

[编辑]在这里查看更好的echo服务器:http://svn.apache.org/repos/asf/mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/util/echoShellFactory.java

 类似资料:
  • 尝试通过Windows身份验证从Linux机器上运行的Java应用程序连接到MS SQL服务器。连接字符串: jdbc:sqlserver://192.168.1.50\SQLEXPRESS:1433;DatabaseName=MyData;integratedSecurity=true;authenticationScheme=JavaKerberos 出现连接错误: 如何理解此错误以及如何修复

  • 连接到服务器时出错:fatal:用户“postgres”的密码身份验证失败 fatal:用户“postgres”的密码身份验证失败

  • 我只想做一个upsert手术。我有一个JsonDocument,我有一个Couchbase服务器“123.456.789.1011”,里面有一个bucket,称为“TestBucket”。现在,当我使用端口8091的IP地址打开服务器时,它要求我输入用户名和密码,比如“uname”、“pwd”,输入后,它就打开了。我的桶没有任何密码。 这是我的代码,但问题总是在运行代码时,我会得到一个错误 Inv

  • 我已经按照文档中的说明配置了MongoDB服务器https://docs.mongodb.com/manual/core/security-x.509/我使用mongo shell连接,工作正常。 接下来,我尝试连接到相同的服务器form c#驱动程序,但引发超时异常。下面是我的代码 我通过MongoDB服务器日志,我可以看到下面的错误 2017-04-10T11:18:21.559 0530 I

  • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?

  • 问题内容: 是否可以做类似的事情: 在JAVA中类似于MongoVUE或其他基于SQL的数据库的身份验证方法。 在那里,身份验证是在连接数据库实例期间完成的。 我在MongoClient Java文档中看不到适当的实例方法 而在这样的认证(可选)官方文档 不符合我的目标,因为它需要更改应用程序中所有现在不使用身份验证的现有查询方法。 使用Java驱动程序对MongoDB进行身份验证的方式完全符合我