ทำไมฉันถึงได้รับอนุญาตปฏิเสธเมื่อใช้ mv แม้ว่าสิทธิ์ของไดเรกทอรีจะถูกต้อง?


14

ฉันได้รับอนุญาตปฏิเสธเมื่อพยายามย้ายโฟลเดอร์Musicผ่านmvแม้ว่าเจ้าของไดเรกทอรีจะถูกตั้งค่าเป็นผู้ใช้ของฉันและการอนุญาตของผู้ใช้ถูกตั้งค่าเป็น 7 เกิดอะไรขึ้น

(ฉันรู้ว่าฉันสามารถใช้ sudo ได้ แต่ฉันต้องการค้นหาว่ามีอะไรผิดปกติมีบางอย่างมีกลิ่นคาวที่นี่) Ps: ฉันใช้ Mac OS X El Capitan

ภาพหน้าจอของเทอร์มินัล


1
ทุกคนสะดุดกับข้อผิดพลาดเดียวกันอาจเป็นเพราะคุณพยายาม mv ไฟล์ที่เปิดอยู่ ไม่ใช่กรณี OP แต่เพียงพูดดังนั้นมันอาจช่วยได้
aderchox

คำตอบ:


21

โปรดทราบว่าเมื่ออยู่ในโฟลเดอร์การaย้ายbไปcยังโฟลเดอร์การอนุญาตให้aกำหนดสิ่งที่คุณสามารถทำได้

ในกรณีนี้การอนุญาต.จะเป็นสิ่งสำคัญที่สุด

rwxสังเกตว่าสิทธิ์ที่มีความซับซ้อนมากกว่าเพียงแค่ musicโฟลเดอร์ของคุณมี@ที่สิ้นสุดที่.โฟลเดอร์มี+ที่ท้าย

  • ใช้xattr -hเพื่อกำหนดสิทธิ์ที่ซับซ้อนสำหรับสัญลักษณ์ @
  • ใช้getfaclเพื่อกำหนด ACL สำหรับสัญลักษณ์ +

คุณมีทรัพยากรที่ครอบคลุม "การอนุญาตที่ซับซ้อน" ตามที่คุณเรียกพวกเขาหรือไม่?
user1717828

man xattrอาจเป็นจุดเริ่มต้นที่ดี
Konerak

1
ไม่, ไม่มีรายการคู่มือ ฉันสามารถใช้ Google ไปรอบ ๆ เพื่อค้นหาชื่ออื่นได้: แอตทริบิวต์เพิ่มเติมหากใครต้องการเรียนรู้เพิ่มเติม
user1717828

4
ls -la@eหรือการใช้งาน เป็นไปได้มากที่สุดที่นี่มีdeny deleteACL ที่ป้องกันการเปลี่ยนชื่อ
Stéphane Chazelas

1
@Timo, ACL เหล่านั้นป้องกันการลบหรือเปลี่ยนชื่อไดเรกทอรีเหล่านั้น สมมุติว่าพวกเขาอยู่ที่นั่นด้วยเหตุผลเช่นแอปพลิเคชันบางอย่างพึ่งพาพวกเขาอยู่ที่นั่นและจะล้มเหลวเป็นอย่างอื่น
Stéphane Chazelas

19

ฉันใช้ระบบย่อย Windows สำหรับ Linux ฉันเปิดไดเรกทอรีในอินสแตนซ์ bash อื่น ปิดฉันขอย้ายไดเรกทอรี


4
ใน VS Code ที่มี remote บน WSL ฉันต้องปิด editor และเปิด terminal เพื่อ WSL นอกโครงการ VS Code นั้น
Bjorn

9

ดูเหมือนว่ามีไฟล์อย่างน้อย 1 ไฟล์อยู่ลึกลงไปในไดเรกทอรีนั้นซึ่งไม่มีสิทธิ์ที่ถูกต้อง

ดังนั้นสิ่งที่ฉันทำคือ:

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

ตอนนี้มันใช้งานได้


17
ไม่ว่าปัญหาจะเกิดขึ้นการให้สิทธิ์ในการเรียกใช้ไฟล์เพลงไม่ควรเป็นวิธีแก้ปัญหา
Stéphane Chazelas

3
และดูเหมือนไม่น่าเป็นไปได้ที่วัตถุในไดเรกทอรีอาจรบกวนความสามารถในการเปลี่ยนชื่อไดเรกทอรีนั้น
สกอตต์

ฉันรู้ว่ามันแปลก แต่นั่นก็หลอกลวง การใช้ chmod และ chown บนไดเรกทอรีนั้นไม่มีผลใด ๆ
Timo

เป็นไปได้หรือไม่ที่chmod 755ลบสิทธิ์พิเศษ '@' ในโฟลเดอร์ Music?
HorusKol

@HorusKol หรือ chown อาการของ OP จะตรงกับไดเรกทอรีที่มีการปฏิเสธ ACLs แต่อย่างน้อยในโยเซมิตีการทำ chown หรือ chmod 755 ไม่ได้ลบ ACL นั้น คุณต้องการchmod -a 'everyone deny delete' Musicสิ่งนั้น มันอาจแตกต่างกันใน El Capitan
Stéphane Chazelas

4

ปัญหาที่นี่น่าจะเกี่ยวข้องกับ Access Control List (ACL) ของโฟลเดอร์ Music สินเอเซียเป็นระบบที่ได้รับอนุญาตที่แยกต่างหากเพื่อคน POSIX ls -lปกติที่มีการระบุไว้ตามปกติโดย บางไดเร็กทอรีอื่น ๆ ในโฟลเดอร์ Home และที่อื่น ๆ ก็มี ACL เช่นกัน

หากต้องการดู ACLs ภายในโฮมไดเร็กทอรีให้ใช้:

/bin/ls -le ~

คุณอาจจะเห็นกฎเช่นนี้0: group:everyone deny deleteสำหรับไดเรกทอรีเพลง sudoในขณะที่คุณตั้งข้อสังเกตคุณสามารถแทนที่ปัญหากับ หากคุณไม่ต้องการทำเช่นนั้น (หรือไม่สามารถทำได้) คุณมีตัวเลือกอื่น ๆ เนื่องจากคุณเป็นเจ้าของไฟล์ คุณสามารถตัดรายการที่ละเมิดออกจาก ACL ของไดเรกทอรีเพลงตามดัชนี (0 ในตัวอย่างที่ฉันให้ไว้ข้างต้น):

/bin/chmod -a# 0 Music

หรือคุณสามารถตัดรายการทั้งหมดใน ACL:

/bin/chmod -N Music

ตอนนี้คุณสามารถย้ายไดเรกทอรีไปรอบ ๆ (ขึ้นอยู่กับสิทธิ์ POSIX ปกติ) หากคุณต้องการนำ ACL กลับมาหลังจากการย้ายคุณสามารถใช้:

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

และใช้/bin/ls -leอีกครั้งเพื่อยืนยัน ACL ตามที่คุณต้องการ ลองใช้ตัวอย่าง ACL man chmodเพื่อดูข้อมูลเพิ่มเติม โดยเฉพาะคำนำนี้มีประโยชน์:

แต่ละไฟล์มีหนึ่ง ACL ที่มีรายการเรียงลำดับ แต่ละรายการอ้างอิงถึงผู้ใช้หรือกลุ่มและมอบหรือปฏิเสธชุดของสิทธิ์ ในกรณีที่มีผู้ใช้และกลุ่มที่มีชื่อเดียวกันชื่อผู้ใช้ / กลุ่มสามารถนำหน้าด้วย "user:" หรือ "group:" เพื่อระบุประเภทของชื่อ

สั่งซื้อ ACL

ฉันไม่คิดว่าหน้าคนอธิบายกฎเกี่ยวกับการสั่งซื้อ แต่หน้านี้อธิบายกฎการสั่งซื้อสำหรับ ACL อย่างชัดเจน โดยเฉพาะdenyกฎที่ชัดเจนจะถูกนำไปใช้ก่อนallowกฎที่ชัดเจน ดังนั้นตราบใดที่group:everyone deny deleteมีการใช้งานอยู่คุณจะไม่สามารถให้สิทธิ์ผู้ใช้ของคุณในการลบallowกฎได้ นี่เป็นเพราะสิทธิ์ถูกปฏิเสธไปยังeveryoneกลุ่มซึ่งรวมถึงคุณและกฎนั้นจะถูกนำไปใช้ก่อน


2
ฉันไม่รู้ว่าทำไมสิ่งนี้จึงถูกลดระดับลง everyone deny deleteรายการ ACL ใน MacOS ไดเรกทอรีแรกเริ่มต้นเป็นจริงเหตุผลไดเรกทอรีที่ไม่สามารถเคลื่อนย้ายหรือลบ (โปรดทราบว่าระบบปฏิบัติการอาจสร้างใหม่ได้ทุกเวลา)
Diti

1
คำตอบนี้สั่นสะเทือน !!! อึศักดิ์สิทธิ์เหล่านี้ ACL ใหม่เป็น PITA ขนาดใหญ่
Dean Hiller

3

ฉันมีปัญหานี้เมื่อชุดของโปรแกรมทำงานในไดเรกทอรีที่ฉันพยายามลบ ในการย้ายไดเรกทอรีฉันต้องฆ่าโปรแกรมที่กำลังทำงานอยู่ทั้งหมดจากไดเรกทอรีนั้นก่อน

ในคำสั่งต่อไปนี้ให้ระมัดระวังเกี่ยวกับวิธีการเลือกชื่อโปรแกรมของคุณ ฉันใช้คำสั่งต่อไปนี้สำหรับการอ้างอิง:

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

ขั้นตอนทั่วไปคือ:

  1. ฆ่าโปรแกรมทั้งหมดที่ทำงานจากไดเรกทอรีที่มีปัญหา
  2. พยายามเปลี่ยนชื่อไดเรกทอรี
  3. หากสิ่งนั้นล้มเหลวให้บังคับให้ kill ( kill -9ด้วยความระมัดระวังเป็นจำนวนมาก) โปรแกรมทั้งหมดจากไดเรกทอรี
  4. พยายามเปลี่ยนชื่อไดเรกทอรี
  5. หากล้มเหลวให้ดูว่าโปรแกรมกำลังทำงานอีกครั้งหรือไม่นั่นคือมีการเริ่มต้นใหม่โดยโปรแกรม daemon บางโปรแกรมที่รันจากไดเรกทอรีอื่น
  6. บังคับให้ฆ่าโปรแกรม daemon ที่เริ่มโปรแกรมที่น่ารำคาญ
  7. บังคับให้ฆ่าโปรแกรมที่น่ารำคาญ
  8. เปลี่ยนชื่อไดเรกทอรี
  9. กำไร

1
ฉันไม่คิดว่า OP น่าจะมีโปรแกรมใด ๆ ที่ทำงานจากไดเรกทอรี ~ / Music อย่างไรก็ตามเขาบอกว่าเขาไม่ต้องการใช้ sudo ซึ่งคำตอบนี้ทำ
spinup

ทั้งหมดที่ฉันพูดคือฉันมีสถานการณ์นั้น อาจเป็นประโยชน์กับใครบางคนแม้ว่าจะไม่เป็นประโยชน์กับ OP
WattsInABox

มันอาจเป็นประโยชน์สำหรับใครบางคนแน่นอน - นั่นเป็นเหตุผลที่ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่าเจตนาของ StackExchange คือคำตอบที่โพสต์ตอบคำถามที่ถาม
spinup

1
ปัญหาที่อาจเกิดขึ้นอีกหากคุณหมายถึงคำตอบนี้จะเป็นการใช้โดยทั่วไปสำหรับมือใหม่: คุณไม่ได้ให้คำเตือนใด ๆ เกี่ยวกับการเลือกคำค้นหาของคุณอย่างระมัดระวังในครั้งแรกgrepและตรวจสอบมัน สิ่งที่คุณใส่ในครั้งแรกgrepจะเลือกจากกลุ่มของโปรแกรมที่กำลังทำงานอยู่ทั้งหมดและkillมีสิทธิ์รูท ...
spinup

1
ดี @ วัตต์ฉันคิดว่าเป็นการปรับปรุงครั้งใหญ่
spinup

0

ซึ่งอาจเกิดขึ้นได้เมื่อไฟล์ใดไฟล์หนึ่งภายในมีการป้องกันการเขียน ฉันมีกรณีขอบในวันนี้เมื่อaccess.logถูกป้องกันการเขียนเพื่อ Apache ซึ่งหยุดแล้ว ฉันเพิ่งลบไฟล์นี้ดังนั้นฉันจึงสามารถย้ายไดเรกทอรีหลักได้อีก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.