Como posso sujar um comando em um script sem precisar de uma senha?

101

Quero ativar meu sistema automaticamente todos os dias. Então eu uso o código abaixo no meu script Python, mas sudo me pede uma senha toda vez:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Como posso executar este script sem sudo pedindo a senha toda vez?

    
por Viswa 25.06.2012 / 15:30

5 respostas

137

  

Por favor note: Qualquer método que envolva colocar sua senha de login em texto simples, em um comando ou em um arquivo, é inseguro e NÃO deve ser usado!

A maneira correta de fazer isso para configurar sudo de modo que somente o comando específico que você precisa, ou seja, echo date... > rtc... , seja permitido para ser executado SEM precisar do senha.

Etapa 1. Crie um script de shell apenas com esse comando

  • Abra gedit (ou o seu editor favorito) e crie o script, por ex. %código%
  • Insira somente esta linha e salve-a, por exemplo seu diretório home:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Encerre o editor e, no terminal, torne o script executável e altere sua propriedade para root , caso contrário, outro usuário com acesso ao sistema poderá editá-lo e execute os comandos que quiser como root sem precisar da sua senha:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Etapa 2. Configure o sudo para permitir que pydatertc.sh seja executado sem exigir uma senha

  • Digite pydatertc.sh no terminal para abrir o arquivo de permissões sudo ( sudo visudo )
  • Na linha 25, você verá esta linha: sudoers
  • Abaixo dessa linha , insira a seguinte linha, em que %sudo ALL=(ALL:ALL) ALL é seu nome de usuário:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Saia do editor ( Ctrl + X se nano )

Etapa 3. Modifique seu script python para chamar username

  • Altere a linha para:
    os.system('sudo /home/username/pydatertc.sh')

Agora, seu script deve ser executado sem a necessidade de uma senha AND sem comprometer a segurança de sua conta, seus dados ou seu sistema!

Alternativa apenas para pydatertc.sh (não para uso geral!):

Em apenas neste caso específico , como o arquivo wakealarm controla apenas o alarme de ativação do sistema e é inofensivo, outra alternativa para evitar a senha é apropriar-se disso arquivo com /sys/class/rtc/rtc0/wakealarm (se você for o único usuário definindo o alarme) ou torná-lo gravável em todo o mundo com chown ; Nesse caso, basta remover o chmod +666 da sua chamada do Python, deixando sudo intacto.

    
por ish 25.06.2012 / 16:53
29
  

Atenção!

     

Colocar sua senha de login em texto simples, em um comando ou arquivo, é extremamente inseguro e pode comprometer seus dados privados e seu sistema. É altamente recomendável que você nunca faça isso, mesmo que considere seu sistema "pessoal" ou em um "local seguro"!

Se o script for apenas para uso pessoal e você o colocou em um local seguro e não tem medo de que sua conta seja roubada e tal, então aqui está uma solução simples:

echo LOGINPASSWD | sudo -S COMMAND HERE

em que LOGINPASSWD é sua senha de login (por exemplo: iloveponies) e COMANDO AQUI é o seu comando que vem depois do sudo, como sh -c "echo da .. etc

    
por hytromo 25.06.2012 / 15:38
21

Se você não se importar com o script sendo executado em um horário específico na hora (ou durante o dia), coloque-o dentro do diretório pessoal do root ( /root ) e execute o script a partir do crontab do sistema ( /etc/crontab ) como root. Então você não terá que comprometer sua segurança.

Veja link para saber como adicionar o script ao crontab.

    
por z7sg 25.06.2012 / 15:49
11

Outro recurso interessante do sudo que não foi mencionado nas respostas excelentes acima é a variável 'timestamp_timeout'. É uma variável sudo que você pode aumentar para economizar na digitação interativa de senhas.

Exemplo, em / etc / sudoers (ou um dos arquivos incluídos a partir dele) você pode modificar o padrão:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Descrição completa de 'man sudoers':

  

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Claro, isso não pode ajudar no caso específico de executar o comando do cron. Mas é bom estar ciente disso.

    
por arielf 29.06.2012 / 23:10
1
export MY_SUDO_PASS="user_password_here"

Para testar se está funcionando:

echo $MY_SUDO_PASS
> user_password_here

Para executar "sudo apt-get update", aceite a senha das variáveis de ambiente que criamos antes:

echo $MY_SUDO_PASS | sudo -S apt-get update

Executar a partir do python (exemplo de alteração da propriedade do diretório recursivamente para username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS pega o comando password -S pegando e passando a senha para sudo

    
por Jozsef Turi 15.03.2018 / 17:59

Tags