Ich arbeite an Fragen aus Unix The Textbook (Kapitel 8, # 16, Seite 207) :
Geben Sie
chmod
Befehlszeilen an, die dieselben Aufgaben ausführen wie die Befehlemesg n
undmesg y
. (Hinweis: Jedem Hardwaregerät, einschließlich Ihres Terminals, ist eine Datei im/dev
Verzeichnis zugeordnet.)
Ich glaube die Antwort ist:
mesg n
= chmod 770 /dev/stdout
mesg y
= chmod 777 /dev/stdout
Aber ich habe mich gefragt, was passiert, wenn Sie verwenden chmod 000 /dev/stdin
?
Können Sie keine Befehle im Terminal eingeben?
mesg n
können Berechtigungen verwenden Zukunft zu beeinflussenwrite
s nur , weilwrite
nicht bereits das Terminal geöffnet haben.Antworten:
Nein,
/dev/stdin
und/dev/stdout
sind das falsche Gerät. Hierbei handelt es sich nicht um Endgeräte, sondern um Aliase für die Standardeingabe bzw. -ausgabe. Standardeingabe und Standardausgabe sind per Definition Dateideskriptoren , von denen Anwendungen erwarten, dass sie geöffnet sind und eine herkömmliche Bedeutung haben (Dateideskriptor 0 bzw. 1, es gibt auch 2, bei denen es sich um einen Standardfehler handelt). Geräte wie/dev/stdin
und/dev/stdout
sind nützlich, wenn eine Anwendung einen Dateinamen erfordert, der Benutzer der Anwendung jedoch den Zugriff auf einen bestimmten Dateideskriptor wünscht, anstatt eine Datei zu öffnen. Je nach Unix-Variante handelt es sich möglicherweise nicht einmal um Gerätedateien. Unter Linux sind dies beispielsweise symbolische Links zu/proc/self/fd/0
und Freunde, und dies sind wiederum "magische" symbolische Links zu der Datei, die der Prozess bereits in diesem Dateideskriptor geöffnet hat.Das Ändern der Berechtigungen von
/dev/stdin
und/dev/stdout
würde nur ändern, was passiert, wenn diese Dateinamen explizit verwendet werden. Es hat keine Auswirkungen auf das Terminal und auch nicht auf die normale Verwendung der Standardeingabe und -ausgabe, da die Berechtigungen nur beim Öffnen eines bestimmten Dateinamens von Bedeutung sind.Sie
mesg
müssen lediglich die Berechtigungen des steuernden Terminals des Prozesses ändern . Für eine Anwendung, die in einem Terminal ausgeführt wird, ist das Terminal für Standardeingabe, Standardausgabe und Standardfehler geöffnet (Dateideskriptoren 0, 1 und 2). Mit dem Befehl können Sietty
sehen, was das Endgerät ist.mesg n
ist gleichbedeutend mitchmod g-w "$(tty)"
undmesg y
ist gleichbedeutend mitchmod g+w "$(tty)"
.quelle
tty
meldet das steuernde Terminal nicht, aber das Terminal ist auf stdin geöffnet, falls vorhanden. Also unter Linux, wo / dev / stdin kein Gerät ist, sondern ein spezieller Symlink zu der Datei, die unter / dev / stdin geöffnet ist, istchmot "$(tty)"
das mehr oder weniger dasselbe wiechmod /dev/stdin
(wenn stdin ein tty-Gerät ist, und würde versuchen, den Modus von zu ändern einenot a tty
Datei im aktuellen Verzeichnis sonst). Siehe/dev/$(ps -o tty= -p "$$")
für das steuernde Terminal.