Perché mi viene negata l'autorizzazione quando utilizzo mv sebbene i diritti di directory siano corretti?


13

Mi viene negata l'autorizzazione quando provo a spostare la cartella Musictramite mvsebbene il proprietario della directory sia impostato sul mio utente e le autorizzazioni dell'utente siano impostate su 7. Cosa sta succedendo?

(So ​​che potrei usare il sudo ma voglio scoprire cosa c'è che non va. Qualcosa puzza di pesce qui). Ps: sono su Mac OS X El Capitan.

Screenshot del terminale


1
Chiunque si imbatte nello stesso errore, potrebbe essere perché stai provando a mv un file che è aperto. Tuttavia, non è il caso di OP, sto solo dicendo che potrebbe aiutare.
aderchox,

Risposte:


20

Si noti che, quando si è nella cartella a, si passa ba c, le autorizzazioni della cartella adeterminano cosa è possibile fare.

In questo caso, le autorizzazioni .saranno più importanti.

Osserva che le autorizzazioni sono più complesse del semplice rwx. La tua musiccartella ha un @alla fine, la .cartella ha un +alla fine.

  • Utilizzare xattr -hper determinare le autorizzazioni complesse per il simbolo @.
  • Utilizzare getfaclper determinare l'ACL per il simbolo +.

Hai una risorsa che copre "permessi complessi", come li chiami?
user1717828

man xattrpotrebbe essere un buon punto di partenza.
Konerak

1
no, nessuna immissione manuale. Sono stato in grado di cercare su Google un altro nome: attributi estesi , se qualcun altro vuole saperne di più.
user1717828

4
Oppure usa ls -la@e. Molto probabilmente qui, c'era un deny deleteACL che impedisce anche la ridenominazione.
Stéphane Chazelas,

1
@Timo, tali ACL impediscono di eliminare o rinominare quelle directory. Presumibilmente, sono stati messi lì per un motivo, come alcune applicazioni si basano sul fatto che sono lì e altrimenti fallirebbero.
Stéphane Chazelas,

18

Stavo usando il sottosistema Windows per Linux. Ho aperto la directory in una diversa istanza di bash. Chiudendolo mi consente di spostare la directory.


3
In VS Code con telecomando su WSL ho dovuto chiudere l'editor e aprire un terminale a WSL al di fuori di quel progetto VS Code.
Bjorn,

9

Sembra che ci fosse almeno 1 file da qualche parte in profondità in quella directory che non avesse le giuste autorizzazioni.

Quindi, quello che ho fatto è stato:

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

Ora funziona.


17
Qualunque sia il problema, dare autorizzazioni di esecuzione ai file musicali non dovrebbe essere la soluzione.
Stéphane Chazelas,

3
E sembra improbabile che un oggetto in una directory possa interferire con la tua capacità di rinominare quella directory.
Scott,

So che è strano ma quello ha funzionato. L'uso di chmod e chown nella directory stessa non ha avuto alcun effetto.
Timo,

è possibile che siano state chmod 755rimosse le autorizzazioni speciali "@" sulla cartella Musica?
HorusKol,

@HorusKol, o l'abito. I sintomi del PO corrisponderebbero alle directory che hanno un ACL di eliminazione negato , ma almeno su Yosemite, fare un chown o chmod 755 non cancella quell'ACL. Ne avresti bisogno chmod -a 'everyone deny delete' Music. Potrebbe essere diverso in El Capitan.
Stéphane Chazelas,

4

Il problema qui probabilmente ha a che fare con l'elenco di controllo di accesso (ACL) della cartella Music. L'ACL è un sistema di autorizzazione separato rispetto ai normali POSIX normalmente elencati da ls -l. Alcune altre directory nella cartella Home e altrove hanno anche ACL.

Per visualizzare gli ACL nella home directory, utilizzare:

/bin/ls -le ~

Probabilmente vedrai una regola come 0: group:everyone deny deleteper la directory Music. Come hai notato, potresti risolvere il problema sudo. Se non vuoi farlo (o non puoi), hai altre opzioni, dato che sei il proprietario del file. Puoi rimuovere la voce offensiva dall'ACL della directory Music, in base al suo indice (0 nell'esempio che ho dato sopra):

/bin/chmod -a# 0 Music

Oppure puoi eliminare tutte le voci nella LCA:

/bin/chmod -N Music

Ora puoi spostare la directory (soggetto alle normali autorizzazioni POSIX). Se si desidera ripristinare l'ACL dopo lo spostamento, è possibile utilizzare:

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

E utilizzare di /bin/ls -lenuovo per confermare che l'ACL è come desiderato. Controlla gli esempi ACL man chmodper maggiori informazioni. In particolare, questa introduzione è utile:

Ogni file ha un ACL, contenente un elenco ordinato di voci. Ogni voce fa riferimento a un utente o gruppo e concede o nega una serie di autorizzazioni. Nei casi in cui un utente e un gruppo esistono con lo stesso nome, il nome utente / gruppo può essere preceduto da "utente:" o "gruppo:" per specificare il tipo di nome.

Ordine ACL

Non credo che la pagina man spieghi le regole relative all'ordinamento, ma questa pagina spiega chiaramente le regole d'ordine per gli ACL. In particolare, denyverrà applicata una allowregola esplicita prima di una regola esplicita . Pertanto, fintanto che la group:everyone deny deletevoce è attiva, non è possibile autorizzare l'utente a eliminare con una allowregola. Questo perché l'autorizzazione viene negata al everyonegruppo, che include te, e tale regola verrà applicata per prima.


2
Non so perché questo sia stato sottoposto a downgrade. La everyone deny deletevoce ACL sulle home directory predefinite di macOS è la vera ragione per cui le directory non possono essere né spostate né eliminate. (Si noti inoltre che il sistema operativo potrebbe ricrearli in qualsiasi momento.)
Diti

1
questa risposta ROCKED !!! merda santa, questi nuovi ACL sono un ENORME PITA.
Dean Hiller,

3

Ho avuto questo problema quando un set di programmi era in esecuzione in una directory che stavo cercando di rimuovere. Per spostare la directory, ho dovuto prima uccidere tutti i programmi in esecuzione da quella directory.

Nei seguenti comandi, fai molta attenzione a come selezioni il nome del tuo programma. Ho usato i seguenti comandi, come riferimento:

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

La procedura generale è:

  1. uccide tutti i programmi in esecuzione dalla directory in questione
  2. tenta di rinominare la directory
  3. in caso contrario, forzare l'uccisione ( kill -9con molta cautela ) di tutti i programmi dalla directory
  4. tenta di rinominare la directory
  5. in caso contrario, vedere se il programma è di nuovo in esecuzione, vale a dire che è stato riavviato da un programma daemon in esecuzione da una directory diversa
  6. force kill il programma demone che riavvia il fastidioso programma
  7. forzare uccidere il fastidioso programma
  8. rinomina directory
  9. profitto

1
Non credo che l'OP abbia probabilmente programmi in esecuzione dalla directory ~ / Music. Comunque ha detto che non vuole usare sudo, cosa che fa questa risposta.
spinup

Tutto quello che sto dicendo è che ho avuto quella situazione. Potrebbe essere utile a qualcuno anche se non è stato utile all'OP.
WattsInABox

Probabilmente è utile per qualcuno, sicuramente - ecco perché non ho votato. Ma penso che l'intenzione di StackExchange sia che le risposte postate rispondano effettivamente alla domanda che è stata posta.
spinup

1
Un altro potenziale problema, se si intende che questa risposta sia di uso generale per un principiante: non si forniscono avvertimenti sulla scelta dei termini di ricerca molto attentamente nel primo grepe sul controllo. Qualunque cosa tu stia inserendo in quella prima grepsceglierà dal pool di tutti i programmi in esecuzione e killcon i privilegi di root ...
spinup

1
Bello, @Watts, penso che sia un grande miglioramento
spinup

0

Ciò può accadere anche quando uno dei file all'interno è protetto da scrittura. Oggi ho avuto il caso limite quando access.logera protetto da scrittura su Apache, che era già stato interrotto. Ho appena rimosso questo file, quindi sono stato in grado di spostare la directory principale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.