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