Mengapa saya mendapat izin ditolak saat menggunakan mv meskipun hak direktori benar?

13

Saya mendapatkan izin yang ditolak ketika mencoba untuk memindahkan folder Musicmelalui mvmeskipun pemilik direktori diatur ke pengguna saya dan izin pengguna diatur ke 7. Apa yang terjadi?

(Saya tahu bahwa saya bisa menggunakan sudo tetapi saya ingin mencari tahu apa yang salah. Ada yang berbau amis di sini). P: Saya menggunakan Mac OS X El Capitan.

Tangkapan layar terminal

Timo
sumber
1
Siapa pun yang menemukan kesalahan yang sama, itu mungkin karena Anda mencoba untuk mv file yang terbuka. Bukan kasus OP, hanya mengatakan itu mungkin bisa membantu.
aderchox

Jawaban:

20

Perhatikan bahwa, ketika dalam folder a, pindah bke c, folder amenentukan apa yang dapat Anda lakukan.

Dalam hal ini, izin pada .akan menjadi yang paling penting.

Perhatikan bahwa izinnya lebih kompleks daripada sekadar rwx. musicFolder Anda memiliki @di akhir, .folder memiliki +di akhir.

  • Gunakan xattr -huntuk menentukan izin kompleks untuk simbol @.
  • Gunakan getfacluntuk menentukan ACL untuk simbol +.
Konerak
sumber
Apakah Anda memiliki sumber daya yang mencakup "izin kompleks", sebagaimana Anda menyebutnya?
user1717828
man xattrmungkin merupakan titik awal yang baik.
Konerak
1
tidak, tidak ada entri manual. Saya dapat berkeliling Google untuk menemukan nama lain untuknya: atribut yang diperluas , jika ada orang lain yang ingin mempelajari lebih lanjut.
user1717828
4
Atau gunakan ls -la@e. Kemungkinan besar di sini, ada deny deleteACL yang juga mencegah penggantian nama.
Stéphane Chazelas
1
@Timo, ACL tersebut memang mencegah penghapusan atau penggantian nama direktori tersebut. Agaknya, mereka ditempatkan di sana karena suatu alasan, seperti beberapa aplikasi mengandalkan mereka berada di sana dan akan gagal sebaliknya.
Stéphane Chazelas
18

Saya menggunakan Windows Subsystem untuk Linux. Saya memiliki direktori terbuka dalam contoh bash yang berbeda. Menutupnya, izinkan saya memindahkan direktori.

Chris Anderson
sumber
3
Dalam VS Code dengan remote pada WSL saya harus menutup editor dan membuka terminal ke WSL di luar proyek VS Code itu.
Bjorn
9

Sepertinya ada setidaknya 1 file di suatu tempat jauh di dalam direktori itu yang tidak memiliki izin yang tepat.

Jadi, yang saya lakukan adalah:

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

Sekarang berhasil.

Timo
sumber
17
Apa pun masalahnya, memberikan izin eksekusi ke file musik seharusnya tidak menjadi solusi.
Stéphane Chazelas
3
Dan sepertinya tidak mungkin bahwa suatu objek dalam direktori dapat mengganggu kemampuan Anda untuk mengubah nama direktori itu.
Scott
Saya tahu ini aneh tapi itu berhasil. Menggunakan chmod dan chown pada direktori itu sendiri tidak berpengaruh.
Timo
apakah mungkin chmod 755menghapus izin '@' khusus pada folder Musik?
HorusKol
@HorusKol, atau chown. Gejala OP akan cocok dengan direktori yang memiliki ACL penghapusan delete , tetapi setidaknya pada Yosemite, melakukan chown atau chmod 755 tidak menghapus ACL itu. Anda akan membutuhkannya chmod -a 'everyone deny delete' Music. Bisa jadi berbeda di El Capitan.
Stéphane Chazelas
4

Masalahnya di sini kemungkinan berkaitan dengan Daftar Kontrol Akses (ACL) dari folder Musik. ACL adalah sistem izin terpisah dengan yang POSIX biasa yang biasanya didaftar oleh ls -l. Beberapa direktori lain di folder Beranda dan di tempat lain juga memiliki ACL.

Untuk melihat ACL dalam direktori home, gunakan:

/bin/ls -le ~

Anda mungkin akan melihat aturan seperti 0: group:everyone deny deleteuntuk direktori Musik. Seperti yang Anda catat, Anda dapat mengatasi masalah dengan sudo. Jika Anda tidak ingin melakukan itu (atau tidak bisa), Anda memiliki opsi lain, mengingat Anda adalah pemilik file tersebut. Anda dapat menghapus entri yang menyinggung dari ACL direktori Musik, berdasarkan indeksnya (0 pada contoh yang saya berikan di atas):

/bin/chmod -a# 0 Music

Atau Anda dapat menghapus semua entri di ACL:

/bin/chmod -N Music

Sekarang Anda dapat memindahkan direktori (tergantung pada izin POSIX biasa). Jika Anda ingin mengembalikan ACL setelah pindah, Anda dapat menggunakan:

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

Dan gunakan /bin/ls -lelagi untuk mengonfirmasi ACL seperti yang Anda inginkan. Lihat contoh ACL di man chmoduntuk info lebih lanjut. Secara khusus, pengantar ini bermanfaat:

Setiap file memiliki satu ACL, yang berisi daftar entri yang diurutkan. Setiap entri mengacu pada pengguna atau grup, dan memberikan atau menolak satu set izin. Dalam kasus di mana pengguna dan grup ada dengan nama yang sama, nama pengguna / grup dapat diawali dengan "pengguna:" atau "grup:" untuk menentukan jenis nama.

Pesanan ACL

Saya tidak berpikir bahwa halaman manual menjelaskan aturan tentang pemesanan, tetapi halaman ini menjelaskan aturan pemesanan untuk ACL dengan jelas. Secara khusus, denyaturan eksplisit akan diterapkan sebelum allowaturan eksplisit . Jadi, selama group:everyone deny deleteentri itu ada, tidak mungkin memberikan izin kepada pengguna Anda untuk menghapus dengan allowaturan. Ini karena izin ditolak untuk everyonegrup, termasuk Anda, dan aturan itu akan diterapkan terlebih dahulu.

putar
sumber
2
Saya tidak tahu mengapa ini diturunkan. The everyone deny deleteACL masuk di default direktori home MacOS' adalah sebenarnya alasan direktori dapat tidak dipindahkan atau dihapus. (Juga, perhatikan OS yang mungkin membuatnya kembali kapan saja.)
Diti
1
jawaban ini KUNCI !!! sial, ACL baru ini adalah PITA BESAR.
Dean Hiller
3

Saya memiliki masalah ini ketika satu set program sedang berjalan di direktori yang saya coba hapus. Untuk memindahkan direktori, saya harus terlebih dahulu membunuh semua program yang berjalan dari direktori itu.

Dalam perintah berikut, berhati - hatilah tentang bagaimana Anda memilih nama program Anda. Saya menggunakan perintah berikut, untuk referensi:

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

Prosedur umum adalah:

  1. bunuh semua program yang berjalan dari direktori yang dimaksud
  2. mencoba mengubah nama direktori
  3. jika itu gagal, paksa bunuh ( kill -9dengan sangat hati - hati ) semua program dari direktori
  4. mencoba mengubah nama direktori
  5. jika itu gagal, lihat apakah program itu berjalan lagi, yaitu bahwa itu telah dimulai kembali oleh beberapa program daemon yang berjalan dari direktori yang berbeda
  6. paksa bunuh program daemon yang me-restart program yang menjengkelkan
  7. paksa mematikan program yang mengganggu
  8. ganti nama direktori
  9. keuntungan
WattsInABox
sumber
1
Saya tidak berpikir OP kemungkinan memiliki program yang berjalan dari direktori ~ / Music. Lagi pula dia bilang dia tidak ingin menggunakan sudo, yang jawabannya tidak.
spinup
Yang saya katakan adalah saya punya situasi itu. Mungkin bisa membantu seseorang meskipun itu tidak membantu OP.
WattsInABox
Ini mungkin membantu seseorang, tentu saja - itu sebabnya saya tidak downvote. Tapi saya pikir maksud dari StackExchange adalah bahwa jawaban yang diposting sebenarnya menjawab pertanyaan yang diajukan.
spinup
1
Masalah potensial lainnya, jika Anda bermaksud agar jawaban ini dapat digunakan secara umum untuk pemula: Anda tidak memberikan peringatan tentang pemilihan istilah pencarian Anda dengan sangat hati-hati di bagian pertama grepdan memeriksanya. Apa pun yang Anda masukkan ke dalam yang pertama grepakan memilih dari kumpulan semua program yang sedang berjalan dan killdengan hak akses root ...
spinup
1
Bagus, @ Watts, saya pikir itu peningkatan besar
spinup
0

Itu juga bisa terjadi ketika salah satu file di dalamnya dilindungi dari penulisan. Saya memiliki kasus tepi hari ini ketika access.logdilindungi untuk Apache, yang sudah dihentikan. Saya baru saja menghapus file ini, jadi lebih lanjut saya bisa memindahkan direktori induk.

vintproykt
sumber