Estoy escribiendo un script (en realidad, una combinación de scripts y makefile) que instala dependencias externas: algunos apt-get
comandos, algunos git
clonando, construyendo, instalando, agregando usuarios a grupos, ...
Algunas de las operaciones en estos scripts requieren permisos de superusuario, otras no.
Hasta ahora he ejecutado todo el proceso de creación con sudo, pero tiene algunos inconvenientes:
git
repos clones obtengoroot
como propietario, lo que significa que no puedo modificarlos después sinsudo
ochown
- los scripts que agregan usuarios a grupos no saben qué usuario agregar ya que
whoami
devuelveroot
¿Cuál es la mejor manera de ejecutar como superusuario solo los comandos que lo requieren? Idealmente, el proceso aún requeriría que ingrese mi sudo
contraseña, pero solo una vez al comienzo del proceso de instalación. Luego lo olvidaría al final, pero manténgalo todo el tiempo hasta entonces (puede tomar varias horas).
Las soluciones que he encontrado en línea incluyen:
sudo -v
al comienzo del guión, pero si entiendo correctamente, esto agota el tiempo de espera. Mi script podría estar ejecutándose por un par de horas- ejecutando el script con
sudo
, pero los comandos que no necesitan superusuario consudo -u $(logname) <command>
. Esto es lo que hago ahora, pero parece que debería ser al revés.
Idealmente, me gustaría que mi guión:
- solicitar credenciales de superusuario
- ejecutar comandos normales como el usuario conectado
- ejecutar comandos sudo con las credenciales ingresadas en el paso 1
sudo -k
para cerrar la sesión de superusuario
SUDO_USER
variable de entorno. Si está presente, contendrá el nombre de usuario del usuario que invoca sudo. Por lo tanto, puede (como root) chown $ SUDO_USER: $ SUDO_GID $ your_files. Del mismo modo, puede verificar estas variables para que sus comandos adduser sepan qué usuario agregar.su $SUDO_USER -c command
los comandos como usuario normal.Respuestas:
Como tiene acceso a sudo, cree un archivo de sudoers para usted, luego elimínelo cuando termine el script:
fuente
Una forma, que generalmente no recomendaría, es leer la contraseña usted mismo y usar
sudo
la-S
opción de pasar la contraseña cuando sea necesario:De
man sudo
:fuente
echo "$password"
??echo "$password"
no lo sería, pero los documentos aquí y las herejías son un poco más seguros. No son visibles en la línea de comando que muestran las herramientas habituales.echo "$password"
en el lado izquierdo de una tubería está seguro en un script bash.echo
es una concha incorporada;/bin/echo
no se ejecuta cuando se llama simplementeecho ...
. Algunos otros proyectiles tienen unecho
builtin incorporado (dash
por ejemplo), pero no se requiere que los proyectiles estilo Bourne tengan uno. Por lo tanto, creo queecho "$password" |
es aceptable en bash, pero es mejor evitarlo en caso de que alguien transfiera el script a otro shell sin darse cuenta del problema. Yo uso un no portátil[[
en lugar de[
en esa secuencia de comandos para evitar el mismo tipo de problema. @KasiyA