%20mientras%20se%20hace%20sudo.png)
Necesito wget
algo (lo que da como resultado un archivo comprimido en cwd), luego tengo que extraerlo, luego copiar/mover/modificar algunas cosas y tal vez finalmente ejecutar un script (del archivo descargado).
Ahora, todas estas tareas, ya sea directamente ( wget
, extraer, etc.) o indirectamente (ejecutar el script), dan como resultado la creación de archivos y directorios (todos en el directorio de trabajo actual). Hago todo esto como root
(no hay forma de hacerlo con el usuario final deseado).
El problema es: todo lo creado en el proceso es propiedad de root o del usuario sudo. Cuando termino (y a veces a mitad de camino), tengo que emitir una serie de chmod
comandos chown
para hacer las cosas bien.
Ahora sería bueno si de alguna manera pudiera decirle al sistema que "De ahora en adelante, cualquier archivo o directorio que cree cuando emita comandos como root, lo creará con tal o cual propiedad y permisos".
Respuesta1
Siempre puedes hacerlo sudo -u username touch filename
cuando tu script se ejecuta como root
. Por lo general, no requiere contraseña, dependiendo de su sudoers
configuración.
Alternativamente, ejecute su username -c touch filename
. Los argumentos adicionales se proporcionan al shell del usuario y la -c
opción del shell ejecuta los comandos especificados por convención.
Algunos comandos (como mkdir
) admiten argumentos para especificar los permisos:
mkdir -m 0700 foo
De forma predeterminada, las operaciones con archivos respetan el umask
conjunto del shell. Define qué permisos sondenegado. A umask
de 0022
por ejemplo lo hacenoestablecer permisos de escritura para grupos y otros. Configúrelo en 0077
para evitar que el grupo y otras personas obtengan permisos.
Puede configurar los setgid
directorios on para que todos los archivos creados hereden su membresía en el grupo:
chmod g+s someDir
Algunos Unixapoyoel mismo comportamiento para setuid
( chmod u+s
), pero no para Linux.
Respuesta2
Hay otra manera, creo que bastante elegante. Usando instalar(1)
Por ejemplo, zabbix-agentd necesita una subcarpeta dentro de /var/run, pero las distribuciones recientes utilizan tmpfs para /var/run, por lo que el directorio no sobrevive a los reinicios. Lo resolví creando un archivo /etc/sysconfig/zabbix-agentd que contiene:
install -g zabbix -o zabbix -d /var/run/zabbix
Respuesta3
En sistemas tipo Unix, los archivos y directorios recién creados pertenecen al propietario del proceso que los creó. Las utilidades estándar normalmente no tienen la opción de cambiar el propietario de los archivos creados.
Variables con UID y GID del usuario original
Si ejecuta algunos comandos repetidamente, puede usar las variables $SUDO_UID
y $SUDO_GID
para referirse al usuario que invocó sudo
:
sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"
Obtener la lista de archivos y directorios creados automáticamente
Si desea obtener la lista de archivos y directorios creados (y posiblemente modificados) automáticamente, puede ejecutar sus comandos bajo strace
vigilancia, que se basa en la ptrace()
llamada al sistema:
strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something
o puedes usar por ejemploInstalar relojque se basa en el LD_PRELOAD
mecanismo.
Ideas para seguir trabajando
Con base en los métodos mencionados anteriormente, es posible crear una herramienta que cambiaría automáticamente el propietario y posiblemente los derechos de acceso de los archivos creados/modificados. El uso podría ser tan simple como:
sudo watch-chown do_something