Làm thế nào để loại bỏ đệ quy quyền thực thi khỏi các tệp mà không cần chạm vào các thư mục?


40

Tôi đã tạo một bản sao lưu vào một ổ đĩa NTFS, và tốt, bản sao lưu này thực sự cần thiết. Tuy nhiên, ổ đĩa NTFS đã làm rối tung quyền. Tôi muốn khôi phục chúng về trạng thái bình thường với cách sửa thủ công từng tệp.

Một vấn đề là đột nhiên tất cả các tệp văn bản của tôi đã đạt được quyền thực thi, đó là lỗi ofc. Vì vậy, tôi đã cố gắng:

sudo chmod -R a-x folder\ with\ restored\ backup/

Nhưng nó là sai vì nó loại bỏ sự xcho phép từ các thư mục cũng làm cho chúng không thể đọc được.

Lệnh chính xác trong trường hợp này là gì?


1
Meta: Tôi chưa bao giờ hiểu tại sao các hệ thống Unix thêm bit thực thi vào các tệp được gắn từ các hệ thống tệp DOS hoặc Windows. Nó không giống như bất cứ ai sẽ thực hiện các tập tin. Tôi thường thêm "noexec" vào tùy chọn gắn kết của mình bất cứ khi nào thực tế.
Edward Falk

Câu trả lời:


68
chmod -R -x+X *

Việc -xxóa quyền thực thi cho tất cả
Các +Xsẽ thêm quyền thực thi cho tất cả, nhưng chỉ cho các thư mục.


2
Lệnh cuối cùng tôi đã sử dụng để khôi phục quyền bình thường: `chmod -R a-x + X, u-x + rwX, go-wx + rX thư mục / name`
gaazkam

3
Cũng xem câu trả lời của Edward về ngoại lệ cho BSD
fikr4n

4
Điều này không thành công yêu cầu "không chạm vào thư mục". Điều gì xảy ra nếu thực thi (có thể cho thế giới) đã bị xóa có chủ ý trên một số thư mục? Bạn không nên thêm nó.
Ben Voigt

4
Điều này không hoạt động trên Mac. Di chuyển cờ -R về đầu sẽ giúp công việc này hoạt động trong cả thiết bị đầu cuối linux và Mac. chmod -R -x+x *
JoeMoe1984

2
Trên thực tế với thứ tự đúng, nó chạy trên OSX, nhưng nó không thực sự có hiệu quả mong muốn. Bạn phải làm điều đó như hai bước riêng biệt:chmod -R -x * && chmod -R +X *
Timmmm

14

Ok, tôi đã đọc lại các trang man "chmod" cho Mac OS X, BSD và Linux, và đã làm một vài thử nghiệm. Đây là những gì tôi học được về các chế độ biểu tượng. Nó có thể trở nên phức tạp, nhưng nó đáng để hiểu:

  • Hình thức chung là mệnh đề [, mệnh đề ] trong đó:
  • mệnh đề : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( ai ) (chỉ định nhiều) có nghĩa là đặt quyền cho người dùng, nhóm, người khác hoặc tất cả. Nếu không quy định, mặc định là 'a', nhưng umask có hiệu lực.
  • [+ - =] ( hành động ) (chỉ định một) có nghĩa là:
    • + có nghĩa là thêm các quyền được chỉ định vào các quyền đã có hiệu lực
    • - có nghĩa là xóa các quyền được chỉ định khỏi các quyền đã có hiệu lực
    • = có nghĩa là đặt quyền cho các quyền được chỉ định, xóa tất cả các quyền khác
  • [rwxXstugo] ( quyền ) (chỉ định nhiều rwxXst HOẶC một trong số ugo) đặt quyền cho (các) người dùng được chỉ định như sau:
    • r - đọc
    • w - viết
    • x - thực hiện / tìm kiếm
    • X - thực hiện / tìm kiếm thư mục iff HOẶC bất kỳ bit thực thi nào đã được đặt.
    • s - suid hoặc sgid
    • t - dính
    • u - sao chép quyền người dùng
    • g - sao chép quyền của nhóm
    • o - sao chép sự cho phép khác

Vì vậy, ví dụ, a+xsẽ làm cho một tập tin thực thi bởi tất cả mọi người. a+Xsẽ làm cho một tập tin thực thi bởi mọi người NẾU nó đã được thực thi bởi bất cứ ai.

a+xsẽ làm cho một thư mục có thể tìm kiếm bởi tất cả mọi người. a+Xcũng sẽ làm cho một thư mục có thể tìm kiếm bởi tất cả mọi người.

Sự khác biệt chính giữa BSD và Linux là với BSD, việc xác định được thực hiện dựa trên các quyền của tệp trước khi chmod được thực thi. Trong khi với Linux, việc xác định được đưa ra ngay trước khi mệnh đề + X được thực thi.

Vì vậy, với BSD, sự kết hợp a-x,a+Xsẽ loại bỏ quyền thực thi / tìm kiếm và sau đó làm cho mọi người có thể tìm thấy một thư mục và tạo một tệp có thể thực thi được bởi mọi người nếu ban đầu nó có thể được thực thi bởi bất kỳ ai.

Với Linux, a-x,a+Xsẽ loại bỏ quyền thực thi / tìm kiếm và sau đó tạo cho mọi người một thư mục có thể tìm kiếm được, trong khi không để ai thực hiện một tệp.


Đây là một ví dụ cụ thể: trên máy BSD: thư mục, tệp thực thi và tệp không thể thực thi:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Quan sát rằng cả thư mục và "fie" đều có thể được thực thi / tìm kiếm bởi người dùng, nhưng không phải bởi người khác.

Bây giờ chúng tôi thực hiện chmod a-x,a+X *. Mệnh đề đầu tiên sẽ loại bỏ bit thực thi / tìm kiếm khỏi tất cả người dùng cho tất cả các tệp, nhưng mệnh đề thứ hai sẽ thêm lại cho cả "phí" và "fie". "Phí" vì đó là một thư mục và "fie" vì nó có ít nhất một bit thực thi để bắt đầu.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Tôi đã có kết quả thực hiện tương tự chmod -x+X.

Kết luận: Giải pháp của Jak Gibb sẽ hoạt động trên Linux, nhưng đối với BSD, bạn sẽ cần thực hiện hai lần.

Tôi đã không kiểm tra điều này trên SVr4 hoặc các biến thể Unix khác.


Đẹp đọc. Cảm ơn đã làm nghiên cứu về điều này.
Jak Gibb

10

Một cách để làm điều đó:

find backup -type f -exec chmod 0644 {} +

6
Điều này có thể kết thúc việc thêm hoặc xóa các quyền mà bạn không muốn thay đổi. Sử dụng tốt hơnchmod a-x {}
Edward Falk

1
@EdwardFalk chmod a-x {}cũng có thể loại bỏ các quyền mà bạn không muốn thay đổi và nó có thể để các tệp có thể ghi trên thế giới. Vấn đề là, 0644 là một sự thỏa hiệp "nói chung hợp lý". OP, tất nhiên, cũng nên tham gia não trước khi áp dụng các giải pháp từ Internet trên máy tính của mình.
Satō Katsura

4
"ax" loại bỏ quyền thực thi cho người dùng, nhóm, người khác và giữ nguyên các quyền khác, theo như tôi biết. Tôi có sai không?
Edward Falk

1
@EdwardFalk Không, bạn đúng. Nhưng bạn không biết tập hợp các tập tin thực sự là gì và bạn cũng không biết các quyền trước đó chmodlà gì. Nếu các tập tin sao lưu chứa tập lệnh và nhị phân, loại bỏ xchúng là sai. Nếu các quyền trước đó chmodlà 0777 thì chmod a-xvẫn sẽ để lại 0666, đây có thể không phải là điều bạn muốn. Những gì tôi đang nói là chmod 0644heuristic tốt hơn, không phải chmod a-xlà sai.
Satō Katsura

1
@NajibIdrissi Ngoại trừ khi nào, bạn biết, họ đã đổi thành 0777 khi bạn sao chép chúng trên hệ thống tệp nước ngoài không có quyền UNIX. Đó chính xác là những gì OP đã làm.
Satō Katsura

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Sẽ xóa quyền thực thi đối với các tệp không thuộc thư mục loại (như bạn yêu cầu) cũng như liên kết tượng trưng (các liên kết tượng trưng thường luôn là rwxrwxrwx và chmodsẽ ảnh hưởng đến mục tiêu của liên kết tượng trưng trên chúng).

Lưu ý rằng:

 find backup -type f -exec chmod a-x {} +

sẽ chỉ thay đổi sự cho phép của các tập tin thông thường . Điều đó sẽ loại trừ các thư mụcliên kết tượng trưng , mà cả các thiết bị , được đặt tên là đường ống , ổ cắm và có thể các thiết bị khác tùy thuộc vào hệ thống (mặc dù trong trường hợp của OP là sao lưu hệ thống tệp NTFS, những thứ đó sẽ không có mặt).


2

Trong zsh, sử dụng vòng loại toàn cầu . để chỉ khớp các tệp thông thường (không bao gồm các liên kết tượng trưng) và Dđể khớp với các tệp chấm:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Nếu dòng lệnh quá dài, bạn có thể sử dụng zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
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.