scripts script programas paso pasar parametros hacer español ejemplos ejecutar como comandos unix sudo

unix - programas - ¿Cómo escribir un script de shell que ejecuta algunos comandos como superusuario y algunos comandos no como superusuario, sin tener que cuidarlo?



scripts bash ejemplos (4)

Archivo sutest

#!/bin/bash echo "uid is ${UID}" echo "user is ${USER}" echo "username is ${USERNAME}"

ejecutarlo: `./sutest ''me da

uid is 500 user is stephenp username is stephenp

pero usando sudo: sudo ./sutest da

uid is 0 user is root username is stephenp

Por lo tanto, conserva el nombre de usuario original en $ NOMBRE DE USUARIO cuando se ejecuta como sudo. Esto lleva a una solución similar a la que otros publicaron:

#!/bin/bash sudo -u ${USERNAME} normal_command_1 root_command_1 root_command_2 sudo -u ${USERNAME} normal_command_2 # etc.

Simplemente sudo para invocar su script en primer lugar, pedirá la contraseña una vez.

Originalmente escribí esta respuesta en Linux, que tiene algunas diferencias con OS X

OS X (estoy probando esto en Mountain Lion 10.8.3) tiene una variable de entorno SUDO_USER cuando está ejecutando sudo , que puede usarse en lugar de USERNAME anterior, o para ser más multiplataforma, el script podría verificar para ver si SUDO_USER está configurado y úselo si es así, o use USERNAME, si está configurado.

Cambiando el script original para OS X, se convierte en ...

#!/bin/bash sudo -u ${SUDO_USER} normal_command_1 root_command_1 root_command_2 sudo -u ${SUDO_USER} normal_command_2 # etc.

Una primera puñalada para hacerlo multiplataforma podría ser ...

#!/bin/bash # # set "THE_USER" to SUDO_USER if that''s set, # else set it to USERNAME if THAT is set, # else set it to the string "unknown" # should probably then test to see if it''s "unknown" # THE_USER=${SUDO_USER:-${USERNAME:-unknown}} sudo -u ${THE_USER} normal_command_1 root_command_1 root_command_2 sudo -u ${THE_USER} normal_command_2 # etc.

Quiero escribir un script de shell para automatizar una serie de comandos. El problema es que algunos comandos DEBEN ejecutarse como superusuario y algunos comandos NO DEBEN ejecutarse como superusuario. Lo que he hecho hasta ahora es algo como esto:

#!/bin/bash command1 sudo command2 command3 sudo command4

El problema es que esto significa que alguien tiene que esperar hasta que finalice el comando 1 antes de que se le pida una contraseña, entonces, si command3 tarda lo suficiente, tendrá que esperar a que termine el comando3. Sería bueno si la persona pudiera levantarse y marcharse, luego regresar una hora más tarde y terminar. Por ejemplo, el siguiente script tiene este problema:

#!/bin/bash sleep 310 sudo echo "Hi, I''m root" sleep 310 sudo echo "I''m still root?"

¿Cómo puedo hacerlo para que el usuario pueda ingresar su contraseña una vez, desde el principio, y luego irse?

Actualizar:

Gracias por las respuestas. Me estoy ejecutando en Mac OS X Lion y ejecuté el guión de Stephen P y obtuve resultados diferentes: (también agregué $ HOME)

pair@abbey scratch$ ./test2.sh uid is 501 user is pair username is home directory is /Users/pair pair@abbey scratch$ sudo ./test2.sh Password: uid is 0 user is root username is root home directory is /Users/pair


Bueno, tienes algunas opciones.

Puede configurar sudo para que no solicite una contraseña. Esto no es recomendable debido a los riesgos de seguridad.

Podría escribir un script de esperar para leer la contraseña y proporcionarla a sudo cuando sea necesario, pero eso es torpe y frágil.

Recomiendo diseñar el script para ejecutarlo como root y soltar sus privilegios cuando no sean necesarios. Simplemente sudo -u someotheruser command que sudo -u someotheruser command para los comandos que no requieren root.

(Si tienen que ejecutarse específicamente como el usuario que invoca la secuencia de comandos, puede hacer que la secuencia de comandos guarde el uid e invocar una segunda secuencia de comandos mediante sudo con la ID como argumento, para que sepa a quién debe dirigir ...)


Debería ejecutar su script completo como superusuario. Si desea ejecutar algún comando como no superusuario, use la opción "-u" de sudo:

#!/bin/bash sudo -u username command1 command2 sudo -u username command3 command4

Cuando se ejecuta como root, sudo no solicita una contraseña.


Si usa esto, verifique man sudo también:

#!/bin/bash sudo echo "Hi, I''m root" sudo -u nobody echo "I''m nobody" sudo -u 1000 touch /test_user