Чи б chmod 000 / dev / stdin відключити термінал назавжди?


12

Я працюю над питаннями з підручника Unix (глава 8, №16, сторінка 207) :

Дайте chmodкомандні рядки, які виконують ті самі завдання, що mesg nі mesg yкоманди. (Підказка. Кожен апаратний пристрій, включаючи ваш термінал, має в /devкаталозі пов'язаний файл .)

Я вважаю, що відповідь така:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

Але мені було цікаво, що станеться, якщо використовувати chmod 000 /dev/stdin?

Ви заблоковані від введення команд у терміналі?


2
Важливо розуміти, що дозволи перевіряються лише при відкритті файлу. Тому, незалежно від того, яким буде стандартний вхід вашої оболонки, зміна її дозволів не дозволить вам увійти до команд, оскільки оболонка та емулятор термінала або ssh або що-небудь вже відкрили канал зв'язку. mesg nможеш використовувати дозвіл вплинути на майбутнє writes тільки тому , що write НЕ вже є термінал відкриті.
zwol

Відповіді:


20

Ні, /dev/stdinі /dev/stdoutнеправильний пристрій. Це не термінальні пристрої, вони псевдоніми для стандартного вводу і стандартного виводу відповідно. Стандартний вхід і стандартний вихід - це визначення дескрипторів файлів, які програми очікують відкрити і мають загальноприйняте значення (дескриптор файлів 0 і 1 відповідно, також є 2, що є стандартною помилкою). Пристрої, такі як /dev/stdinі /dev/stdoutє корисними, коли програма потребує імені файлу, але користувач програми хоче, щоб він отримав доступ до певного дескриптора файлів, а не відкривав якийсь файл. Залежно від варіанту unix, вони можуть навіть не бути файлами пристроїв; наприклад, в Linux вони символічні посилання на/proc/self/fd/0 і друзі, а це, в свою чергу, "магічні" символічні посилання на будь-який файл, який процес уже відкрив у цьому дескрипторі файлу.

Змінення дозволів /dev/stdinі /dev/stdoutзмінило б лише те, що відбувається, коли ці імена файлів використовуються явно. Це не впливає на те, що стосується терміналу, і не впливає на нормальне використання стандартного вводу та стандартного виводу, оскільки дозволи мають значення лише під час відкриття конкретного імені файлу.

Що mesgпотрібно зробити - це змінити дозволи контрольного терміналу процесу . Для програми, що працює в терміналі, термінал відкритий на стандартному вході, стандартному виході та стандартній помилці (дескриптори файлів 0, 1 і 2). За допомогою команди ttyможна переглянути, що таке термінальний пристрій. mesg nеквівалентний chmod g-w "$(tty)"і mesg yеквівалентний chmod g+w "$(tty)".


2
ttyне повідомляє про керуючий термінал, але термінал відкритий на stdin, якщо такий є. Так що в Linux, де / dev / stdin не є пристроєм, а спеціальним символьним посиланням на файл, відкритий у / dev / stdin, chmot "$(tty)"було б майже таким же, як chmod /dev/stdin(якщо stdin - це tty-пристрій і намагатиметься змінити режим not a ttyфайл в поточному каталозі в іншому випадку). Див /dev/$(ps -o tty= -p "$$"). Контрольний термінал.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.