Executando comandos UNIX como usuário diferente, de Java
Pergunta
Tentando escrever um programa Java capaz de executar um comando UNIX como um usuário UNIX diferente.Eu tenho a senha do usuário e sei o comando que desejo executar, mas o comando deve ser executado como esse usuário - portanto, primeiro preciso fazer o login como esse usuário.
Por exemplo:digamos que temos um usuário, Jim, que deseja ver o que está no diretório inicial de Bob e (por qualquer motivo) Jim tem acesso para executar ls, enquanto Bob não. No momento estamos logados como bob.Aqui está o que nós (poderíamos) fazer:
bob@host$ su jim && ls ~bob
O problema é que somos solicitados a fornecer a senha de Jim.Como isso é executado a partir de um programa Java, ou seja,
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
somos solicitados a fornecer a senha de Jim e desligamos. Sabemos a senha de Jim.No entanto, não consigo entrar.
Além disso, não podemos usar um script Expect (não o temos instalado) e não podemos nos tornar o superusuário.Também pensei em usar SSH para tentar isso, já que tecnicamente poderíamos fazer
bob@host$ ssh jim@host "ls ~bob"
mas isso também não funciona, pois não tenho permissão para configurar o SSH sem senha.
Meu último esforço é tentar usar uma biblioteca SSH para Java, já que a senha está disponível para o programa Java e eu seria capaz de fazer login com ela (e executar o comando apropriado).Mas como vou rodar no mesmo host, parece um exagero.
Alguma sugestão?
P.S:Java versão 1.4.2, não é possível atualizar;AIX UNIX 5.3.
Solução 2
Problema resolvido.JSch usado (http://www.jcraft.com/jsch/) para SSH no servidor com nome de usuário e senha conhecidos e execute o comando.Obrigado a todos por suas sugestões!
Outras dicas
Instale o sudo, faça com que o usuário executando o programa Java insira /etc/sudoers para os comandos em questão e use sudo -u jim ls ~bob
.
Possivelmente uma implementação java do Expect? EspereJ aparece ao pesquisar no Google, mas não consegui encontrar nenhuma documentação sobre a execução em 1.4.2.
Você já tentou redirecionar a entrada dos comandos sudo e escrever nele.Faz algum tempo que não uso Java, mas acredito que haja uma maneira de obter o fluxo de entrada e gravar nele.Você pode usar isso para escrever a senha seguida por uma nova linha e sudo ou su deve aceitar a senha.
Use getInputStream() e escreva sua senha nele.
su jim -c ls ~Bob
Talvez isso funcionasse:
Process process = Runtime.getRuntime().exec("su jim && ls ~bob");
OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();
Não tenho certeza deste código:
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
será executado em um shell, necessário para avaliar o &&, que é um comando shell (/bin/sh).Você deve passar o comando "ls ~bob" através de uma linha de comando com su.Algo como:
su jim -c 'ls ~bob'