Como inserir senha para o sudo usando o Java Runtime?

Eu preciso executar os comandos fornecidos como usuário root e sudo usando Java. No entanto, não tenho certeza sobre o método que posso usar para passar a senha. Existe uma maneira pela qual eu possa passar a senha para o terminal?

Você poderia simplesmente colocar o sodu todo junto e criar um script de shell suid root e executá-lo.

chmod +s myscript && chown root myscript && chgrp root myscript 

sempre que esse script for chamado, ele será executado como root.

Você pode configurar o sudo para permitir que um comando específico seja executado sem uma senha. Isso não requer que você saiba a senha.

Ter a senha de root no programa, que tem que ser texto claro em algum momento, é na verdade IMHO menos seguro.

Normalmente, o sudo lê a senha operando diretamente no terminal. Você deveria usar o sudo -S aqui. Com essa opção, ele tentará ler a senha a partir da input padrão e, em seguida, poderá enviá-la por meio do OutputStream obtido do Process criado pelo Runtime.exec() ao executar o comando.

É possível fazer de uma máquina para outra usando ssh ou scp se você configurar o ssh sem senha. Esse é um método usado para clusters de máquinas que precisam trabalhar juntos e são controlados por um nó principal. Por exemplo, o hadoop usa esse método.

Será melhor se você criar um script no terminal e chamá-lo de Java (usando Runtime.exec)

Como vocês já mencionaram, você pode usar o sudo somente se o seu uso atual estiver configurado no sistema como um que pode rodar o sudo . Caso contrário (no caso geral) você tem que digitar a senha.

Você precisa digitar a senha se quiser executar comandos em computadores remotos usando ssh ou copiar arquivos remotamente usando o scp .

Alguns comandos podem aceitar senha como um parâmetro da linha de comando. Por exemplo, o utilitário mysql pode aceitar senha após alternar -p . Alguns outros comandos são mais estritos: eles não excluem a senha na linha de comando e nem permitem que você forneça a senha através do redirecionamento do stdin do processo. Exemplos são ssh e scp .

A única maneira de ter certeza de que você sempre pode executar programaticamente qualquer comando que exija digitar a senha é emular o terminal. Isso é o que a utilidade expect . Dê uma olhada na sua página man: http://linux.die.net/man/1/expect

Eu usei expect no passado. é um utilitário guiado por script que permite simular as ações do usuário exatamente como o usuário humano está fazendo quando está trabalhando com o terminal. Nós executamos o script expect do java como um processo externo regular usando o ProcessBuilder .

Eu precisava usar o ProcessBuilder para executar o tcpdump. Aqui está como eu fiz:

visudo myuser ALL = NOPASSWD: / usr / sbin / tcpdump

Em seguida, meu comando do Java foi executado a partir do myuser: / usr / bin / sudo / usr / sbin / tcpdump -i porta eth0 8561 …