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?


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.


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


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.


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.


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


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