Tengo un script bash de larga y larga ejecución donde un puñado de comandos deben ejecutarse como root, mientras que la mayoría de los comandos deben ejecutarse como el usuario normal antes de sudo, ya que estropearía la propiedad del archivo y demás.
Se me ocurrieron algunos métodos, pero cada uno de ellos tiene algunos problemas.
Método 1: usar sudo dentro del archivo
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Esto se vería bien, por la forma en que está escrito el código. sudo
está escrito antes de las pocas declaraciones que realmente deben ejecutarse por root, pero si el tiempo entre cada sudo
llamada es demasiado largo, sudo
nuevamente solicita una contraseña. Además, si la primera ejecución de sudo
falla, por ejemplo, debido a una contraseña no válida, el resto del script aún se ejecuta.
Método 2: usar sudo para llamar al archivo y luego volver al usuario original cuando sea necesario
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Esto también apesta, porque necesito agregar su username -c
delante de casi todas las líneas. También sudo
es posible encontrar el nombre de usuario original después , pero engorroso.
¿Hay una mejor manera?
Editar: solo publiqué pequeños guiones sin sentido aquí para mostrar de lo que estoy hablando. En la secuencia de comandos real, tengo algunas líneas que necesitan sudo (iniciar y detener servicios), algunas líneas donde no importa si hay sudo y muchas líneas que realmente necesitan ejecutarse sin sudo.
sudo
si necesita tener permisos elevados. Pero no tiene sentido cambiarsu username -c
a ejecutar unecho
. En otras palabras, esto suena como un [XY]. ¿Podría editar y explicar qué hará realmente su script y por qué siente que necesita cambiar de usuario con tanta frecuencia?man sudo
?-v, --validate
'Actualice las credenciales almacenadas en caché del usuario, autenticándolo si es necesario. Para el complemento sudoers, esto extiende el tiempo de espera de sudo por otros 15 minutos de forma predeterminada, pero no ejecuta un comando. No todas las políticas de seguridad admiten credenciales almacenadas en caché '. (Si lo ejecuta con la frecuencia suficiente, la autenticación de sudo no deberíaRespuestas:
Con respecto al método 2, es más fácil usar una función. Por ejemplo:
$SUDO_USER
es el nombre de usuario del sudoer. También podría usar$(logname)
en su lugar.Corriendo en mi máquina:
fuente
Al leer
man sudoers
, uno ve:Por lo tanto, podría permitir que
regular
el host semachine1
ejecutecommand1
ycommand2
como root, sin autenticación de contraseña con:pero lea cada uno
man -k sudo
para más detalles.fuente
Quizás esto pueda ayudar:
chmod 775 yourscript.sh
Luego puede usar sudo dentro del script (sin solicitud de contraseña) y no puede usar sudo para otros comandos dentro de su script.
fuente
chmod 775
solo le permite ejecutar el archivo y no cambia el usuario que está ejecutando el archivo o sus derechos.