Apakah chmod 000 / dev / stdin akan menonaktifkan terminal selamanya?

12

Saya sedang mengerjakan pertanyaan dari Unix The Textbook (bab 8, # 16, halaman 207) :

Berikan chmodbaris perintah yang melakukan tugas yang sama dengan yang mesg ndan mesg yperintah lakukan. (Petunjuk: Setiap perangkat perangkat keras, termasuk terminal Anda, memiliki file terkait dalam /devdirektori.)

Saya yakin jawabannya adalah:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

Tapi saya bertanya-tanya apa yang terjadi jika Anda menggunakan chmod 000 /dev/stdin?

Apakah Anda terkunci karena memasukkan perintah di terminal?

Philip Kirkbride
sumber
2
Penting untuk dipahami bahwa izin hanya diperiksa ketika file dibuka. Oleh karena itu, tidak peduli apa input standar shell Anda terjadi, mengubah izinnya tidak akan mengunci Anda dari memasukkan perintah, karena baik shell maupun terminal emulator atau ssh atau apa pun sudah membuka saluran komunikasi. mesg ndapat menggunakan izin untuk mempengaruhi masa depan writes hanya karena write tidak sudah terbuka terminal.
zwol

Jawaban:

20

Tidak, /dev/stdindan /dev/stdoutperangkat yang salah. Ini bukan perangkat terminal, mereka alias untuk input standar dan output standar masing-masing. Input standar dan output standar, menurut definisi, deskriptor file yang diharapkan aplikasi akan terbuka dan memiliki makna konvensional (masing-masing deskriptor file 0 dan 1, ada juga 2 yang merupakan kesalahan standar). Perangkat seperti /dev/stdindan /dev/stdoutberguna ketika aplikasi membutuhkan nama file, tetapi pengguna aplikasi menginginkannya untuk mengakses deskriptor file tertentu daripada membuka beberapa file. Bergantung pada varian unix, mereka bahkan mungkin bukan file perangkat; misalnya, di Linux, mereka adalah tautan simbolis/proc/self/fd/0 dan teman-teman, dan ini pada gilirannya merupakan "simbolis" tautan simbolis ke file apa pun yang prosesnya sudah terbuka pada file deskriptor itu.

Mengubah izin /dev/stdindan /dev/stdouthanya akan mengubah apa yang terjadi ketika nama file ini digunakan secara eksplisit. Itu tidak mempengaruhi apa pun yang terkait dengan terminal, dan itu tidak mempengaruhi penggunaan normal input standar dan output standar, karena izin hanya penting ketika membuka nama file tertentu.

Apa yang mesgdilakukan adalah mengubah izin terminal pengendali proses . Untuk aplikasi yang berjalan di terminal, terminal terbuka pada input standar, standar ouput dan kesalahan standar (deskriptor file 0, 1 dan 2). Anda dapat menggunakan perintah ttyuntuk melihat apa perangkat terminal itu. mesg nsama dengan chmod g-w "$(tty)"dan mesg ysetara dengan chmod g+w "$(tty)".

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
ttytidak melaporkan terminal pengendali, tetapi terminal terbuka di stdin jika ada. Jadi di Linux di mana / dev / stdin bukan perangkat tetapi symlink khusus ke file yang terbuka di / dev / stdin, chmot "$(tty)"akan lebih atau kurang sama dengan chmod /dev/stdin(jika stdin adalah perangkat tty, dan akan berusaha mengubah mode dari sebuah not a ttyfile dalam direktori saat ini sebaliknya). Lihat /dev/$(ps -o tty= -p "$$")untuk terminal pengendali.
Stéphane Chazelas