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.

Foi útil?

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'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top