Post by Sieghard SchicktanzHallo Lutz,
Post by Lutz FalkeWas soll da nicht wie erwartet funktioneren? Das tut genau was
es soll.
Ja, aber wohl nicht das, was im Thread angesproche n wurde,
nämlich zur "Befriedigung" von Eingabeanforderung eines
Programms zu sorgen, das nicht ohne "stdin" laufen will. ...
Eher nicht. Ein Programm, was tatsächlich Daten in der
Standardeingabe angeliefert haben will, kann man nicht dadurch
befriedigen, dass man ihm als Standardeingabe einen Anschluss auf
„/dev/null“ oder „/dev/zero“ gibt. Aber das ist auch nicht
unbedingt der Sinn einer Umleitung der Standardeingabe auf
„/dev/null“. Der Sinn ist vielmehr eine Vorsichtsmaßnahme, die
den im folgenden beschriebenen Angriffsvektor verhindert:
Wenn ein Programm P keine Daten aus der Standardeingabe lesen
will, sondern statt dessen seine Datenquelle Q selber öffnet,
kann es passieren, wenn die Standardeingabe beim Programmstart
geschlossen ist, dass die selbstgeöffnete Datenquelle als file
descriptor die Nummer 0, also die üblicherweise für die
Standardeingabe verwendete Nummer, erhält. Wenn sich das
Programm P nun zur Erledigung seiner Aufgabe anderer
Dienstprogramme bedient (so etwas kommt beispielsweise in
Shell‐Skripten häufig vor), erhalten diese anderen
Dienstprogramme – sofern bei der Entwicklung des Programms P
nicht daran gedacht wurde, vor dem Start der Dienstprogramme die
Standardeingabe von der Datenquelle Q zu trennen – möglicherweise
als Standardeingabe versehentlich die Datenquelle Q, obwohl sie
im Fehlerfall aus ihrer Standardeingabe eine bestätigende Antwort
des Anwenders (beispielsweise „Remove file (y/n)?“) erwarten.
Das hat zur Folge, dass sie erstens möglicherweise Unsinn machen
und zweitens jedenfalls dem Programm P Daten aus dessen aus der
Datenquelle Q gespeisten Datenstrom „weglesen“.
Deshalb bricht man die Konvention, dass ein Programm beim Start
davon ausgehen darf, dass es die Standardeingabe, Standardausgabe
und Fehlerausgabe geöffnet vorfindet, nicht ohne Not: Will man
dem Programm in der Tat keine Daten über die Standardeingabe
liefern, ruft man es mit auf „/dev/null“ umgelenkter
Standardeingabe, nicht mit geschlossener Standardeingabe, auf.