Estoy trabajando con las preguntas de Unix The Textbook (capítulo 8, # 16, página 207) :
Proporcione
chmod
líneas de comando que realicen las mismas tareas que los comandosmesg n
ymesg y
. (Sugerencia: cada dispositivo de hardware, incluido su terminal, tiene un archivo asociado en el/dev
directorio).
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?
mesg n
puede usar permisos para afectar futuroswrite
s solo porquewrite
aún no tiene el terminal abierto.Respuestas:
No,
/dev/stdin
y/dev/stdout
son 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/stdin
y/dev/stdout
son ú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/stdin
y/dev/stdout
solo 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
mesg
hace 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 comandotty
para ver cuál es el dispositivo terminal.mesg n
es equivalente achmod g-w "$(tty)"
ymesg y
es equivalente achmod g+w "$(tty)"
.fuente
tty
no 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 quechmod /dev/stdin
(si stdin es un dispositivo tty e intentaría cambiar el modo de unnot a tty
archivo en el directorio actual de lo contrario). Ver/dev/$(ps -o tty= -p "$$")
para el terminal de control.