¿Chmod 000 / dev / stdin deshabilitaría el terminal para siempre?

12

Estoy trabajando con las preguntas de Unix The Textbook (capítulo 8, # 16, página 207) :

Proporcione chmodlíneas de comando que realicen las mismas tareas que los comandos mesg ny mesg y. (Sugerencia: cada dispositivo de hardware, incluido su terminal, tiene un archivo asociado en el /devdirectorio).

Creo que la respuesta es:

mesg n = chmod 770 /dev/stdout

mesg y = chmod 777 /dev/stdout

Pero me preguntaba qué pasa si lo usas chmod 000 /dev/stdin.

¿Te bloquean la entrada de comandos en la terminal?

Philip Kirkbride
fuente
2
Es importante comprender que los permisos solo se verifican cuando se abre un archivo. Por lo tanto, no importa cuál sea la entrada estándar de su shell, cambiar sus permisos no le impedirá ingresar comandos, porque tanto el shell como el emulador de terminal o ssh o lo que sea, ya han abierto el canal de comunicaciones. mesg npuede usar permisos para afectar futuros writes solo porque write aún no tiene el terminal abierto.
zwol

Respuestas:

20

No, /dev/stdiny /dev/stdoutson el dispositivo equivocado. Estos no son dispositivos terminales, son alias para entrada estándar y salida estándar respectivamente. La entrada estándar y la salida estándar son, por definición, descriptores de archivo que las aplicaciones esperan que estén abiertas y tengan un significado convencional (descriptor de archivo 0 y 1 respectivamente, también hay 2, que es un error estándar). Los dispositivos como /dev/stdiny /dev/stdoutson útiles cuando una aplicación requiere un nombre de archivo, pero el usuario de la aplicación desea que acceda a un descriptor de archivo en particular en lugar de abrir algún archivo. Dependiendo de la variante de Unix, puede que ni siquiera sean archivos de dispositivo; por ejemplo, en Linux, son enlaces simbólicos a/proc/self/fd/0 y amigos, y estos son a su vez enlaces simbólicos "mágicos" a cualquier archivo que el proceso ya haya abierto en ese descriptor de archivo.

Cambiar los permisos de /dev/stdiny /dev/stdoutsolo cambiaría lo que sucede cuando estos nombres de archivo se usan explícitamente. No afecta nada relacionado con el terminal, y no afecta el uso normal de entrada y salida estándar, ya que los permisos solo importan al abrir un nombre de archivo en particular.

Lo que mesghace es cambiar los permisos de la terminal de control del proceso . Para una aplicación que se ejecuta en un terminal, el terminal está abierto en entrada estándar, salida estándar y error estándar (descriptores de archivo 0, 1 y 2). Puede usar el comando ttypara ver cuál es el dispositivo terminal. mesg nes equivalente a chmod g-w "$(tty)"y mesg yes equivalente a chmod g+w "$(tty)".

Gilles 'SO- deja de ser malvado'
fuente
2
ttyno informa el terminal de control, pero el terminal se abre en stdin si lo hay. Entonces, en Linux, donde / dev / stdin no es un dispositivo, sino un enlace simbólico especial al archivo abierto en / dev / stdin, chmot "$(tty)"sería más o menos lo mismo que chmod /dev/stdin(si stdin es un dispositivo tty e intentaría cambiar el modo de un not a ttyarchivo en el directorio actual de lo contrario). Ver /dev/$(ps -o tty= -p "$$")para el terminal de control.
Stéphane Chazelas