¿Cómo sudo un comando en un script sin que me pidan una contraseña?

101

Quiero encender mi sistema automáticamente todos los días. Así que utilizo el siguiente código en mi script de Python, pero sudo me pide una contraseña cada vez:

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

¿Cómo puedo ejecutar este script sin sudo pidiendo la contraseña cada vez?

    
pregunta Viswa 25.06.2012 - 15:30

5 respuestas

138
  

Tenga en cuenta: ¡Cualquier método que implique poner su contraseña de inicio de sesión en texto plano, en un comando o en un archivo, es inseguro y NO debe utilizarse!

La forma correcta de hacerlo para configurar sudo de modo que solo el único comando específico que necesite, es decir, echo date... > rtc... , pueda ejecutarse SIN necesitar el contraseña.

Paso 1. Crea un script de shell con solo ese comando

  • Abra gedit (o su editor favorito) y cree el script, p. %código%
  • Inserta solo esta línea y guárdala en, p. su directorio de inicio:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Salga del editor, y desde la terminal, haga que el script ejecutable y cambie su propiedad a root , de lo contrario, otro usuario con acceso a su sistema podría editarlo y ejecute los comandos que desee como root sin necesidad de su contraseña:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Paso 2. Configure sudo para permitir que pydatertc.sh se ejecute sin requerir una contraseña

  • Escriba pydatertc.sh en la terminal para abrir el archivo sudo permissions ( sudo visudo )
  • Alrededor de la línea 25, verá esta línea: sudoers
  • Debajo de esa línea , inserta la siguiente línea, donde %sudo ALL=(ALL:ALL) ALL es tu nombre de usuario:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Salga del editor ( Ctrl + X si nano )

Paso 3. Modifica tu script de python para llamar a username

  • Cambiar la línea a:
    os.system('sudo /home/username/pydatertc.sh')

¡Ahora su script debería ejecutarse sin requerir una contraseña Y sin comprometer la seguridad de su cuenta, sus datos o su sistema!

Alternativa solo para pydatertc.sh (no para uso general!):

En este caso específico solamente , dado que el archivo wakealarm solo controla la alarma de activación del sistema y es inofensivo, otra alternativa para evitar la contraseña es tomar posesión de ese archive con /sys/class/rtc/rtc0/wakealarm (si usted es el único usuario que configura la alarma), o hágalo de escritura mundial con chown ; en ese caso, simplemente elimine el chmod +666 de su llamada de Python, dejando sudo intacto.

    
respondido por el ish 25.06.2012 - 16:53
29
  

¡Advertencia!

     

Poner su contraseña de inicio de sesión en texto plano, en un comando o archivo, es extremadamente inseguro y puede comprometer sus datos privados y su sistema. Es muy recomendable que nunca haga esto, incluso si cree que su sistema es "personal" o está en "una ubicación segura".

Si el guión es solo para uso personal y lo ha colocado en un lugar seguro y no tiene miedo de que su cuenta sea robada, hay una solución simple:

echo LOGINPASSWD | sudo -S COMMAND HERE

donde LOGINPASSWD es su contraseña de inicio de sesión (ejemplo: iloveponies) y COMANDO AQUÍ es su comando que viene después de sudo, como sh -c "echo da .. etc

    
respondido por el hytromo 25.06.2012 - 15:38
21

Si no le importa que el script se ejecute en un momento específico de la hora (o durante el día), colóquelo dentro del directorio raíz de root ( /root ) y ejecute el script desde el crontab del sistema ( /etc/crontab ) como root Entonces no tendrá que comprometer su seguridad.

Consulte enlace sobre cómo agregar el script al crontab.

    
respondido por el z7sg 25.06.2012 - 15:49
11

Otra buena característica relacionada de sudo que no se ha mencionado en las excelentes respuestas anteriores es la variable 'timestamp_timeout'. Es una variable de sudo que puede aumentar para ahorrar en la escritura de contraseñas interactiva.

Ejemplo, en / etc / sudoers (o uno de los archivos incluidos) puede modificar el valor predeterminado:

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

Descripción 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.

Por supuesto, esto no puede ayudar en el caso específico de ejecutar el comando desde cron. Pero es bueno tenerlo en cuenta.

    
respondido por el arielf 29.06.2012 - 23:10
1
export MY_SUDO_PASS="user_password_here"

Para probar si funciona:

echo $MY_SUDO_PASS
> user_password_here

Para ejecutar "sudo apt-get update", y aceptar la contraseña de las variables de entorno que creamos anteriormente:

echo $MY_SUDO_PASS | sudo -S apt-get update

Ejecutar desde python (ejemplo cambiando la propiedad del directorio recursivamente a 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 obtener la contraseña -S cambiar capturando y pasando la contraseña para sudo

    
respondido por el Jozsef Turi 15.03.2018 - 17:59

Lea otras preguntas en las etiquetas