Würde chmod 000 / dev / stdin das Terminal für immer deaktivieren?

12

Ich arbeite an Fragen aus Unix The Textbook (Kapitel 8, # 16, Seite 207) :

Geben Sie chmodBefehlszeilen an, die dieselben Aufgaben ausführen wie die Befehle mesg nund mesg y. (Hinweis: Jedem Hardwaregerät, einschließlich Ihres Terminals, ist eine Datei im /devVerzeichnis 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?

Philip Kirkbride
quelle
2
Es ist wichtig zu verstehen, dass Berechtigungen nur beim Öffnen einer Datei überprüft werden. Unabhängig von der Standardeingabe Ihrer Shell können Sie daher keine Befehle eingeben, wenn Sie deren Berechtigungen ändern, da sowohl die Shell als auch der Terminalemulator oder ssh oder was auch immer den Kommunikationskanal bereits geöffnet haben. mesg nkönnen Berechtigungen verwenden Zukunft zu beeinflussen writes nur , weil write nicht bereits das Terminal geöffnet haben.
zwol

Antworten:

20

Nein, /dev/stdinund /dev/stdoutsind 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/stdinund /dev/stdoutsind 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/stdinund /dev/stdoutwü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 mesgmü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 Sie ttysehen, was das Endgerät ist. mesg nist gleichbedeutend mit chmod g-w "$(tty)"und mesg yist gleichbedeutend mit chmod g+w "$(tty)".

Gilles 'SO - hör auf böse zu sein'
quelle
2
ttymeldet 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, ist chmot "$(tty)"das mehr oder weniger dasselbe wie chmod /dev/stdin(wenn stdin ein tty-Gerät ist, und würde versuchen, den Modus von zu ändern eine not a ttyDatei im aktuellen Verzeichnis sonst). Siehe /dev/$(ps -o tty= -p "$$")für das steuernde Terminal.
Stéphane Chazelas