Estoy escribiendo un script (en realidad, una combinación de scripts y makefile) que instala dependencias externas: algunos apt-getcomandos, algunos gitclonando, 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:
gitrepos clones obtengorootcomo propietario, lo que significa que no puedo modificarlos después sinsudoochown- los scripts que agregan usuarios a grupos no saben qué usuario agregar ya que
whoamidevuelveroot
¿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 sudocontraseñ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 -val 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 -kpara cerrar la sesión de superusuario

SUDO_USERvariable 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 commandlos 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
sudola-Sopció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.echoes una concha incorporada;/bin/echono se ejecuta cuando se llama simplementeecho .... Algunos otros proyectiles tienen unechobuiltin incorporado (dashpor 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