Su sem senha em um script Bash?

1

Eu enfrentei um dilema ao migrar uma instalação do Hadoop do Oracle Enterprise Linux para o Ubuntu. O desenvolvedor anterior colocou o seguinte comando em rc.local dentro do OEL:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

Eu preciso do servidor web acima para iniciar automaticamente (e parar) no Ubuntu como o usuário reporter especificado. (O material de automação é muito menos importante do que fazer esse script ser executado corretamente como o usuário reporter , mas é um recurso "interessante").

Esse processo precisa ser iniciado por último, pois ainda preciso configurar alguns outros scripts relacionados ao Hadoop para serem iniciados automaticamente antes deste (o servidor da Web reside no sistema de arquivos Hadoop, que não é montado até que você esteja no sistema operacional). Toda vez que eu emito o comando su , recebo uma senha. Isso ocorre independentemente de qual usuário está "ativo" no momento e não foi um problema no OEL, pois o usuário raiz é realmente usado. Aqui está minha tentativa atual de um arquivo / etc / sudoers, mas ele ainda não está funcionando (não tenho certeza se as alterações que fiz na parte inferior estão corretas):

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification

# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# User privilege specification
root    ALL=(ALL) ALL
user3 ALL=(ALL)NOPASSWD:/bin/su
user2 ALL=(ALL)NOPASSWD:/bin/su
user1 ALL=(ALL)NOPASSWD:/bin/su
reporter ALL=(ALL)NOPASSWD:/bin/su

Esta é uma cópia de um tópico que postei no UbuntuForums.org ( link ), mas Estou desesperado por uma resposta = P. Por favor, note que meu conhecimento de Linux ainda é fraco (eu não sabia quase nenhum Linux antes que este projeto fosse descartado no meu colo). Qualquer ajuda é muito apreciada, pois este é atualmente um grande obstáculo!

Obrigado -Snipe

    
por Sniperm4n 20.06.2012 / 02:13

2 respostas

2

Suas edições atuais em /etc/sudoers permitem que user1 , user2 , user3 e reporter executem qualquer ação como root (já que executar su permite que você se torne root )! Você quase certamente não quer isso. E isso não ajuda em nada o seu problema atual, porque você não quer que esses usuários executem algo com uma identidade alternativa, você quer que root execute algo com uma identidade alternativa. Antes de prosseguir, recomendo livrar-se dessas linhas de /etc/sudoers (edite-as com visudo , é claro), a menos que você tenha absoluta certeza de que é isso que deseja.

Se você é um usuário não com root e executa isso, sempre será solicitada uma senha:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

Mas quando root executa isso, ele deve simplesmente ter sucesso (assumindo que funcionou antes no Oracle Enterprise Server e a única diferença relevante é que root login está desativado no Ubuntu).

Quando você coloca essa linha em rc.local , em qualquer distribuição GNU / Linux, incluindo o Ubuntu, ela é executada como root . Deve apenas funcionar. Quando você executá-lo a partir da linha de comando, não funcionará. Mas em rc.local , deve funcionar.

Se você quiser testá-lo a partir da linha de comando, atribua a você mesmo um root do tipo semelhante ao ambiente de rc.local :

sudo -i

(Isso simula um shell% login root inicial. Normalmente, para um shell root , use sudo -s . E, claro, para executar um comando ... com sudo , use apenas sudo ... . )

su -c e sudo têm uma sintaxe diferente, por isso, se você quiser usar esse comando usando sudo em vez de su , será necessário fazer outras alterações. A maneira mais fácil é provavelmente:

sudo -u reporter bash -c "cd /path/to/directorywithscript && ./runwebserver.sh >> /dev/null 2>&1&"

No entanto, enfatizo que você não precisa converter os comandos su em sudo para que eles sejam executados adequadamente em rc.local .

No Ubuntu, ao contrário do Oracle Enterprise Server, o login como root é desativado por padrão (e você quase certamente não deve ativá-lo). Mas su ainda funciona quando é executado por root . su também funciona para um usuário que não seja root , alterando a identidade para outro usuário que não seja root .

Se você tem essa linha em rc.local e não está funcionando, o motivo não são problemas de sudo vs. su . Nesse caso, algo está errado. Para que possamos solucionar o problema, você precisa fornecer o conteúdo de runwebserver.sh .

Por fim, observe que bash runwebserver.sh >> /dev/null 2>&1& é bastante deselegante. É mais simples de entender (e, muito menos importante, parece melhor) usar bash runwebserver.sh &>> /dev/null . Você disse que isso é o último em rc.local , então você não precisa usar & para contextualizá-lo.

No entanto, você deve considerar se realmente deseja suprimir erro padrão , bem como saída padrão (como você está fazendo atualmente). Presumivelmente, se algo é escrito para erro padrão, então é importante ou pode ser suprimido, alterando as configurações de verbosidade do seu servidor web.

    
por Eliah Kagan 20.06.2012 / 02:40
0

Se você não quer ser perguntado por uma senha, você terá que usar para executar su como root, então você terá que usar:

sudo su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

No entanto, acho que o que você está tentando fazer é uma ideia muito ruim, você está permitindo que cada usuário faça o login como qualquer outra pessoa, incluindo root.

    
por konairius 20.06.2012 / 02:42