Chmod 000 / dev / stdin sẽ tắt thiết bị đầu cuối mãi mãi?


12

Tôi đang làm việc thông qua các câu hỏi từ Unix Sách giáo khoa (chương 8, # 16, trang 207) :

Đưa ra chmodcác dòng lệnh thực hiện các nhiệm vụ tương tự mà các lệnh mesg nmesg ythực hiện. (Gợi ý: Mọi thiết bị phần cứng, bao gồm cả thiết bị đầu cuối của bạn, có một tệp liên quan trong /devthư mục.)

Tôi tin rằng câu trả lời là:

mesg n = = chmod 770 /dev/stdout

mesg y = = chmod 777 /dev/stdout

Nhưng tôi đã tự hỏi điều gì xảy ra nếu bạn sử dụng chmod 000 /dev/stdin?

Bạn có bị khóa trong việc nhập lệnh trong thiết bị đầu cuối?


2
Điều quan trọng là phải hiểu rằng các quyền chỉ được kiểm tra khi tệp được mở. Do đó, bất kể đầu vào tiêu chuẩn của shell của bạn là gì, việc thay đổi quyền của nó sẽ không khóa bạn khi nhập lệnh, bởi vì cả shell và trình giả lập thiết bị đầu cuối hoặc ssh hoặc bất cứ điều gì đã mở kênh liên lạc. mesg nchỉ có thể sử dụng quyền để ảnh hưởng đến tương lai writewrite chưa mở thiết bị đầu cuối.
zwol

Câu trả lời:


20

Không, /dev/stdin/dev/stdoutlà thiết bị sai. Đây không phải là thiết bị đầu cuối, chúng là bí danh cho đầu vào tiêu chuẩn và đầu ra tiêu chuẩn tương ứng. Theo định nghĩa, đầu vào tiêu chuẩn và đầu ra tiêu chuẩn, theo định nghĩa, các mô tả tệp mà các ứng dụng mong đợi được mở và có ý nghĩa thông thường (mô tả tệp 0 và 1 tương ứng, cũng có 2 là lỗi tiêu chuẩn). Các thiết bị như /dev/stdin/dev/stdouthữu ích khi một ứng dụng yêu cầu tên tệp, nhưng người dùng ứng dụng muốn nó truy cập vào một mô tả tệp cụ thể thay vì mở một số tệp. Tùy thuộc vào biến thể unix, chúng thậm chí có thể không phải là tệp thiết bị; ví dụ, trên Linux, chúng là các liên kết tượng trưng đến/proc/self/fd/0 và bạn bè, và đến lượt chúng, các liên kết tượng trưng của Ma thuật đến bất kỳ tệp nào mà quá trình đã mở trên mô tả tệp đó.

Thay đổi quyền của /dev/stdin/dev/stdoutsẽ chỉ thay đổi những gì xảy ra khi những tên tệp này được sử dụng rõ ràng. Nó không ảnh hưởng đến bất cứ điều gì liên quan đến thiết bị đầu cuối và nó không ảnh hưởng đến việc sử dụng thông thường đầu vào tiêu chuẩn và đầu ra tiêu chuẩn, vì các quyền chỉ quan trọng khi mở một tên tệp cụ thể.

Điều gì mesglàm là thay đổi các quyền của thiết bị đầu cuối kiểm soát của quá trình . Đối với một ứng dụng đang chạy trong một thiết bị đầu cuối, thiết bị đầu cuối được mở trên đầu vào tiêu chuẩn, thông số tiêu chuẩn và lỗi tiêu chuẩn (mô tả tệp 0, 1 và 2). Bạn có thể sử dụng lệnh ttyđể xem thiết bị đầu cuối là gì. mesg ntương đương chmod g-w "$(tty)"mesg ytương đương với chmod g+w "$(tty)".


2
ttykhông báo cáo thiết bị đầu cuối kiểm soát, nhưng thiết bị đầu cuối mở trên stdin nếu có. Vì vậy, trên Linux, nơi / dev / stdin không phải là một thiết bị mà là một liên kết tượng trưng đặc biệt đến tệp đang mở trên / dev / stdin, chmot "$(tty)"sẽ ít nhiều giống như chmod /dev/stdin(nếu stdin là một thiết bị tty và sẽ cố gắng thay đổi chế độ của một not a ttytập tin trong thư mục hiện tại nếu không). Xem /dev/$(ps -o tty= -p "$$")cho các thiết bị đầu cuối kiểm soát.
Stéphane Chazelas
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.