Como sudo um comando em um script sem ser solicitada uma senha?

107

Quero ligar meu sistema automaticamente todos os dias. Então, eu uso o código abaixo no meu script Python, mas sempre sudosolicita uma senha:

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

Como posso executar esse script sem sudosolicitar a senha todas as vezes?

Viswa
fonte
4
Você deve procurar no manual da placa-mãe ou no BIOS para ver se ele suporta esse comportamento. Eu sei que isso se esquiva da pergunta! =] Mas pode ser uma solução suficiente.
Alex Hirzel

Respostas:

149

Observação: qualquer método que envolva colocar sua senha de login em texto sem formatação, em um comando ou em um arquivo é inseguro e NÃO deve ser usado!

A maneira correta de fazê-lo é a instalação, de sudomodo que apenas um comando específico de que você precisa, ou seja echo date... > rtc..., tenha permissão para ser executado SEM precisar da senha.

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

  • Abra gedit(ou seu editor favorito) e crie o script, por exemplopydatertc.sh
  • Insira apenas esta linha e salve-a em, por exemplo, seu diretório pessoal:
    data do eco \ '+% s \' -d \ '+ 24 horas \'> / sys / class / rtc / rtc0 / wakealarm
  • Saia do editor e, no terminal, torne o script executável e altere sua propriedade para root , caso contrário, outro usuário com acesso ao seu sistema poderá editá-lo e executar os comandos que quiserem 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 pydatertc.sha execução sem exigir uma senha

  • Digite sudo visudono terminal para abrir o sudoersarquivo sudo Permissions ( )
  • Na linha 25, você verá esta linha: %sudo ALL=(ALL:ALL) ALL
  • Abaixo dessa linha , insira a seguinte linha, onde usernameestá o seu nome de usuário:
    nome de usuário ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Saia do editor ( Ctrl+ Xse nano )

Etapa 3. Modifique seu script python para chamar pydatertc.sh

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

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


Alternativa apenas para wakealarm(não para uso geral!):

Apenas neste caso específico , como o /sys/class/rtc/rtc0/wakealarmarquivo controla apenas o alarme de ativação do sistema e é inofensivo, outra alternativa para evitar a senha é se apropriar desse arquivo chown(se você é o único usuário que define o alarme) ou torná-lo gravável no mundo chmod +666; nesse caso, basta remover a sudochamada de Python, deixando sh -c "...."intacta.

ish
fonte
11
Impressionante, esta é a maneira correta de fazer isso.
roadmr
11
Uma resposta tão detalhada e útil e exatamente como deve ser feita.
ArtOfCode
@RobertRosati, muito obrigado pela sua edição sugerida - eu não deveria ter esquecido isso em primeiro lugar!
Ish
11
@ m-ric Você leu o comando acima destas linhas? "caso contrário outro usuário com acesso ao seu sistema poderia editá-lo e executar o que quer que os comandos que eles querem como root sem necessidade de password"
Tobias KIENZLER
2
Sei que essa resposta é antiga - mas ainda há um problema aqui: se o arquivo estiver localizado em / home / nome de usuário , o sistema poderá ser comprometido se esse diretório for gravável por um usuário mal-intencionado (ou um login não raiz que seja comprometido) . Eles poderiam remover ou renomear o arquivo, colocar outro script em seu lugar e executá- lo via sudo- sem uma senha. Portanto, é muito mais seguro colocar o script em um diretório que somente o root possa alterar, por exemplo: / usr / sbin ou / root . Caso contrário, é LGTM.
NVRAM 10/01
30

Aviso!

Colocar sua senha de login em texto sem formatação, em um comando ou arquivo, é extremamente inseguro e pode comprometer seus dados privados e seu sistema. É altamente recomendável nunca fazer isso, mesmo se você achar que seu sistema é "pessoal" ou em um "local seguro"!

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

echo LOGINPASSWD | sudo -S COMMAND HERE

onde LOGINPASSWD é sua senha de login (exemplo: iloveponies) e COMMAND HERE é seu comando que vem após o sudo, como sh -c "echo da .. etc

hytromo
fonte
13
@ Viswa, observe que isso é muito, muito perigoso, para revelar a senha em texto simples. Você é altamente aconselhado, não fazer isso
Anwar
3
-1 Se isso parecer uma boa ideia, seria melhor definir uma senha na sua conta root e usar a solução do z7sg; isso é fácil e não cria esse problema de segurança muito perigoso.
Bryce
4
Hah! Eu tive 6 votos positivos e 4 negativos na minha resposta :) Mas por que pessoal, eu não estava claro 'Uso pessoal', 'lugar seguro' etc? Não há um problema de segurança, a menos que você forneça este arquivo e tenha um servidor ssh em execução! Onde você vê o problema de segurança, desde que o script seja para uso pessoal e em local seguro?
Hytromo 26/06/12
5
Com voto negativo, este é o caminho para o lado sombrio e não é necessário com o método sudo.
Floyd
4
Ok, diga-me, mesmo que o hacker tenha feito login como usuário simples na sua conta, como diabos ele encontrará o script com sua senha em / usr / share / help / lv / ubuntu-help?
Hytromo 28/07/12
21

Se você não se importa com o script em execução em um horário específico da hora (ou durante o dia), coloque-o no diretório inicial do root ( /root) e execute o script no sistema crontab ( /etc/crontab) como root. Então você não precisará comprometer sua segurança.

Veja https://help.ubuntu.com/community/CronHowto para saber como adicionar o script ao crontab.

z7sg
fonte
4
Você provavelmente pode querer usar anacronse for um desktop / laptop que não seja executado 24 horas por
dia
Esta é uma resposta útil, por exemplo, se você estiver escrevendo o script para verificar atualizações, fazer algo com essas informações e enviar um email ao administrador sobre as atualizações necessárias. Pessoalmente, muitos dos meus scripts são usados ​​para automação do servidor; portanto, apenas o uso do sudo crontab -e é o que eu costumava fazer. +1
Rab
11

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

Por exemplo, em / etc / sudoers (ou em um dos arquivos incluídos), 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.

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

arielf
fonte
0
export MY_SUDO_PASS="user_password_here"

Para testar se está funcionando, digite:

echo $MY_SUDO_PASS
> user_password_here

Para executar "sudo apt-get update" e aceitar a senha das variáveis ​​de ambiente que criamos anteriormente:

echo $MY_SUDO_PASS | sudo -S apt-get update

Execute a partir do python (exemplo, alterando a 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 get -S da senha do switch pegando-o e passando a senha para o sudo

jturi
fonte
Eu não tenho certeza do que isso contribui para as respostas existentes suporte de BIOS mais atual vigília em caso de alarme ...
Elder Geek