Thực thi một tập lệnh trong zsh - quyền tập tin


16

Tôi bối rối về việc thực thi quyền truy cập tập tin không hành xử như tôi mong đợi. Có lẽ vì kỳ vọng của tôi là sai. Dù sao:

Tôi có một tập tin kịch bản, để đơn giản chỉ cần gọi s, nằm trong ~/bin. Vì lợi ích của ví dụ này, tệp chỉ chứa các dòng sau:

#!/bin/zsh
echo "Test";

Rất đơn giản.

Tôi điều hướng đến ~/binthư mục, và chmodcác điều khoản của tập tin sđể 400- tức là, chỉ đọc cho tôi mà thôi. Không có sự cho phép thực thi. Vì vậy, sau đó tôi thử thực thi kịch bản bằng cách nhập đường dẫn của nó, đưa ra điều này:

% ./s
zsh: permission denied: ./s

Càng xa càng tốt. Các tập tin không thể được thực thi do các quyền sai. Các quyền truy cập tối đa 500(quyền thực thi được cấp) cũng hoạt động tốt - với các quyền này, tệp thực thi tốt:

% ./s
Test

Đây là tất cả như mong đợi. Nhưng sau đó tôi chmodcho phép quay trở lại 400(thực thi lại quyền), thử sourceing tệp và điều này xảy ra:

% source s
Test

Mặc dù quyền là 400, kịch bản thực thi.

Vì vậy, đây là câu hỏi của tôi: tại sao ./sthất bại (như nó nên) nhưng source sthực thi bình thường? Điều này không đánh bại toàn bộ mục đích của sự cho phép thực thi?

Tại 400quyền, sh szsh scũng làm việc.

Tôi chắc chắn rằng tôi đang làm hoặc hiểu một cái gì đó sai lầm khủng khiếp ở đâu đó. Có thể ai đó điểm ra nơi với tôi, và giải thích sự khác biệt giữa ./s, source s, sh szsh s?

Câu trả lời:


17

Khi bạn chạy ./s, bạn nói với kernel để thực thi chương trình s. Nếu bạn có quyền thực thi, thì hạt nhân sẽ đọc một vài byte đầu tiên của tệp, nhìn thấy #!dòng để nó biết rằng đây là một tập lệnh và chạy trình thông dịch, chuyển tên tập lệnh làm đối số đầu tiên. Nếu bạn không có quyền thực thi, kernel sẽ hủy bỏ việc thực thi ở bước đầu tiên.

Khi bạn chạy zsh s, bạn thực thi zshvà yêu cầu nó đọc tệp được gọi svà giải thích nó dưới dạng các lệnh. Bạn không thực thi s, bạn đang thực thi zsh. Điều tương tự với sh shoặc cat s.

Khi bạn chạy source s, một lần nữa, bạn bảo zsh đọc một tệp, vì vậy điều quan trọng là bạn có được phép đọc nó không.


Được rồi, điều đó có ý nghĩa. Nhưng điều đó không hoàn toàn đánh bại điểm có quyền thực thi? Không quan trọng là nó có được đặt hay không, tôi sẽ luôn có thể thực thi tập lệnh (hoặc nói với zsh để diễn giải các lệnh trong tập lệnh, tương đương).
C106

Ngoài ra, cat schỉ cần in nội dung của tập tin. cat s | zshchuyển chúng đến zshvà in Test.
C106

1
@ C106 Điểm của quyền thực thi là chỉ ra rằng tệp đại diện cho thứ gì đó mà bạn có thể thực thi mà không cần thêm thông tin. Nó cũng quan trọng nếu tập tin là setuid / setgid. Một tệp có thể không có quyền thực thi nhưng dù sao cũng bao gồm các hướng dẫn rằng nó xảy ra rằng một số chương trình máy tính ở đâu đó thực thi.
Gilles 'SO- ngừng trở nên xấu xa'

Điều đó rất có ý nghĩa, và trên thực tế là vô cùng rõ ràng thực sự. Cảm ơn.
C106
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.