3

我想编写一个应用程序,它是一个具有两种连接类型的自定义 SSH 服务器:

  • 同步通道,客户端键入命令,服务器将返回输出
  • 用户连接并开始读取IO的流通道,服务器连续发布数据。

我在 Java 中这样做,我认为 Apache Mina SSHD 是正确的工具。我设法编写了一些用于身份验证的代码(感谢在网上找到的资源),并且可以在我的连接上运行 /bin/sh,所以我猜我已经完成了所有设置。问题是从现在开始我就被困住了,因为我对这些东西是如何工作的以及 Mina 的具体工作方式缺乏了解。

基本上我需要访问每个 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())

当然,您可以扩展实现以将所需的任何内容传递给命令。

该命令的实现是您定义 shell 行为的地方。

于 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 回答