¿Hay alguna manera de decirle a sudo que establezca mi nombre de usuario como propietario de los archivos creados en lugar de root?

19

Si hago un sudo cp /etc/foo.txt ~/foo.txt, el nuevo archivo se crea con rootel propietario.

En este momento, no veo otra forma de evitar esto que no sea el uso de los dos últimos comandos ( lspara 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:

  1. Haciéndolo en un solo sudocomando.
  2. No tener que especificar mi usuario actual (¿tal vez usando una variable?).
Belmin Fernandez
fuente
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.
jw013

Respuestas:

32

Usar en installlugar de cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt
Jenny D
fuente
No estaba al tanto install. Gracias.
Belmin Fernández el
44
@BelminFernandez: para acomodar su segunda preferencia:sudo install -o "$USER" /etc/foo.txt ~/foo.txt
Pausado hasta nuevo aviso.
14

Con una compatible con POSIXcp que pueda sudo cp -p foo barpara preservar el siguiente archivo de metadatos al copiar:

  • Tiempo de acceso
  • Tiempo de modificación
  • ID de usuario
  • Identificación del grupo
  • Modo

Si desea configurar un usuario diferente, la solución de JennyD es la mejor.

l0b0
fuente
2
Eso solo funciona cuando el archivo original es propiedad del usuario objetivo.
Jenny D
44
Supongo que la persona que ejecuta sudo no posee el archivo original, de lo contrario no necesitaría usar sudo.
EightBitTony
@EightBitTony No necesita sudocopiar un archivo que no es de su propiedad. Solo necesita acceso de lectura , después de todo.
l0b0
Sí, escribí mal por mi parte, pero supongo que la ID de usuario en cuestión tampoco puede leer el archivo, porque todavía no necesitarían sudo. Por lo tanto, tenemos que suponer que la identificación de usuario destinada a poseer el archivo final no tiene acceso al archivo original. De cualquier manera, este no es un 'problema' de sudo. Su respuesta sugiere preservar un propietario que tenemos que asumir que no se desea.
EightBitTony
2
Teóricamente es posible que el archivo sea propiedad del usuario objetivo pero esté ubicado en un directorio que el usuario objetivo no tiene permiso para ingresar. Pero no es muy probable :-)
Jenny D
8

Si lo haces:

sudo cat /etc/foo.txt > ~/foo.txt

Luego ~/foo.txt, el shell lo abrirá como usted (creado con sus credenciales) y luego sudose 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í, rootsolo 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.txtfuera un enlace simbólico, por ejemplo).

Stéphane Chazelas
fuente
2
Esto supone que el usuario puede escribir en el directorio de destino.
Johan
3

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 ( rooten este caso) para obtener acceso.

No hay forma de sudoadministrar eso, ya que todo lo que sudoestá haciendo es cambiarlo al otro usuario para ejecutar el comando.

Necesitaras

  1. siga usando dos comandos (o un comando compuesto)
  2. buscar otro comando (como instalar, visto en otra respuesta)
  3. o escriba un script y ejecute ese script a través de sudo.
OchoBitTony
fuente
1

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 lspara generar la lista de archivos para copiar.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

El -pdmmedio 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

Johan
fuente