Apache Mina:在收到命令后获取用户的用户名
Apache Mina: Get the user's username upon receiving a command
使用 Apache Mina,我试图允许某些用户 运行 某些自定义 SSH 命令。但我无法弄清楚如何在 CommandFactory
中获取用户名或有关用户的任何类型的信息。
现在,我的服务器配置如下所示:
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPasswordAuthenticator(new SshPasswordAuthenticator());
sshd.setPort(localServerPort);
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setShellFactory(new SshShellFactory());
sshd.setSessionFactory(new SshSessionFactory());
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("my.pem").getAbsolutePath()));
sshd.setFileSystemFactory(new VirtualFileSystemFactory(path.getAbsolutePath()));
List<NamedFactory<Command>> namedFactoryList = new ArrayList<>();
namedFactoryList.add(new SftpSubsystem.Factory());
sshd.setSubsystemFactories(namedFactoryList);
这就是我的 SshShellFactory
class 的样子:
import org.apache.sshd.common.Factory;
import org.apache.sshd.server.session.SessionFactory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.CommandFactory;
public class SshShellFactory implements CommandFactory, Factory<Command> {
@Override
public Command createCommand(String command) {
return new SshSessionCommandWriter();
}
@Override
public Command create() {
return createCommand("none");
}
}
其中 ServerVariables
存储与我的软件相关的变量,SshSessionCommandWriter
对流进行 I/O 操作,SshCommandManager
解释在 SshSessionCommandWriter
和 returns 对客户的价值。
如果我能找到一种方法以某种方式获取用户的用户名 运行ning 命令,那将非常适合我的用例。我目前在 SshSessionFactory
和 SshPasswordAuthenticator
中有此信息,但在 SshShellFactory
.
中没有
所以我创建的 SshSessionCommandWriter
对象必须实现 Command
接口。此命令接口在其合同中具有方法 public void start(Environment env)
。原来用户名存储在环境变量中:
public class SshSessionCommandWriter implements Command, Runnable {
@Override
public void start(Environment env) throws IOException {
String username = env.getEnv().get(Environment.ENV_USER);
}
}
使用 Apache Mina,我试图允许某些用户 运行 某些自定义 SSH 命令。但我无法弄清楚如何在 CommandFactory
中获取用户名或有关用户的任何类型的信息。
现在,我的服务器配置如下所示:
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPasswordAuthenticator(new SshPasswordAuthenticator());
sshd.setPort(localServerPort);
sshd.setCommandFactory(new ScpCommandFactory());
sshd.setShellFactory(new SshShellFactory());
sshd.setSessionFactory(new SshSessionFactory());
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("my.pem").getAbsolutePath()));
sshd.setFileSystemFactory(new VirtualFileSystemFactory(path.getAbsolutePath()));
List<NamedFactory<Command>> namedFactoryList = new ArrayList<>();
namedFactoryList.add(new SftpSubsystem.Factory());
sshd.setSubsystemFactories(namedFactoryList);
这就是我的 SshShellFactory
class 的样子:
import org.apache.sshd.common.Factory;
import org.apache.sshd.server.session.SessionFactory;
import org.apache.sshd.server.Command;
import org.apache.sshd.server.CommandFactory;
public class SshShellFactory implements CommandFactory, Factory<Command> {
@Override
public Command createCommand(String command) {
return new SshSessionCommandWriter();
}
@Override
public Command create() {
return createCommand("none");
}
}
其中 ServerVariables
存储与我的软件相关的变量,SshSessionCommandWriter
对流进行 I/O 操作,SshCommandManager
解释在 SshSessionCommandWriter
和 returns 对客户的价值。
如果我能找到一种方法以某种方式获取用户的用户名 运行ning 命令,那将非常适合我的用例。我目前在 SshSessionFactory
和 SshPasswordAuthenticator
中有此信息,但在 SshShellFactory
.
所以我创建的 SshSessionCommandWriter
对象必须实现 Command
接口。此命令接口在其合同中具有方法 public void start(Environment env)
。原来用户名存储在环境变量中:
public class SshSessionCommandWriter implements Command, Runnable {
@Override
public void start(Environment env) throws IOException {
String username = env.getEnv().get(Environment.ENV_USER);
}
}