2

SSHD サーバーをセットアップするための Apache MINA のガイドに従おうとしていますが、PuTTY で接続するときに問題が発生します。ユーザー名を入力できますが、次のエラー メッセージが表示されます。 ここに画像の説明を入力

以下は私のサーバーのコードです。サーバーの認証方法を手動で設定する必要はありますか? それとも私は何か他のことを間違っていますか?

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();
4

1 に答える 1

7

私はちょうど私のために働くサンプルを作成しました。Putty を使用して Apache SSHD に接続します。私が使用したライブラリのバージョンは「apache-sshd-0.9.0」(2014-02-04 にダウンロード) でした。JDK1.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

そして出来上がり:

このサンプルの結果

これが誰かの役に立てば幸いです。

[編集] さらに優れたエコー サーバーについては、こちらをご覧ください: http://svn.apache.org/repos/asf/mina/sshd/trunk/sshd-core/src/test/java/org/apache/sshd/ユーティリティ/EchoShellFactory.java

于 2014-02-04T13:30:36.590 に答える