2017-07-29 77 views
0

使用Apache Mina,我试图让某些用户运行某些自定义的SSH命令。但我无法弄清楚如何获取用户名或CommandFactory中关于用户的任何类型的信息。Apache Mina:收到命令后获取用户的用户名

现在,我的服务器配置是这样的:

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类的样子:

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做我/ O操作,并且SshCommandManager解释在SshSessionCommandWriter中读取的命令,并向客户端返回一个值。

如果我能找到一种方式来获取运行该命令的用户的用户名,那对我的用例来说是完美的。我目前在​​和SshPasswordAuthenticator中有此信息,但不在SshShellFactory中。

回答

0

因此,我创建的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); 
    } 
}