Tại sao tôi bị từ chối khi sử dụng mv mặc dù quyền thư mục là chính xác?


13

Tôi bị từ chối quyền khi cố gắng di chuyển thư mục Musicqua mvmặc dù chủ sở hữu thư mục được đặt thành người dùng của tôi và quyền người dùng được đặt thành 7. Điều gì đang xảy ra?

(Tôi biết rằng tôi có thể sử dụng sudo nhưng tôi muốn tìm hiểu những gì sai. Một cái gì đó có mùi tanh ở đây). Ps: Tôi đang dùng Mac OS X El Capitan.

Ảnh chụp màn hình thiết bị đầu cuối


1
Bất cứ ai cũng vấp phải cùng một lỗi, có thể là do bạn đang cố gắng mv một tệp đang mở. Không phải trường hợp OP mặc dù, chỉ nói như vậy nó có thể giúp đỡ.
aderchox

Câu trả lời:


20

Xin lưu ý rằng, khi trong thư mục a, di chuyển bđến c, các quyền của thư mục axác định những gì bạn có thể làm.

Trong trường hợp này, các quyền trên .sẽ là quan trọng nhất.

Quan sát rằng các quyền phức tạp hơn đơn giản rwx. musicThư mục của bạn có một @ở cuối, .thư mục có một +ở cuối.

  • Sử dụng xattr -hđể xác định các quyền phức tạp cho biểu tượng @.
  • Sử dụng getfaclđể xác định ACL cho ký hiệu +.

Bạn có tài nguyên bao gồm "quyền phức tạp" khi bạn gọi chúng không?
dùng1717828

man xattrcó thể là một điểm khởi đầu tốt.
Konerak

1
Không, không có mục nhập thủ công. Tôi đã có thể Google xung quanh để tìm một tên khác cho nó: thuộc tính mở rộng , nếu có ai khác muốn tìm hiểu thêm.
dùng1717828

4
Hoặc sử dụng ls -la@e. Rất có thể ở đây, đã có một deny deleteACL cũng ngăn chặn việc đổi tên.
Stéphane Chazelas

1
@Timo, những ACL đó không ngăn chặn hoặc đổi tên các thư mục đó. Có lẽ, chúng được đặt ở đó vì một lý do, giống như một số ứng dụng dựa vào chúng ở đó và sẽ thất bại.
Stéphane Chazelas 7/10/2015

18

Tôi đã sử dụng Windows subsystem cho Linux. Tôi đã mở thư mục trong một ví dụ bash khác. Đóng nó để tôi di chuyển thư mục.


3
Trong Mã VS có điều khiển từ xa trên WSL, tôi phải đóng trình soạn thảo và mở một thiết bị đầu cuối sang WSL bên ngoài dự án Mã VS đó.
Bjorn

9

Có vẻ như có ít nhất 1 tệp ở đâu đó sâu trong thư mục đó không có quyền.

Vì vậy, những gì tôi đã làm là:

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

Bây giờ nó hoạt động.


17
Dù vấn đề là gì, việc cấp quyền thực thi cho các tệp nhạc không phải là giải pháp.
Stéphane Chazelas

3
Và dường như không chắc rằng một đối tượng trong một thư mục có thể can thiệp vào khả năng đổi tên thư mục đó của bạn.
Scott

Tôi biết điều đó thật kỳ lạ nhưng điều đó đã tạo nên mánh khóe. Sử dụng chmod và chown trên thư mục chính nó không có hiệu lực.
Timo

có thể chmod 755xóa các quyền '@' đặc biệt trên thư mục Nhạc không?
HorusKol 7/10/2015

@HorusKol, hay chown. Các triệu chứng của OP sẽ khớp với các thư mục từ chối xóa ACL, nhưng ít nhất là trên Yosemite, thực hiện chown hoặc chmod 755 không xóa ACL đó. Bạn sẽ cần chmod -a 'everyone deny delete' Musicđiều đó. Nó có thể khác ở El Capitan.
Stéphane Chazelas 7/10/2015

4

Vấn đề ở đây có thể liên quan đến Danh sách điều khiển truy cập (ACL) của thư mục Âm nhạc. ACL là một hệ thống cấp phép riêng cho các POSIX thông thường thường được liệt kê theo ls -l. Một số thư mục khác trong thư mục Home và các nơi khác cũng có ACL.

Để xem ACL trong thư mục chính, hãy sử dụng:

/bin/ls -le ~

Bạn có thể sẽ thấy một quy tắc như 0: group:everyone deny deleteđối với thư mục Âm nhạc. Như bạn lưu ý, bạn có thể ghi đè vấn đề với sudo. Nếu bạn không muốn làm điều đó (hoặc không thể), bạn có các tùy chọn khác, cho rằng bạn là chủ sở hữu của tệp. Bạn có thể loại bỏ mục vi phạm khỏi ACL của thư mục Âm nhạc, dựa trên chỉ mục của nó (0 trong ví dụ tôi đã đưa ra ở trên):

/bin/chmod -a# 0 Music

Hoặc bạn có thể loại bỏ tất cả các mục trong ACL:

/bin/chmod -N Music

Bây giờ bạn có thể di chuyển thư mục xung quanh (tuân theo các quyền POSIX thông thường). Nếu bạn muốn đặt lại ACL sau khi di chuyển, bạn có thể sử dụng:

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

Và sử dụng /bin/ls -lelại để xác nhận ACL như bạn muốn. Kiểm tra các ví dụ ACL man chmodđể biết thêm thông tin. Đặc biệt, phần giới thiệu này rất hữu ích:

Mỗi tệp có một ACL, chứa danh sách các mục nhập theo thứ tự. Mỗi mục đề cập đến một người dùng hoặc nhóm và cấp hoặc từ chối một nhóm quyền. Trong trường hợp người dùng và nhóm tồn tại cùng tên, tên người dùng / nhóm có thể được thêm tiền tố là "user:" hoặc "group:" để chỉ định loại tên.

Đặt hàng ACL

Tôi không nghĩ rằng trang man giải thích các quy tắc xung quanh việc đặt hàng, nhưng trang này giải thích rõ ràng các quy tắc đặt hàng cho ACL. Cụ thể, một denyquy tắc rõ ràng sẽ được áp dụng trước một allowquy tắc rõ ràng . Vì vậy, miễn là group:everyone deny deletemục nhập được đặt đúng chỗ, không thể cho phép người dùng của bạn xóa theo allowquy tắc. Điều này là do sự cho phép bị từ chối đối với everyonenhóm, bao gồm bạn và quy tắc đó sẽ được áp dụng trước tiên.


2
Tôi không biết tại sao điều này đã bị hạ thấp. Mục everyone deny deleteACL trên các thư mục nhà mặc định của macOS là lý do thực tế khiến các thư mục không thể di chuyển hay xóa. (Ngoài ra, hãy lưu ý rằng HĐH có thể tạo lại chúng bất cứ lúc nào.)
Diti

1
câu trả lời này ROCKED !!! Chúa ơi, những ACL mới này là một Pita LỚN.
Dean Hiller

3

Tôi gặp vấn đề này khi một bộ chương trình đang chạy trong một thư mục mà tôi đang cố xóa. Để di chuyển thư mục, trước tiên tôi phải giết tất cả các chương trình đang chạy từ thư mục đó.

Trong các lệnh sau, hãy thật cẩn thận về cách bạn chọn tên chương trình của mình. Tôi đã sử dụng các lệnh sau đây, để tham khảo:

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

Thủ tục chung là:

  1. giết tất cả các chương trình chạy từ thư mục trong câu hỏi
  2. cố gắng đổi tên thư mục
  3. nếu thất bại, buộc giết ( kill -9rất cẩn thận ) tất cả các chương trình từ thư mục
  4. cố gắng đổi tên thư mục
  5. Nếu thất bại, hãy xem chương trình có chạy lại không, nghĩa là nó đã được khởi động lại bởi một số chương trình daemon chạy từ một thư mục khác
  6. buộc giết chương trình daemon khởi động lại chương trình gây phiền nhiễu
  7. lực lượng giết chương trình gây phiền nhiễu
  8. đổi tên thư mục
  9. lợi nhuận

1
Tôi không nghĩ OP có thể có bất kỳ chương trình nào chạy từ thư mục ~ / Music. Dù sao, anh ta nói anh ta không muốn sử dụng sudo, câu trả lời này có.
spinup

Tất cả những gì tôi nói là tôi đã có tình huống đó. Có thể hữu ích cho ai đó mặc dù nó không hữu ích cho OP.
WattsInABox

Nó có thể hữu ích cho ai đó, chắc chắn - đó là lý do tại sao tôi không downvote. Nhưng tôi nghĩ ý định của StackExchange là các câu trả lời được đăng thực sự trả lời câu hỏi đã được hỏi.
spinup

1
Một vấn đề tiềm năng khác, nếu bạn muốn câu trả lời này được sử dụng chung cho người mới: bạn không đưa ra bất kỳ cảnh báo nào về việc chọn thuật ngữ tìm kiếm của bạn một cách cẩn thận trong lần đầu tiên grepvà kiểm tra nó. Bất cứ điều gì bạn đặt vào đó trước tiên grepsẽ chọn từ nhóm tất cả các chương trình đang chạy và chương trình killđó có quyền root ...
spinup

1
Thật tuyệt, @Watts, tôi nghĩ đó là một cải tiến lớn
spinup

0

Điều đó cũng có thể xảy ra khi một trong các tệp bên trong được bảo vệ chống ghi. Tôi đã có trường hợp cạnh ngày hôm nay khi access.logđược bảo vệ chống ghi cho Apache, đã bị dừng. Tôi vừa xóa tập tin này, vì vậy tôi có thể di chuyển thư mục cha.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.