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

107

Quiero encender mi sistema automáticamente todos los días. Así que uso el siguiente código en mi script Python, pero siempre sudome pide una contraseña:

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

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

Viswa
fuente
44
Debe consultar el manual de su placa base o el BIOS para ver si es compatible con este comportamiento. ¡Sé que esquiva la pregunta! =] Pero puede ser una solución suficiente.
Alex Hirzel

Respuestas:

149

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 usarse!

La forma correcta de hacerlo para la configuración de sudotal manera que soloecho date... > rtc... se pueda ejecutar el comando específico que necesita, es decir , sin necesidad de la contraseña.

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

  • Abre gedit(o tu editor favorito) y crea el script, por ejemplopydatertc.sh
  • Inserte solo esta línea y guárdela, por ejemplo, en su directorio de inicio:
    echo date \ '+% s \' -d \ '+ 24 horas \'> / sys / class / rtc / rtc0 / wakealarm
  • Salga del editor y desde el terminal, ejecute el script y cambie su propiedad a root , de lo contrario, otro usuario con acceso a su sistema podría editarlo y ejecutar 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 pydatertc.shejecutar sin requerir una contraseña

  • Escriba sudo visudoen la terminal para abrir el sudoersarchivo sudo permissions ( )
  • Alrededor de la línea 25, verá esta línea: %sudo ALL=(ALL:ALL) ALL
  • Debajo de esa línea , inserte la siguiente línea, donde usernameestá su nombre de usuario:
    nombre de usuario ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Salga del editor ( Ctrl+ Xsi nano )

Paso 3. Modifique su script de Python para llamar pydatertc.sh

  • Cambia 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 wakealarm(¡no para uso general!):

Solo en este caso específico , dado que el /sys/class/rtc/rtc0/wakealarmarchivo 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 archivo chown(si usted es el único usuario que configura la alarma) , o hacer que se pueda escribir en el mundo con chmod +666; en ese caso, simplemente elimine el sudode su llamada a Python, dejándolo sh -c "...."intacto.

ish
fuente
1
Impresionante, esta es la forma correcta de hacerlo.
roadmr
1
Una respuesta tan detallada y útil y exactamente cómo se debe hacer.
ArtOfCode
@RobertRosati, muchas gracias por su edición sugerida. ¡No debería haberlo olvidado en primer lugar!
ish
1
@ m-ric ¿Leyó el comando sobre estas líneas? "De lo contrario, otro usuario con acceso a su sistema podría editarlo y ejecutar los comandos que desee como root sin necesidad de su contraseña"
Tobias Kienzler
2
Me doy cuenta de que esta respuesta es antigua, pero todavía hay un problema aquí: si el archivo se encuentra en / home / username , el sistema puede verse comprometido si un usuario malintencionado puede escribir ese directorio (o un inicio de sesión no root que es comprometido) . Podrían eliminar o cambiar el nombre del archivo, colocar otro script en su lugar y ejecutar ese script a través de sudo, sin contraseña. Por lo tanto, es mucho más seguro colocar el script en un directorio que solo la raíz pueda alterar, por ejemplo: / usr / sbin o / root . De lo contrario, es LGTM.
NVRAM
30

¡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. ¡Se recomienda encarecidamente nunca hacer esto, incluso si cree que su sistema es "personal" o está en una "ubicación segura"!

Si el script es solo para uso personal y lo ha colocado en un lugar seguro y no tiene miedo de que le roben su cuenta, entonces aquí 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 COMMAND AQUÍ es su comando que viene después de sudo, como sh -c "echo da .. etc.

hytromo
fuente
13
@Viswa, tenga en cuenta que es muy peligroso revelar la contraseña en texto sin formato. Le recomendamos encarecidamente que no haga eso
Anwar
3
-1 Si esto parece una buena idea, sería mucho mejor que solo establezca una contraseña en su cuenta raíz y use la solución de z7sg; eso es igual de fácil y no crea este problema de seguridad muy peligroso.
Bryce
44
Ja! Tuve 6 votos a favor y 4 votos a favor en mi respuesta :) Pero ¿por qué chicos, no estaba claro 'Uso personal', 'lugar seguro', etc.? ¡No hay un problema de seguridad a menos que entregue este archivo y tenga un servidor ssh ejecutándose! ¿Dónde ve el problema de seguridad siempre que el script sea para uso personal y esté en un lugar seguro?
hytromo
55
Votado negativamente, este es el camino hacia el lado oscuro, y no es necesario con el método sudo.
Floyd
44
Ok, solo dime, incluso si el pirata informático ha iniciado sesión como usuario simple en tu cuenta, ¿cómo diablos encontrará el script con tu contraseña en / usr / share / help / lv / ubuntu-help?
hytromo
21

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

Consulte https://help.ubuntu.com/community/CronHowto para ver cómo agregar el script al crontab.

z7sg
fuente
44
Es posible que, probablemente desee utilizar anacronsi que es un ordenador de sobremesa / portátil, que no se ejecutan 24x7
balki
Esta es una respuesta útil, por ejemplo, si está escribiendo el script para buscar actualizaciones, hacer algo con esa información y enviar un correo electrónico al administrador sobre las actualizaciones necesarias. Personalmente, muchos de mis scripts se usan para la automatización del servidor, por lo que solo tendré que usar sudo crontab -e. +1
Rab
11

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

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 tener en cuenta.

arielf
fuente
0
export MY_SUDO_PASS="user_password_here"

Para probar si funciona, escriba:

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 antes:

echo $MY_SUDO_PASS | sudo -S apt-get update

Ejecutar desde python (ejemplo, cambiar la propiedad del directorio de forma recursiva 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 get's password -S cambia la captura y pasa la contraseña a sudo

jturi
fuente
No estoy seguro de lo que esto agrega a las respuestas existentes más actual de soporte de BIOS despertar en alarma ...
Elder Geek