Christian Weisgerber <
na...@mips.inka.de>:
> On 2023-07-31, Alexander Goetzenstein <
alexander_g...@web.de> wrote:
>
>> Die Angabe der Ausgabedatei ist zwingend. Deswegen suche ich
>> nach einer Möglichkeit, es umzuleiten, so dass nicht auf die
>> Platte geschrieben wird. Wenn das nicht geht, muss ich mir
>> etwas anderes einfallen lassen.
>>
>
> Man kann dazu das magische Device /dev/stdout als Dateinamen
> angeben, das heute wohl jedes Unix hat. Das liefert dann die
> Ausgabe an die Standardausgabe des Prozesses, wo auch immer sie
> gerade hinzeigt: TTY, Pipe, ...
>
Das „wo immer sie gerade hinzeigt“ ist bei Linux leider nicht
ganz problemlos: Bei Linux führt das dazu, dass der Prozess,
indem er „/dev/stdout“ öffnet, in Wirklichkeit die Datei, TTY,
Pipe, … öffnet, auf die auch die Standardausgabe (file descriptor
Nummer 1) geöffnet ist. Es findet also nicht eine
Ausgabumlenkung (file descriptor duplication) sondern ein
(erneutes) Öffnen statt. Und wie bei jedem Öffnen gibt es auch
hier eine Rechteprüfung.
Falls nun das Ziel der Standardausgabe aber vom Prozess mangels
Zugriffsrechten nicht geöffnet werden kann, scheitert das Öffnen
von „/dev/stdout“, obwohl der Zugriff mittels des bereits
vorhandenen file descriptors Nummer 1 weiterhin funktioniert.
Für das folgende Beispiel zur Verdeutlichung braucht man zwei
Benutzerkonten, die nicht allmächtig („root“) sind,
beispielsweise „Benutzer_1“ und „Benutzer_2“.
Benutzer_1 legt in seinem HOME‐Verzeichnis ein Verzeichnis
„~/Spielwiese“ mit Zugriffsrechten, die Benutzer_2 keinen Zugriff
erlauben, an, etwa mit folgendem Shell‐Kommando:
( umask -- go= && mkdir -- ~/Spielwiese )
Dann startet er das folgende Kommando (das nach dem
Login‐Passwort für Benutzer_2 fragt):
su -- - Benutzer_2 -c -- \
'
printf %s\\n direkt
printf %s\\n /dev/stdout |
cp -- /dev/stdin /dev/stdout
' -su \
>> ~/Spielwiese/Hallo.txt
=> Das interaktive Shell läuft unter Benutzer_1 und öffnet die
Datei „~/Spielwiese/Hallo.txt“ zum (anhängenden) Schreiben und
reicht den dabei erhaltenen file descriptor mittels
Ausgabeumlenkung an das unter Benutzer_2 laufende Shell weiter,
das ihn zur Ausgabe verwendet. Das erste „echo“‐Kommando gibt
dabei den Text „direkt“ auf die Standardausgabe aus. Das zweite
„echo“‐Kommando gibt den Text „/dev/stdout“ in ein Pipe zu „cp“,
das die Datei „/dev/stdin“, also das Lese‐Ende des Pipes, zum
Lesen öffnet und die Datei „/dev/stdout“, also die Datei
„~/Spielwiese/Hallo.txt“ zum Schreiben zu öffnen versucht und
dabei, weil die Zugriffserlaubnisse der Datei
„~/Spielwiese/Hallo.txt“ das nicht hergeben, scheitert.
Kontrolle: Das Kommando
ls -ld -- ~/Spielwiese/Hallo.txt &&
cat -- ~/Spielwiese/Hallo.txt
zeigt die Datei und ihren Inhalt: Die Ausgabe „direkt“ ist
angekommen, während die Ausgabe „/dev/stdout“ auf der Strecke
geblieben ist.
Gerüchten zufolge soll es andere Unixe geben, bei denen das
Öffnen von „/dev/stdout“ wirklich einer Ausgabeumleitung
entspricht.