Sudo crea una variable de entorno "SUDO_USER" que puede usar para averiguar el usuario que inició sesión (en realidad, quién ejecutó Sudo).
Suponiendo que Sudo rootee (también es posible usar Sudo para acceder a otros usuarios), puede escribir un script para automatizar los siguientes dos pasos.
cp source target
chown $SUDO_USER target
(Esto no funcionará si sudo a un usuario no root ya que solo root puede regalar archivos).
Automatizarlo será un poco de trabajo. Si el origen es un archivo único y el destino no es un directorio, entonces su trabajo está hecho. Supongo que hizo la pregunta porque el problema es solo un problema real en situaciones más complejas, por ejemplo, al hacer algo como:
cp /path/source/some*files /path/target/directory/
Se puede escribir una secuencia de comandos compleja para determinar qué archivos y qué directorios se pasan, cuáles eran preexistentes, cuáles se sobrescribieron realmente y para cambiar la propiedad de solo los archivos copiados con éxito.
Este trabajo ya está hecho. Puede usar cpio
: después de sudo a root, use cpio para copiar los archivos. cpio necesita una lista de los archivos para copiar, por lo que es un proceso de dos pasos. A continuación, uso ls
para generar la lista de archivos para copiar.
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
El -pdm
medio significa "Modo Passthrough, Crear directorios según sea necesario, Mantener tiempos de modificación de archivos"
--owner $SUDO_USER"
hace que el usuario especificado sea el propietario de los archivos.
El operando final es el directorio donde cpio debe almacenar los archivos.
Para obtener más información sobre cpio awesomeness, vaya a la página del manual de CPIO aquí
Hacer esto en un solo comando sudo también es posible. Suponiendo que su usuario tiene derechos para acceder a los archivos, use sudo solo para la parte cpio, como esta:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
En el caso anterior, estoy usando $ USER en lugar de $ SUDO_USER porque se evalúa antes de que se ejecute Sudo. Alternativamente, si el usuario no tiene acceso a la lista de archivos, póngalo en un script de contenedor y use sudo para ejecutar el contenedor. Esto puede volverse más difícil, pero en el caso más simple El contenedor toma dos argumentos, un origen y un destino.
Esto va en el contenedor "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
Luego use el envoltorio de esta manera:
sudo cp_as_user "/ ruta / a / algunos * archivos" / ruta / a / destino / directorio
sudo cat /etc/foo.txt > ~/foo.txt
. Los archivos tienden a ser legibles solo por root por una razón, así que recuerde tener en cuenta esa razón al hacer copias legibles por usuarios no root.