desculpe, você deve ter um tty para rodar o sudo

13

Já fiz essa pergunta em Stack Overflow , mas me pediram para postar aqui. Então, fazendo o mesmo.

Eu executei este comando usando meu programa java -

sudo -u <username> -S pwd

Eu tenho esta saída -

command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo

Eu tentei editar o / etc / sudoers, mas ele já contém

<username>       ALL=(ALL)       NOPASSWD: ALL

Depois, 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, por exemplo, com configurações padrão ?

    
por AlwaysALearner 19.08.2013 / 10:54

2 respostas

3

Eu não sei como executar comandos shell em Java, mas veja a opção -t para o comando ssh

-t force pseudo-tty allocation.

Isso é o que eu faço quando eu preciso executar o comando como root sobre ssh (login root direto disable e tty exigido pelo sudo)

    
por 12.11.2013 / 08:51
1

My Question is, is it possible to execute my above command in java without making any changes anywhere i.e. by having default settings?

sudo -u -S pwd

A resposta curta é não, você precisará alterar as configurações para fazer com que o sudo faça as coisas de maneira diferente da atual.

sudo pode ser a ferramenta errada para isso. As regras do Sudo estão lá para ajudar os administradores de sistemas 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ê:

  1. solicita senha para verificar a identidade
  2. elevar privilégios
  3. então, opcionalmente, obtenha privilégios como outro usuário
  4. registra o uso do sudo para obter acesso ou executar comandos

Se você quiser que seu java execute comandos arbitrários como usuários arbitrários sem fornecer senha para esses usuários ou para os seus próprios, você está essencialmente substituindo o sudo. Nesse caso, você deve criar suas próprias regras para evitar o abuso.

Existem basicamente duas maneiras de fazer isso:

  1. execute seu java com privilégios elevados e cuidadosamente obtenha e devolva os privilégios necessários (consulte as chamadas de função C setuid () seteuid ()).
  2. 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 abuso.

Existem outros programas além do sudo para fazer # 2. Um exemplo pode ser encontrado no link

Este prático script de shell cria um programa em C para executar outro comando (geralmente um script). Em seguida, você compila o programa em C para um binário e marca a raiz do setuid 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 o permita, rodar o programa binário executará o comando configurado como o ID do usuário que possui o próprio programa binário.

    
por 07.07.2016 / 20:31