Si hago un sudo cp /etc/foo.txt ~/foo.txt
, el nuevo archivo se crea con root
el propietario.
En este momento, no veo otra forma de evitar esto que no sea el uso de los dos últimos comandos ( ls
para aclarar el caso de uso):
belmin@server1$ ls /etc/foo.txt
> -rw------- 1 root root 3848 Mar 6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_
Yo preferiría:
- Haciéndolo en un solo
sudo
comando. - No tener que especificar mi usuario actual (¿tal vez usando una variable?).
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.Respuestas:
Usar en
install
lugar decp
:fuente
install
. Gracias.sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Con una compatible con POSIX
cp
que puedasudo cp -p foo bar
para preservar el siguiente archivo de metadatos al copiar:Si desea configurar un usuario diferente, la solución de JennyD es la mejor.
fuente
sudo
copiar un archivo que no es de su propiedad. Solo necesita acceso de lectura , después de todo.Si lo haces:
Luego
~/foo.txt
, el shell lo abrirá como usted (creado con sus credenciales) y luegosudo
se ejecutará con su stdout redirigido a eso.Al final, el archivo será de su propiedad.
Ese tipo de enfoque también ayuda a limitar las cosas que hace
root
. Aquí,root
solo usa su privilegio para abrir/etc/foo.txt
, no hace lo que es potencialmente dañino (abrir un archivo para escribir, que podría tener malas consecuencias si~/foo.txt
fuera un enlace simbólico, por ejemplo).fuente
Usando
sudo
, cambia a otro usuario. Ese es todo el punto del comando. Supongo que no tiene acceso regular al primer archivo, por lo que debe ser otro usuario (root
en este caso) para obtener acceso.No hay forma de
sudo
administrar eso, ya que todo lo quesudo
está haciendo es cambiarlo al otro usuario para ejecutar el comando.Necesitaras
sudo
.fuente
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.
(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, usols
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
fuente