¿Por qué me niegan los permisos cuando uso mv aunque los derechos de directorio son correctos?

13

Consigo permiso denegado al intentar mover la carpeta Musica través mvaunque propietario del directorio se establece en mis permisos de usuario y de usuario se establece en 7. ¿Qué está pasando?

(Sé que podría usar sudo, pero quiero averiguar qué está mal. Algo huele a pescado aquí). Ps: estoy en Mac OS X El Capitan.

Captura de pantalla del terminal

Timo
fuente
1
Cualquiera que se encuentre con el mismo error, podría deberse a que está tratando de mover un archivo que está abierto. Sin embargo, no es el caso de OP, solo digo que podría ayudar.
aderchox

Respuestas:

20

Tenga en cuenta que, cuando está en la carpeta a, moviéndose ba c, los permisos de la carpeta adeterminan qué puede hacer.

En este caso, los permisos .serán los más importantes.

Observe que los permisos son más complejos que simplemente rwx. Su musiccarpeta tiene un @al final, la .carpeta tiene un +al final.

  • Se usa xattr -hpara determinar los permisos complejos para el símbolo @.
  • Use getfaclpara determinar la ACL para el símbolo +.
Konerak
fuente
¿Tiene un recurso que cubre "permisos complejos", como los llama?
user1717828
man xattrpodría ser un buen punto de partida.
Konerak
1
no, no hay entrada manual. Pude buscar en Google para buscar otro nombre: atributos extendidos , si alguien más quiere aprender más.
user1717828
44
O utilice ls -la@e. Lo más probable es que aquí haya una deny deleteACL que también impide el cambio de nombre.
Stéphane Chazelas
1
@Timo, esas ACL impiden eliminar o renombrar esos directorios. Presumiblemente, se colocaron allí por una razón, como algunas aplicaciones confían en que estén allí y fallarían de lo contrario.
Stéphane Chazelas
18

Estaba usando Windows Subsystem para Linux. Tenía el directorio abierto en una instancia de bash diferente. Cerrándome me permitió mover el directorio.

Chris Anderson
fuente
3
En VS Code con control remoto en WSL, tuve que cerrar el editor y abrir una terminal a WSL fuera de ese proyecto VS Code.
Bjorn
9

Parece como si hubiera al menos 1 archivo en algún lugar profundo de ese directorio que no tuviera los permisos correctos.

Entonces, lo que hice fue:

sudo chown -R valmar ./Music
sudo chmod -R 755 ./Music

Ahora funciona.

Timo
fuente
17
Cualquiera que sea el problema, otorgar permisos de ejecución a los archivos de música no debería ser la solución.
Stéphane Chazelas
3
Y parece poco probable que un objeto en un directorio pueda interferir con su capacidad para cambiar el nombre de ese directorio.
Scott
Sé que es raro, pero eso funcionó. El uso de chmod y chown en el directorio en sí no tuvo ningún efecto.
Timo
¿Es posible que haya chmod 755eliminado los permisos especiales '@' en la carpeta Música?
HorusKol
@HorusKol, o el vestido. Los síntomas de la OP coincidirían con los directorios que tienen una ACL de denegación de eliminación , pero al menos en Yosemite, hacer un chown o chmod 755 no elimina esa ACL. Necesitarías chmod -a 'everyone deny delete' Musiceso. Podría ser diferente en El Capitán.
Stéphane Chazelas
4

El problema aquí probablemente tiene que ver con la Lista de control de acceso (ACL) de la carpeta Música. La ACL es un sistema de permisos separado para los POSIX normales que normalmente se enumeran por ls -l. Algunos otros directorios en la carpeta Inicio y en otros lugares también tienen ACL.

Para ver las ACL dentro del directorio de inicio, use:

/bin/ls -le ~

Es probable que vea una regla como 0: group:everyone deny deletepara el directorio de Música. Como notó, podría anular el problema con sudo. Si no quieres hacer eso (o no puedes), tienes otras opciones, dado que eres el propietario del archivo. Puede quitar la entrada ofensiva de la ACL del directorio de música, en función de su índice (0 en el ejemplo que proporcioné anteriormente):

/bin/chmod -a# 0 Music

O puede quitar todas las entradas en la ACL:

/bin/chmod -N Music

Ahora puede mover el directorio (sujeto a los permisos POSIX normales). Si desea volver a colocar la ACL después del traslado, puede usar:

/bin/chmod +a "group:everyone deny delete" Music_tmp

Y úsela /bin/ls -lenuevamente para confirmar que la ACL está como la desea. Consulte los ejemplos de ACL man chmodpara obtener más información. En particular, esta introducción es útil:

Cada archivo tiene una ACL, que contiene una lista ordenada de entradas. Cada entrada se refiere a un usuario o grupo, y otorga o niega un conjunto de permisos. En los casos en que exista un usuario y un grupo con el mismo nombre, el nombre de usuario / grupo puede tener como prefijo "usuario:" o "grupo:" para especificar el tipo de nombre.

Orden de ACL

No creo que esa página de manual explique las reglas sobre el pedido, pero esta página explica claramente las reglas de pedido para las ACL. En particular, denyse aplicará una allowregla explícita antes de una regla explícita . Por lo tanto, mientras la group:everyone deny deleteentrada esté en su lugar, no es posible darle permiso a su usuario para eliminar con una allowregla. Esto se debe a que se denegó el permiso al everyonegrupo, que lo incluye a usted, y esa regla se aplicará primero.

girar
fuente
2
No sé por qué esto fue rechazado. La everyone deny deleteentrada de ACL en los directorios principales predeterminados de macOS es la razón real por la que los directorios no se pueden mover ni eliminar. (Además, tenga en cuenta que el sistema operativo podría volver a crearlos en cualquier momento.)
Diti
1
esta respuesta ROCKED !!! Santa mierda, estos nuevos ACL son una PITA ENORME.
Dean Hiller
3

Tuve este problema cuando un conjunto de programas se estaba ejecutando en un directorio que estaba tratando de eliminar. Para mover el directorio, primero tuve que eliminar todos los programas en ejecución de ese directorio.

En los siguientes comandos, tenga mucho cuidado al seleccionar el nombre de su programa. Usé los siguientes comandos, como referencia:

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep
# make sure that you are only about to kill the programs you want to kill

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep | awk '{print $2}' | sudo xargs kill -9
sudo mv /usr/local/[DIR_FOR_ANNOYING_PROGRAM] /usr/local/[DIR_FOR_ANNOYING_PROGRAM]2

El procedimiento general es:

  1. matar a todos los programas que se ejecutan desde el directorio en cuestión
  2. intenta cambiar el nombre del directorio
  3. si eso falla, fuerce kill ( kill -9con mucha precaución ) todos los programas del directorio
  4. intenta cambiar el nombre del directorio
  5. si eso falla, vea si el programa se está ejecutando nuevamente, es decir, si algún programa demonio lo ha reiniciado desde un directorio diferente
  6. forzar a matar el programa demonio que reinicia el programa molesto
  7. forzar a matar el programa molesto
  8. cambiar el nombre del directorio
  9. lucro
WattsInABox
fuente
1
No creo que el OP tenga programas que se ejecuten desde el directorio ~ / Music. De todos modos, dijo que no quiere usar sudo, lo que sí hace esta respuesta.
spinup
Todo lo que digo es que tuve esa situación. Puede ser útil para alguien a pesar de que no fue útil para el OP.
WattsInABox
Posiblemente sea útil para alguien, ciertamente, por eso no voté en contra. Pero creo que la intención de StackExchange es que las respuestas publicadas realmente respondan a la pregunta que se hizo.
spinup
1
Otro problema potencial, si quiere que esta respuesta sea de uso general para un novato: no proporciona ninguna advertencia sobre la elección de los términos de búsqueda con mucho cuidado al principio grepy su verificación. Lo que sea que esté poniendo en eso primero grepelegirá del grupo de todos los programas en ejecución y killcon privilegios de root ...
spinup el
1
Agradable, @Watts, creo que es una gran mejora
spinup
0

Eso también puede suceder cuando uno de los archivos dentro está protegido contra escritura. Tenía el caso borde de hoy cuando access.logestaba protegido por escritura para Apache, que ya fue detenido. Acabo de eliminar este archivo, por lo que pude mover el directorio principal.

vintproykt
fuente