对于应用间通信使用SSH连接(Using SSH connection for inter appl

2019-09-23 14:05发布

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

  • 同步信道,在这里客户键入命令和服务器将返回输出
  • 其中用户连接并开始读取IO的流道,所述服务器连续地发布数据。

我这样做,在Java中,我认为Apache米娜SSHD在了正确的工具。 我设法编写一些代码进行验证(感谢在网上能找到的资源),可能我的连接上运行/ bin / sh的,所以我所有的设置,我猜。 问题是,从现在开始我坚持,因为这些东西是如何工作和Mina是如何工作的专门知识的缺乏。

基本上,我需要访问每个SSH连接的输入和输出流,在那之后我可以理清事情我自己,买什么来获取正确的方式?

我应该做一个自定义频道? 自定义的壳呢? 一组自定义的命令?

可以在任何一个点我的资源,关于这个问题的?

Answer 1:

我已经找到了解决办法:

首先,你必须执行命令的工厂,这是如下进行:

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的行为。



Answer 2:

这是一个后续我的评论发布到问题本身。

要允许客户端(客户端)访问直接或通过同一个网络服务器(网关)通过SSH在另一台计算机的远程计算机(服务器)上的端口,你只需要使用-L标志。

从客户端到服务器直接(在客户端的机器将隧道80在服务器上的8080端口):

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.


文章来源: Using SSH connection for inter application communication