Будет ли chmod 000 / dev / stdin отключать терминал навсегда?

12

Я работаю над вопросами из Unix The Textbook (глава 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не сообщает управляющий терминал, но терминал открыт на стандартном вводе, если таковой имеется. Таким образом, в Linux, где / dev / stdin - это не устройство, а специальная символическая ссылка на файл, открытый в / dev / stdin, chmot "$(tty)"будет более или менее такой же, как chmod /dev/stdin(если stdin является устройством tty и попытается изменить режим not a ttyфайл в текущем каталоге в противном случае). Смотрите /dev/$(ps -o tty= -p "$$")для управляющего терминала.
Стефан