3

2種類の接続を備えたカスタムSSHサーバーとなるアプリケーションを作成したいと思います。

  • クライアントがコマンドを入力し、サーバーが出力を返す同期チャネル
  • ユーザーが接続してIOの読み取りを開始するストリームチャネルであるサーバーは、データを継続的に公開します。

私はJavaでそれを行っていますが、ApacheMinaSSHDはそのための適切なツールだと思います。私はなんとか認証用のコードを書くことができ(ネット上にあるリソースのおかげで)、接続で/ bin / shを実行できたので、私はすべてセットアップされていると思います。問題は、これらがどのように機能するのか、そしてミナが具体的にどのように機能するのかについての知識が不足しているため、これから私が立ち往生していることです。

基本的に、SSH接続ごとに入力ストリームと出力ストリームにアクセスする必要があります。その後、自分で整理して、それを取得する正しい方法を購入できますか?

カスタムチャネルを作成する必要がありますか?カスタムシェル?コマンドのカスタムセット?

このテーマに関するリソースを教えてもらえますか?

4

2 に答える 2

2

私は解決策を見つけました:

まず、コマンドファクトリを実装する必要があります。これは次のように実行されます。

class CommandFactory extends Factory[Command] {

  override def create():Command = {
    new Command() {
      def destroy() {}

      def setInputStream(in: InputStream) {}

      def setErrorStream(err: OutputStream) {}

      def setOutputStream(out: OutputStream) {}

      def start(env: Environment) {}

      def setExitCallback(callback: ExitCallback) {}
    }
  }
}

次に、sshサーバーを次のように設定します。

sshd.setShellFactory(new CommandFactory())

もちろん、実装を拡張して、必要なものをすべてコマンドに渡すことができます。

コマンドの実装は、シェルの動作を定義する場所です。

于 2012-10-09T13:23:21.000 に答える
0

これは、質問自体に投稿された私のコメントのフォローアップです。

クライアント(クライアント)がリモートマシン(サーバー)のポートに直接アクセスできるように、またはSSHを介してサーバー(ゲートウェイ)と同じネットワーク上の別のコンピューターを介してアクセスできるようにするには、-Lフラグを使用する必要があります。

クライアントからサーバーに直接(クライアントのマシンのポート8080はサーバーの80にトンネリングします):

ssh -L 8080:localhost:80 server

ゲートウェイを介したクライアントからサーバーへ(クライアントのマシンのポート8080はサーバーの80にトンネリングします):

ssh -L 8080:server:80 gateway

sshのマニュアルページから、-Lフラグの使用方法は次のとおりです。

     -L [bind_address:]port:host:hostport
         Specifies that the given port on the local (client) host is to be
         forwarded to the given host and port on the remote side.  This
         works by allocating a socket to listen to port on the local side,
         optionally bound to the specified bind_address.  Whenever a
         connection is made to this port, the connection is forwarded over
         the secure channel, and a connection is made to host port
         hostport from the remote machine.  Port forwardings can also be
         specified in the configuration file.  IPv6 addresses can be
         specified by enclosing the address in square brackets.  Only the
         superuser can forward privileged ports.  By default, the local
         port is bound in accordance with the GatewayPorts setting.
         However, an explicit bind_address may be used to bind the
         connection to a specific address.  The bind_address of
         ``localhost'' indicates that the listening port be bound for
         local use only, while an empty address or `*' indicates that the
         port should be available from all interfaces.
于 2012-10-05T13:34:14.667 に答える