我想编写一个应用程序,它是一个具有两种连接类型的自定义SSH服务器:
我在Java中这样做,我认为Apache Mina SSHD就是正确的工具。我设法编写了一些用于身份验证的代码(感谢网上找到的资源),并且可以在我的连接上运行/ bin / sh,所以我想我都是设置的。问题是,从现在开始,由于缺乏关于这些事情如何运作以及Mina如何专门工作的知识,我才陷入困境。
基本上我需要访问每个SSH连接的输入和输出流,之后我可以自己解决问题,买什么是正确的方法来获得它?
我应该制作自定义频道吗?自定义Shell?一组自定义命令?
有没有人能指出我有关这个问题的资源?
答案 0 :(得分:2)
我找到了解决方案:
首先,你必须实现一个Command工厂,完成如下:
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行为的地方。
答案 1 :(得分: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.