Tôi vô tình chmod -R + x trên một thư mục. Làm cách nào để khôi phục quyền chính xác?


20

Vâng, để được cụ thể, nó đã được chmod -R 755. Bây giờ mọi tập tin đều có thể thực thi được, điều mà tôi không muốn. Tôi nghĩ rằng tôi nên xem xét hai byte đầu tiên của mỗi tệp cho tệp này #!, nhưng liệu điều này có bao gồm mọi thứ không? Thay vào đó tôi nên sử dụng fileđể xem xét mọi thứ và dựa trên quyết định của mình? Hoặc, nhiều khả năng, có một cách thậm chí tốt hơn để làm điều này?

Cách ưa thích để đệ quy đi qua một thư mục và đặt -x trên các tệp không 'được cho là' có thể thực thi được là gì?


Bạn đã làm điều này tại /hoặc thư mục khác?
gvkv

1
@gvkv: Không /, một thư mục hoàn toàn thuộc sở hữu của tôi.
Larry Wang

1
@Larry trong tương lai có lẽ bạn nên sử dụng một số biến thể của + x thay vì cưỡng hiếp tất cả các quyền và có thể gây ra ghi trên tất cả các tệp.
xenoterracide

@xenoterracide: Đồng ý. Điều tôi thực sự muốn là cung cấp cho các nhóm quyền giống như tôi (điều đó đã xảy ra!), Tôi chỉ không nghĩ đủ trước khi tôi gõ.
Larry Wang

Có bao nhiêu tập tin chúng ta đang nói về? Có bao nhiêu nên được thực thi? Có cách nào để nói từ tên tập tin?
David Thornley

Câu trả lời:


15

Không có viên đạn ma thuật nào ở đây. Các quyền mang thông tin không phải lúc nào cũng dư thừa.

Nếu bạn đã thực hiện việc này trong một thư mục hệ thống, hệ thống của bạn sẽ ở trạng thái rất xấu, bởi vì bạn phải lo lắng về các bit setuid và setgid và về các tệp không được đọc trên thế giới và về các tệp được cho là nhóm hoặc thế giới có thể ghi.

Trong thư mục theo người dùng, bạn phải lo lắng về các tệp không thể đọc được trên thế giới. Không ai có thể giúp bạn ở đó.

Đối với khả năng thực thi, một quy tắc tốt sẽ là làm cho mọi thứ trông không giống như nó có thể được thực thi, không thể thực hiện được. Các hạt nhân có thể thực hiện các kịch bản mà hai byte đầu tiên là #!, mã nhị phân ELF có bốn byte đầu tiên là \x7fELFnơi \x7flà byte với giá trị 12, và một vài loại tập tin hiếm (a.out, bất cứ điều gì đã đăng ký với binfmt_misc). Do đó, lệnh sau sẽ khôi phục quyền của bạn về trạng thái hợp lý (giả sử bash 4 hoặc zsh, nếu không thì sử dụng findđể duyệt qua cây thư mục; cảnh báo, được nhập trực tiếp vào trình duyệt):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Lưu ý rằng có một cách đơn giản để sao lưu và khôi phục quyền của cây thư mục, trên Linux và có thể các thông báo khác có hỗ trợ ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

Cảm ơn! May mắn thay, tôi nghĩ mọi thứ rơi vào hai loại này. Nếu điều này bỏ lỡ bất cứ điều gì, tôi có thể giải quyết nó sau.
Larry Wang

Hãy nhớ rằng **/*yêu cầu globstar.
Chris Xuống

Tôi muốn đề nghị hai thay đổi cho kịch bản này. Một, sử dụng findchứ không phải là sao; hai, thay vì nhìn vào cái đầu, hãy sử dụng filelệnh để xem nó là gì và rẽ nhánh từ đó.
Shadur

@Shadur findlà ít đáng tin cậy hơn globstar, globstarđược ưa thích trong hầu hết mọi trường hợp.
Chris Xuống

1
@Gilles Ưu tiên như trong "nếu bạn có nó, nó vượt trội hơn nhiều", không chỉ nhanh hơn, nó còn đáng tin cậy hơn (và không có SNAFU bất ngờ).
Chris Xuống

6

Tôi tin rằng bạn sẽ muốn một cái gì đó như

find dir -type f -exec chmod ugo-x '{}' +

Điều này tìm kiếm tất cả các tệp thông thường, đệ quy trong dir, (nó loại trừ các thư mục và thiết bị) và loại bỏ bit thực thi.

Tôi sẽ bắt đầu ở đây, và sau đó làm việc theo cách của tôi để tạo ra các tệp được cho là có thể thực thi được, có thể thực thi được.

Các thao tác sau sẽ hoạt động chính xác như bạn yêu cầu (nó sẽ tìm tất cả các tệp thông thường, grep chúng cho #! Và sau đó xóa các bit x nếu không tìm thấy)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

có thể là một phiên bản tốt hơn ở trên (ít ống hơn)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 

3
Làm cho grep -L '^#!'ít nhất (các trích dẫn là cần thiết và ^hạn chế khớp ở đầu dòng), nhưng nó vẫn quá dễ dãi vì nó khớp với #!bất kỳ dòng nào. Việc sử dụng xargssẽ thất bại với tên tệp chứa khoảng trắng hoặc trích dẫn ký tự; sử dụng xargs -d '\n'(yêu cầu GNU xargs).
Gilles 'SO- ngừng trở nên xấu xa'

0

Chà, không có dòng shebang, tập tin sẽ được thực thi như một tập lệnh shell, trên danh nghĩa với /bin/sh. Ý tưởng của bạn là một khởi đầu tốt và với giả định rằng thư mục trong câu hỏi không chứa các tệp quan trọng về nhiệm vụ có lẽ không có nhiều rủi ro để thực hiện một số grepchmodkết hợp. Bạn có thể gặp phải các thông báo sai, tức là các tệp có dòng shebang không có nghĩa là có tập bit thực thi của chúng nhưng không biết thêm thông tin về mục đích của những gì trong thư mục, chỉ bạn mới có thể quyết định liệu điều đó có gây ra mối đe dọa tồn tại đáng kể cho bạn không hệ thống và / hoặc dữ liệu.


Tôi không lo lắng quá nhiều về dương tính giả là âm tính giả. Có những nhị phân mà tôi không nghĩ bắt đầu với #!.
Larry Wang
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.