
eu já tinha feito essa pergunta emEstouro de pilha, mas me pediram para publicá-lo aqui. Então fazendo o mesmo.
Executei este comando usando meu programa java-
sudo -u <username> -S pwd
Eu recebi esta saída-
command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo
Tentei editar /etc/sudoers mas já contém
<username> ALL=(ALL) NOPASSWD: ALL
Então, aprendi que isso pode ser feito comentando o seguinte código em /etc/sudoers
# Defaults requiretty
Além disso, por padrão, ao tentar executar um comando como outro usuário usando sudo
, temos que fornecer nossa própria senha. Mas isso pode ser alterado fazendo a seguinte alteração em /etc/sudoers-
Defaults targetpw
Minha pergunta é,é possível executar meu comando acima em java sem fazer nenhuma alteração em qualquer lugar, ou seja, tendo configurações padrão?
Responder1
Não sei como executar comandos shell em Java, mas dê uma olhada na opção -t para o comando ssh
-t force pseudo-tty allocation.
Isso é o que eu faço quando preciso executar o comando como root sobre ssh (desativação de login root direto e tty exigido pelo sudo)
Responder2
Minha pergunta é: é possível executar meu comando acima em java sem fazer nenhuma alteração em qualquer lugar, ou seja, tendo configurações padrão?
sudo -u -S senha
A resposta curta é não, você precisará alterar as configurações para que o sudo faça as coisas de maneira diferente do que faz atualmente.
sudo pode ser a ferramenta errada para isso. As regras do Sudo existem para ajudar os administradores de sistema a configurar uma maneira de obter privilégios elevados que são difíceis de abusar para obter privilégios adicionais/não intencionais.
Se você considerar o que o sudo faz por você:
- solicita senha para verificar a identidade
- elevar privilégios
- então, opcionalmente, obtenha privilégios como outro usuário
- registra sudo usado para obter acesso ou executar comandos
Se você deseja que seu java execute comandos arbitrários como usuários arbitrários, sem fornecer senha para esses usuários ou para os seus, você está essencialmente substituindo o sudo. Nesse caso, você deve criar suas próprias regras sobre como evitar abusos.
Existem basicamente duas maneiras de fazer isso:
- execute seu java com privilégios elevados e cuidadosamente receba e devolva os privilégios necessários (consulte chamadas de função setuid() seteuid() C).
- execute um programa externo para obter privilégios elevados quando desejar
No caso nº 1, seu programa Java está executando o que o sudo faz, e você deve implementar seu próprio conjunto de regras para se proteger contra abusos.
Existem outros programas além do sudo para fazer o número 2. Um exemplo pode ser encontrado emhttps://code.google.com/archive/p/exec-wrapper/downloads
Este prático script de shell cria um programa C para executar outro comando (geralmente um script). Então você compila o programa C em um binário e marca esse setuid como root ou realmente pode ser setuid para qualquer usuário. (modo: 4555 e proprietário: root)
Contanto que você esteja em um sistema de arquivos que permita isso, a execução do programa binário executará o comando configurado como o ID do usuário que possui o próprio programa binário.