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


13

Eu já fiz essa pergunta no Stack Overflow , mas fui solicitado a publicá-la aqui. Então, fazendo o mesmo.

Eu executei este comando usando meu programa java

sudo -u <username> -S pwd

Eu tenho essa 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

Aprendi então 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 sudo, precisamos 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 o comando acima em java sem fazer alterações em nenhum lugar, ou seja, com as configurações padrão ?


1
É por isso que você estava pedindo a alternativa bastante artificial para o sudo ?
slhck 19/08/13

6
Parece uma distribuição específica se requirettyestiver ativada por padrão. De acordo com sudoa própria documentação , é "desativado por padrão".
Mpy19 de

Respostas:


3

Eu 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.

É o que faço quando preciso executar o comando como root over ssh (desabilitação direta do login root e tty exigido pelo sudo)


1
Embora essa abordagem possa resolver o problema à primeira vista, não está claro como ele está relacionado à questão. Poderia explicar em mais detalhes?
Pabouk

1
+1 para resolver o problema sem precisar alterar as configurações padrão.
Luke

1

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ê:

  1. solicita senha para verificar a identidade
  2. elevar privilégios
  3. opcionalmente, obtenha privilégios como outro usuário
  4. 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:

  1. 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)).
  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 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.