Crear archivos y directorios con un determinado propietario (usuario/grupo) mientras se hace sudo

Crear archivos y directorios con un determinado propietario (usuario/grupo) mientras se hace sudo

Necesito wgetalgo (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 chmodcomandos chownpara 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 filenamecuando tu script se ejecuta como root. Por lo general, no requiere contraseña, dependiendo de su sudoersconfiguración.

Alternativamente, ejecute su username -c touch filename. Los argumentos adicionales se proporcionan al shell del usuario y la -copció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 umaskconjunto del shell. Define qué permisos sondenegado. A umaskde 0022por ejemplo lo hacenoestablecer permisos de escritura para grupos y otros. Configúrelo en 0077para evitar que el grupo y otras personas obtengan permisos.


Puede configurar los setgiddirectorios 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_UIDy $SUDO_GIDpara 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 stracevigilancia, 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_PRELOADmecanismo.

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

información relacionada