Minha pergunta é: é possível executar o comando acima em java sem fazer alterações em nenhum lugar, ou seja, com as configurações padrão?
sudo -u -S pwd
A resposta curta é não, você precisará alterar as configurações para que o sudo faça as coisas de maneira diferente do que 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, difíceis de abusar, para obter privilégios adicionais / não desejados.
Se você considerar o que o sudo faz por você:
- solicita senha para verificar a identidade
- elevar privilégios
- opcionalmente, obtenha privilégios como outro usuário
- logs sudo use 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 você, você está basicamente 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 obtenha e devolva cuidadosamente os privilégios necessários (consulte as chamadas de função C setuid () seteuid () C)).
- execute um programa externo para obter privilégios elevados quando desejar
No caso de # 1, seu programa java está executando o que o sudo faz, e você deve implementar seu próprio conjunto de regras para proteger contra abusos.
Existem outros programas além do sudo para fazer o 2. Um exemplo pode ser encontrado em https://code.google.com/archive/p/exec-wrapper/downloads
Esse prático script de shell cria um programa C para executar outro comando (geralmente um script). Em seguida, você compila o programa C em um binário e marca essa raiz setuid ou realmente pode ser setuid para qualquer usuário. (modo: 4555 e proprietário: root)
Enquanto você estiver em um sistema de arquivos que permita, 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.