.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" and Copyright (c) 2006 Michael Kerrisk .\" .\" %%%LICENSE_START(VERBATIM) .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one. .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" %%%LICENSE_END .\" .\" Modified by Michael Haardt .\" Modified 1993-07-21 by Rik Faith .\" Modified 1994-08-21 by Michael Chastain : .\" Modified 1997-01-31 by Eric S. Raymond .\" Modified 1999-11-12 by Urs Thuermann .\" Modified 2004-06-23 by Michael Kerrisk .\" 2006-09-04 Michael Kerrisk .\" Added list of process attributes that are not preserved on exec(). .\" 2007-09-14 Ollie Wild , mtk .\" Add text describing limits on command-line arguments + environment .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH EXECVE 2 "10. Oktober 2019" Linux Linux\-Programmierhandbuch .SH BEZEICHNUNG execve \- Programm ausführen .SH ÜBERSICHT \fB#include \fP .PP \fBint execve(const char *\fP\fIPfadname\fP\fB, char *const \fP\fIargv\fP\fB[], \fP .br \fB char *const \fP\fIenvp\fP\fB[]);\fP .SH BESCHREIBUNG \fBexecve\fP() führt das Programm aus, auf das sich \fIPfadname\fP bezieht. Dies führt dazu, dass das Programm, das derzeit vom aufrufenden Prozess ausgeführt wird, durch ein neues Programm, mit einem frisch initialisierten Stack, Heap und (initialisierten und uninitialisierten) Datensegmenten ersetzt wird. .PP \fIPfadname\fP muss entweder ein binäres ausführbares Programm oder ein Skript sein, das mit einer Zeile der folgenden Form beginnt: .PP .in +4n .EX \fB#!\fP\fIInterpreter \fP[Optionale\-Arg] .EE .in .PP Einzelheiten zu letzterem Fall finden Sie in »Interpreter\-Skripte« weiter unten. .PP \fIargv\fP ist ein Feld von Argumentezeichenketten, die an das neue Programm übergeben werden. Per Konvention sollte die erste dieser Zeichenketten (d.h. \fIargv[0]\fP) den Dateinnamen, der zu der ausgeführten Datei gehört, enthalten. \fIenvp\fP ist ein Feld von Zeichenketten, das per Konvention die Form \fBSchlüssel=Wert\fP haben sollte, das an die Umgebung des neuen Programms übergeben wird. Die Felder \fIargv\fP und \fIenvp\fP müssen jeder einen Null\-Zeiger am Ende des Feldes enthalten. .PP Auf den Argumentzeiger und die Umgebung kann von der Main\-Funktion des aufgerufenen Programms zugegriffen werden, wenn sie wie folgt definiert ist: .PP .in +4n .EX int main(int argc, char *argv[], char *envp[]) .EE .in .PP Beachten Sie allerdings, dass die Verwendung eines dritten Arguments bei der Funktion main nicht in POSIX.1 spezifiziert ist; laut POSIX.1 sollte auf die Umgebung über die externe Variable \fBenviron\fP(7) zugegriffen werden. .PP \fBexecve\fP() kehrt bei Erfolg nicht zurück und Text, initialisierte Daten, uninitialisierte Daten (bss) und Stack des aufrufenden Prozesses werden entsprechend des Inhalts des neu geladenen Programms überschrieben. .PP Falls das aktuelle Programm mit ptrace verfolgt wird, wird nach einem erfolgreichen \fBexecve\fP() ein Signal \fBSIGTRAP\fP an es gesandt. .PP Falls bei der Programmdatei, auf die sich \fIPfadname\fP bezieht, das Bit set\-user\-ID gesetzt ist, dann wird die effektive Benutzerkennung des aufrufenden Programms zu der des Eigentümers der Programmdatei geändert. Ähnlich wird die effektive Gruppenkennung des aufrufenden Prozesses auf die Gruppe der Programmdatei gesetzt, wenn das Bit set\-group\-ID auf der Programmdatei gesetzt ist. .PP Die vorgenannten Umwandlungen der effektiven Kennungen werden \fInicht\fP durchgeführt (d.h. die Bits set\-user\-ID und set\-group\-ID werden ignoriert), falls eine der folgenden Aussagen wahr ist: .IP * 3 Das Attribut \fIno_new_privs\fP wird für den aufrufenden Thread gesetzt (siehe \fBprctl\fP(2)). .IP * Das unterliegende Dateisystem ist \fInosuid\fP eingehängt (der Schalter \fBMS_NOSUID\fP für \fBmount\fP(2)). .IP * Der aufrufende Prozess wird mit ptrace verfolgt. .PP Die Capabilities der Programmdatei (siehe \fBcapabilities\fP(7)) werden auch ignoriert, wenn eine der obigen Bedingungen zutrifft. .PP Die effektive Benutzerkennung des Prozesses wird in die gespeicherte set\-user\-ID kopiert. Ähnlich wird die effektive Gruppenkennung in die gespeicherte set\-group\-ID kopiert. Dieses Kopieren findet nach allen effektiven ID\-Änderungen statt, die aufgrund der Modusbits set\-user\-ID und set\-group\-ID erfolgen. .PP Die reale UID und reale GID des Prozesses sowie die zusätzlichen Gruppenkennungen ändern sich beim Aufruf von \fBexecve\fP() nicht. .PP Falls das Programm eine dynamisch gelinkte Programmdatei im a.out\-Format ist, die dynamische Bibliotheken\-Stubs enthält, dann wird der dynamische Linker \fBld.so\fP(8) von Linux am Anfang der Ausführung aufgerufen, um die benötigten Laufzeitobjekte in den Speicher zu bringen und das Programm mit ihnen zu verlinken. .PP Falls das Programm ein dynamisch gelinktes ELF\-Programm ist, wird der in dem Segment PT_INTERP benannte Interpreter zum Laden der gemeinsamen Objekte verwandt. Dieser Interpreter ist typischerweise \fI/lib/ld\-linux.so.2\fP für Programme, die mit der Glibc gelinkt sind (siehe \fBld\-linux.so\fP(8)). .PP Alle außer den nachfolgend aufgeführten Prozessattributen werden durch ein \fBexecve\fP() erhalten: .IP * 3 Die Zuordnung aller gefangenen Signale wird auf die Vorgabe zurückgesetzt (\fBsignal\fP(7)). .IP * Alle alternativen Signal\-Stacks werden nicht erhalten (\fBsigaltstack\fP(2)). .IP * Speicher\-Mappings werden nicht erhalten (\fBmmap\fP(2)). .IP * Gemeinsam benutzte Speichersegmente vom Typ »System V« werden abgetrennt (\fBshmat\fP(2)). .IP * Mappings gemeinsamer Speicherbereiche gemäß POSIX werden aufgehoben (\fBshm_open\fP(3)). .IP * Offene POSIX\-Nachrichtenwarteschlangendeskriptoren werden geschlossen (\fBmq_overview\fP(7)). .IP * Alle offenen benannten POSIX\-Semaphoren werden geschlossen (\fBsem_overview\fP(7)). .IP * POSIX\-Timer werden nicht erhalten (\fBtimer_create\fP(2)). .IP * Alle offenen Verzeichnis\-Streams werden geschlossen (\fBopendir\fP(3)). .IP * Speichersperren werden nicht erhalten (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP * Exit\-Handler werden nicht erhalten (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP * Die Gleitkomma\-Umgebung wird auf den Standardwert zurückgesetzt (siehe \fBfenv\fP(3)). .PP Die Prozessattribute in der vorstehenden Liste sind alle in POSIX.1 spezifiziert. Die folgenden Linux\-spezifischen Prozessattribute werden auch während eines \fBexecve\fP() nicht erhalten: .IP * 3 Der \fBprctl\fP(2)\-Schalter \fBPR_SET_DUMPABLE\fP wird gesetzt. Wird ein set\-user\-ID\- oder set\-group\-ID\-Programm ausgeführt, dann wird er auf 0 gesetzt. .IP * Der \fBprctl\fP(2)\-Schalter \fBPR_SET_KEEPCAPS\fP wird auf 0 gesetzt. .IP * (Seit Linux 2.4.36 / 2.6.23) Falls ein set\-user\-ID\- oder set\-group\-ID\-Programm ausgeführt wird, dann wird das durch den Schalter \fBprctl\fP(2) \fBPR_SET_PDEATHSIG\fP gesetzte Todessignal des Elternprozesses auf 0 gesetzt. .IP * Der Prozessname, wie er von \fBprctl\fP(2) \fBPR_SET_NAME\fP gesetzt (und durch \fIps\ \-o comm\fP angezeigt) wird, wird auf den Namen des ausführbaren Programms zurückgesetzt. .IP * Der \fBSECBIT_KEEP_CAPS\fP Schalter \fIsecurebits\fP wird auf 0 gesetzt. Siehe \fBcapabilities\fP(7). .IP * Das Terminierungssignal wird auf \fBSIGCHLD\fP zurückgesetzt (siehe \fBclone\fP(2)). .IP * Die Dateideskriptortabelle wird getrennt, der Effekt des Schalters \fBCLONE_FILES\fP von \fBclone\fP(2) wird rückgängig gemacht. .PP Beachten Sie die folgenden weiteren Punkte: .IP * 3 Alle Threads außer dem aufrufenden werden während eines \fBexecve\fP() zerstört. Mutexe, Bedingungsvariablen und andere Pthread\-Objekte werden nicht erhalten. .IP * Das Äquivalent von \fIsetlocale(LC_ALL, "C")\fP wird beim Programmstart ausgeführt. .IP * POSIX.1 legt fest, dass Zuordnungen aller ignorierten oder auf die Vorgabewerte gesetzten Signale unverändert bleiben. POSIX.1 legt eine Ausnahme fest: Falls \fBSIGCHLD\fP ignoriert wird, dann darf eine Implementierung die Zuordnung unverändert lassen oder sie auf die Vorgabe zurücksetzen; Linux macht Ersteres. .IP * Alle ausstehenden asynchronen E/A\-Operationen werden abgebrochen (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP * Für den Umgang mit Capabilities während \fBexecve\fP(), siehe \fBcapabilities\fP(7). .IP * .\" On Linux it appears that these file descriptors are .\" always open after an execve(), and it looks like .\" Solaris 8 and FreeBSD 6.1 are the same. -- mtk, 30 Apr 2007 Standardmäßig bleiben Dateideskriptoren über ein \fBexecve\fP() hinweg offen. Dateideskriptoren, die mit close\-on\-exec markiert sind, werden geschlossen; siehe die Beschreibung von \fBFD_CLOEXEC\fP in \fBfcntl\fP(2). (Falls ein Dateideskriptor geschlossen wird, führt dies zur Freigabe aller von der unterliegenden Datei durch den Prozess erhaltenen Datensatzsperren. Siehe \fBfcntl\fP(2) für Details.) Laut POSIX.1 darf das System eine nicht festgelegte Datei für jeden der Dateideskriptoren 0, 1 und 2 öffnen, falls diese andernfalls nach einem erfolgreichen \fBexecve\fP() geschlossen und der Prozess aufgrund der Modus\-Bits set\-user\-ID oder set\-group_ID Privilegien erhalten würde. Als allgemeines Prinzip darf kein portables Programm, egal ob privilegiert oder nicht, annehmen, dass diese drei Dateideskriptoren über ein \fBexecve\fP() geschlossen bleiben. .SS Interpreter\-Skripte Ein Interpreter\-Skript ist eine Textdatei, die über Ausführrechte verfügt und dessen erste Zeile die folgende Form annimmt: .PP .in +4n .EX \fB#!\fP\fIInterpreter \fP[Optionale\-Arg] .EE .in .PP Der \fIInterpreter\fP muss ein gültiger Pfadname zu einer ausführbaren Datei sein. .PP Falls das Argument \fIPfadname\fP von \fBexecve\fP() ein Interpreterskript festlegt, dann wird \fIinterpreter\fP mit den folgenden Argumenten aufgerufen. .PP .in +4n .EX \fIInterpreter\fP [Optionale\-Arg] \fIPfadname\fP Arg … .EE .in .PP .\" See the P - preserve-argv[0] option. .\" Documentation/admin-guide/binfmt-misc.rst .\" https://www.kernel.org/doc/html/latest/admin-guide/binfmt-misc.html Hierbei ist \fIPfadname\fP der absolute Pfadname der Datei, die als erstes Argument von \fBexecve\fP() festgelegt ist, und \fIarg…\fP die Serie von Wörtern, auf die vom Argument \fIargv\fP von \fBexecve\fP() gezeigt wird, beginnen mit \fIargv\fP[1]. Beachten Sie, dass es keine Möglichkeit gibt, \fIargv[0]\fP, der dem Aufruf \fBexecve\fP() übergeben wurde, zu erhalten. .PP Für den portablen Einsatz sollte \fIOptionale\-Arg\fP entweder abwesend oder als einzelnes Wort angegeben werden (d.h. es sollte keine Leerraumzeichen enthalten); siehe ANMERKUNGEN unten. .PP .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 Seit Linux 2.6.28 erlaubt es der Kernel, dass der Interpreter eines Skripts selbst wieder ein Skript ist. Diese Erlaubnis ist rekursiv bis zu einer Rekursionstiefe von 4, so dass der Interpreter ein Skript sein darf, das von einem Skript interpretiert wird und so weiter. .SS "Begrenzungen der Größe der Argumente und der Umgebung" Die meisten UNIX\-Implementierungen verhängen eine Begrenzung für die Gesamtgröße der Zeichenketten der Befehlszeilenargumente (\fIargv\fP) und der Umgebung (\fIenvp\fP), die an ein neues Programm übergeben werden darf. POSIX.1 erlaubt es einer Implementierung, diese Begrenzung mit der Konstante \fBARG_MAX\fP bekanntzugeben (entweder definiert in \fI\fP oder zur Laufzeit mit dem Aufruf \fIsysconf(_SC_ARG_MAX)\fP verfügbar). .PP Vor Kernel 2.6.23 unter Linux war der Speicher, der zum Ablegen der Umgebungs\- und Argumentzeichenketten verwandt wurde, auf 32 Seiten begrenzt (definiert durch die Kernelkonstante \fBMAX_ARG_PAGES\fP). Auf Architekturen mit einer 4\-kB\-Seitengröße führt dies zu einer Maximalgröße von 128\ kB. .PP .\" For some background on the changes to ARG_MAX in kernels 2.6.23 and .\" 2.6.25, see: .\" http://sourceware.org/bugzilla/show_bug.cgi?id=5786 .\" http://bugzilla.kernel.org/show_bug.cgi?id=10095 .\" http://thread.gmane.org/gmane.linux.kernel/646709/focus=648101, .\" checked into 2.6.25 as commit a64e715fc74b1a7dcc5944f848acc38b2c4d4ee2. .\" Ollie: That doesn't include the lists of pointers, though, .\" so the actual usage is a bit higher (1 pointer per argument). Auf den meisten Architekturen wird unter Kernel 2.6.23 und neuer eine Größenbegrenzung, die von der Ressourcenbegrenzung \fBRLIMIT_STACK\fP (siehe \fBgetrlimit\fP(2)) abgeleitet ist, die zum Zeitpunkt des Aufrufs \fBexecve\fP() in Kraft war, unterstützt. (Architekturen ohne Speicherverwaltungseinheit sind die Ausnahme: bei ihnen bleibt die Begrenzung, die vor dem Kernel 2.6.23 in Kraft war.) Diese Änderung erlaubt es Programmen, eine viel größere Argumenten\- und/oder Umgebungsliste zu haben. Für diese Architekturen ist die Gesamtgröße auf 1/4 der erlaubten Stack\-Größe begrenzt. (Die Erzwingung der 1/4\-Begrenzung stellt sicher, dass neue Programme immer über Stack\-Bereich verfügen.) Zusätzlich wird die Gesamtgröße auf 3/4 des Wertes der Kernelkonstanten \fB_STK_LIM\fP (8 Mibibytes) begrenzt. Seit Linux 2.6.25 stellt auch der Kernel eine Untergrenze von 32 Seiten dieser Begrenzung bereit, so dass selbst wenn \fBRLIMIT_STACK\fP sehr gering ist, Anwendungen garantiert über mindestens so viel Argument\- und Umgebungsbereich verfügen, wie dies unter Linux 2.6.23 und älter der Fall war. (Diese Garantie wurde nicht unter Linux 2.6.23 und 2.6.24 erfüllt.) Zusätzlich ist die Begrenzung pro Zeichenkette 32 Seiten (der Kernelkonstanten \fBMAX_ARG_STRLEN\fP) und die maximale Anzahl von Zeichenketten ist 0x7FFFFFFF. .SH RÜCKGABEWERT Im Erfolgsfall kehrt \fBexecve\fP() nicht zurück, im Fehlerfall wird \-1 zurückgeliefert und \fIerrno\fP entsprechend gesetzt. .SH FEHLER .TP \fBE2BIG\fP Die Gesamtanzahl von Bytes in der Umgebungs\- (\fIenvp\fP) und der Argumentenliste (\fIargv\fP) ist zu groß. .TP \fBEACCES\fP Für einen Teil des Pfadpräfixes von \fIPfadname\fP oder dem Namen des Skript\-Interpreters wird die Suchberechtigung verweigert. (Siehe auch \fBpath_resolution\fP(7).) .TP \fBEACCES\fP Die Datei oder der Skriptinterpreter ist keine reguläre Datei. .TP \fBEACCES\fP Für die Datei oder ein Skript oder ELF\-Interpreter wird die Ausführberechtigung verweigert. .TP \fBEACCES\fP Das Dateisystem ist nicht \fInoexec\fP eingehängt. .TP \fBEAGAIN\fP (seit Linux 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c Nach Änderung der realen UID mittels einer der Aufrufe \fBset*uid\fP() war – und ist immer noch – der Aufrufende über seine Ressourcenbegrenzung \fBRLIMIT_NPROC\fP (siehe \fBsetrlimit\fP(2)). Für eine detailliertere Erläuterung dieses Fehlers siehe ANMERKUNGEN. .TP \fBEFAULT\fP \fIPfadname\fP oder einer der Zeiger in den Vektoren \fIargv\fP oder \fIenvp\fP zeigt aus dem für Sie zugänglichen Adressraum heraus. .TP \fBEINVAL\fP Ein ELF\-Programm hat mehr als ein PT_INTERP\-Segment (d.h. versuchte mehr als einen Interpreter anzugeben). .TP \fBEIO\fP Es ist ein E/A\-Fehler (engl. I/O) aufgetreten. .TP \fBEISDIR\fP Ein ELF\-Interpreter war ein Verzeichnis. .TP \fBELIBBAD\fP Ein ELF\-Interpreter war in einem unbekannten Format. .TP \fBELOOP\fP Beim Auflösen von \fIPfadname\fP oder dem Namen eines Skripts oder ELF\-Interpreters wurden zu viele symbolische Links ermittelt. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 Während der rekursiven Skript\-Interpretation (siehe »Interpreter\-Skripte« oben) wurde die maximale Rekursionsbegrenzung erreicht. Vor Linux 3.8 wurde in diesem Fall der Fehler \fBENOEXEC\fP erstellt. .TP \fBEMFILE\fP Die Beschränkung pro Prozess der Anzahl offener Datei\-Deskriptoren wurde erreicht. .TP \fBENAMETOOLONG\fP \fIPfadname\fP ist zu lang. .TP \fBENFILE\fP Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht. .TP \fBENOENT\fP .\" FIXME but see http://sourceware.org/bugzilla/show_bug.cgi?id=12241 Die Datei \fIPfadname\fP oder ein Skript oder ein ELF\-Interpreter existiert nicht oder eine dynamische Bibliothek, die für die Datei oder den Interpreter benötigt wird, kann nicht gefunden werden. .TP \fBENOEXEC\fP Ein Programm ist nicht in einem erkennbaren Format, ist für die falsche Architektur oder hat einen anderen Formatfehler, wodurch es nicht ausgeführt werden kann. .TP \fBENOMEM\fP Es war nicht genügend Kernelspeicher verfügbar. .TP \fBENOTDIR\fP Ein Teil des Pfadpräfixes von \fIPfadname\fP oder ein Skript oder ELF\-Interpreter ist kein Verzeichnis. .TP \fBEPERM\fP Das Dateisystem ist \fInosuid\fP eingehängt, der Benutzer ist nicht der Superuser und die Datei hat das Bit set\-user\-ID oder set\-group\-ID gesetzt. .TP \fBEPERM\fP Der Prozess wird verfolgt, der Benutzer ist nicht der Superuser und die Datei hat das Bit set\-user\-ID oder set\-group\-ID gesetzt. .TP \fBEPERM\fP Eine »Capability\-unfähige« Anwendung würde nicht die ganze Menge der vom ausführbaren Programm gewährten erlaubten Capabilities erhalten. Siehe \fBcapabilities\fP(7). .TP \fBETXTBSY\fP Das angegebene Programm war für einen oder mehrere Prozesse zum Schreiben offen. .SH "KONFORM ZU" .\" SVr4 documents additional error .\" conditions EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX does not .\" document ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, .\" EISDIR or ELIBBAD error conditions. POSIX.1\-2001, POSIX.1\-2008, SVr4, 4.3BSD. POSIX dokumentiert das #!\-Verhalten nicht, es existiert aber (mit einigen Variationen) auf anderen UNIX\-Systemen. .SH ANMERKUNGEN Manchmal wird \fBexecve\fP() (und die in \fBexec\fP(3) beschriebenen dazugehörigen Funktionen) als »Ausführung eines \fIneuen\fP Prozesses« (oder ähnlich) beschrieben. Dies ist eine hochgradig irreführende Beschreibung: es gibt keinen neuen Prozess, viele Attribute des aufrufenden Prozesses bleiben unverändert (insbesondere seine PID). \fBexecve\fP() arrangiert lediglich, dass ein existierender Prozess (der aufrufende Prozess) ein neues Programm ausführt. .PP Set\-user\-ID\- und Set\-group\-ID\-Prozesse können nicht mit \fBptrace\fP(2) verfolgt werden. .PP Das Ergebnis des Einhängens eines Dateisystems mit \fInosuid\fP unterscheidet sich abhängig von der Linux\-Kernelversion. Unter einigen wird die Ausführung von Programmen mit set\-user\-ID und set\-group\-ID verweigert, wenn das dem Benutzer Rechte geben würde, die er nicht bereits hatte (und \fBEPERM\fP zurückliefern). Unter anderen werden die Bits set\-user\-ID und set\-group\-ID ignoriert und \fBexec\fP() erfolgreich ausgeführt. .PP .\" e.g., EFAULT on Solaris 8 and FreeBSD 6.1; but .\" HP-UX 11 is like Linux -- mtk, Apr 2007 .\" Bug filed 30 Apr 2007: http://bugzilla.kernel.org/show_bug.cgi?id=8408 .\" Bug rejected (because fix would constitute an ABI change). .\" Unter Linux können \fIargv\fP und \fIenvp\fP als NULL festgelegt werden. In beiden Fällen hat dies den gleichen Effekt wie die Festlegung des Arguments auf einen Zeiger auf eine Liste, die als einziges Element den NULL\-Zeiger enthält. \fBNutzen Sie diese nicht standardisierte und nicht portable Misfunktionalität nicht aus!\fP Unter vielen UNIX\-Systemen führt die Festlegung von \fIargv\fP als NULL zu einem Fehler (\fBEFAULT\fP). \fIEinige\fP andere UNIX\-Systeme behandeln den Fall \fIenvp==NULL\fP wie Linux. .PP POSIX.1 besagt, dass die von \fBsysconf\fP(3) zurückgelieferten Werte über die Lebensdauer eines Prozesses unveränderlich sein sollen. Seit 2.6.23 wird der von \fB_SC_ARG_MAX\fP berichtete Wert sich allerdings auch ändern, wenn die Ressourcenbegrenzung \fBRLIMIT_STACK\fP sich ändert, um die Tatsache zu berücksichtigen, dass die Begrenzung des Platzes zum Halten der Befehlszeilenargumente und der Umgebungsvariablen sich geändert hat. .PP .\" In den meisten Fällen, in denen \fBexecve\fP() fehlschlägt, kehrt die Steuerung zu dem ursprünglichen Abbild zurück und der Aufrufende von \fBexecve\fP() kann mit dem Fehler umgehen. In (seltenen) Fällen kann (typischerweise durch Ressourcenerschöpfung verursacht) der Fehlschlag den Punkt ohne Rückkehr passieren: das ursprüngliche Abbild wurde bereits entfernt aber das neue Abbild konnte nicht komplett gebaut werden. In diesen Fällen beendet der Kernel den Prozess mit einem Signal \fBSIGKILL\fP. .SS Interpreter\-Skripte .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 Der Kernel legt eine maximal Länge für Text, der den Zeichen »#!« am Anfang eines Skriptes folgt, auf. Zeichen hinter dieser Begrenzung werden ignoriert. Vor Linux 5.1 war die Begrenzung 127 Zeichen, seit Linux 5.1 ist die Begrenzung 255 Zeichen. .PP .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward Die Semantik des Arguments \fIOptionale\-Args\fP eines Interpreterskriptes unterscheidet sich zwischen Implementierungen. Unter Linux wird die gesamte Zeichenkette, die \fIInterpreter\fP folgt, als einziges Argument an den Interpreter übergeben und diese Zeichenkette kann Leerzeichen enthalten. Das Verhalten unterscheidet sich aber auf einigen anderen Systemen. Einige Systeme verwenden das erste Leerzeichen, um \fIOptionale\-Args\fP zu beenden. Auf einigen Systemen kann ein Interpreterskript mehrere Argumente haben und Leerzeichen in \fIOptionale\-Args\fP werden zum Begrenzen der Argumente verwandt. .PP .\" .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in .\" .BR execve () .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with 2.0.34 or 2.2.15. Linux (wie die meisten anderen modernen UNIX\-Systeme) ignoriert die Bits set\-user\-ID und set\-group\-ID bei Skripten. .SS "execve() und EAGAIN" Eine detailliertere Beschreibung des Fehlers \fBEAGAIN\fP, der (seit Linux 3.1) beim Aufruf von \fBexecve\fP() auftreten kann, ist wie folgt: .PP .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 Der Fehler \fBEAGAIN\fP kann auftreten, wenn ein \fIvorhergehender\fP Aufruf von \fBsetuid\fP(2), \fBsetreuid\fP(2) oder \fBsetresuid\fP(2) dazu führte, dass die reale Benutzerkennung des Prozesses geändert wurde und diese Änderung dazu führte, dass der Prozess seine Ressourcenbeschränkung \fBRLIMIT_NPROC\fP überschritt (d.h. die Anzahl der zu der neuen realen UID gehörenden Prozesse überschreitet die Ressourcenbeschränkung). Von Linux 2.6.0 bis 3.0 führte dies dazu, dass der Aufruf \fBset*uid\fP() fehlschlug. (Vor 2.6 wurde die Ressourcenbeschränkung bei Prozessen, die ihre Benutzerkennungen änderten, nicht durchgesetzt.) .PP Seit Linux 3.1 schlägt in dem gerade beschriebenen Szenario der Aufruf \fBset*uid\fP() nicht mehr fehl, da dies zu oft zu Sicherheitslöchern führte, bei denen fehlerhafte Anwendungen nicht den Rückgabewert prüften und annahmen, dass – falls der Aufrufende Root\-Rechte hatte – der Aufruf immer erfolgreich sein würde. Stattdessen ändert der Aufruf \fBset*uid\fP() jetzt erfolgreich die reale UID, aber der Kernel setzt einen internen Schalter namens \fBPF_NPROC_EXCEEDED\fP, um zu vermerken, dass die Ressourcenbeschränkung \fBRLIMIT_NPROC\fP überschritten wurde. Falls der Schalter \fBPF_NPROC_EXCEEDED\fP gesetzt ist und die Ressourcenbeschränkung zum Zeitpunkt eines folgenden \fBexecve\fP()\-Aufrufs immer noch überschritten ist, dann schlägt dieser Aufruf mit dem Fehler \fBEAGAIN\fP fehl. Diese Kernellogik stellt sicher, dass die Ressourcenbeschränkung \fBRLIMIT_NPROC\fP für den häufigen Ablauf bei privilegierten Daemons – also \fBfork\fP(2) + \fBset*uid\fP() + \fBexecve\fP() – weiterhin durchgesetzt wird. .PP Falls die Ressourcenbegrenzung zum Zeitpunkt des Aufrufs \fBexecve\fP() noch nicht überschritten wurde (da andere zu dieser realen UID gehörende Prozesse sich zwischen dem Aufruf von \fBset*uid\fP() und dem Aufruf von \fBexecve\fP() beendeten), dann gelingt der Aufruf und der Kernel bereinigt den Prozessschalter \fBPF_NPROC_EXCEEDED\fP. Der Schalter wird auch auf 0 gesetzt, falls ein folgender Aufruf von \fBfork\fP(2) durch diesen Prozess gelingt. .SS Geschichtliches .\" .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in .\" .BR execve () .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with 2.0.34 or 2.2.15. Unter UNIX\ V6 wurde die Argumentenliste von einem \fBexec\fP()\-Aufruf durch 0 beendet, während die Argumentenliste von \fImain\fP durch \-1 beendet wurde. Daher war diese Argumentenliste nicht für weitere \fBexec\fP()\-Aufrufe direkt verwendbar. Seit UNIX\ V7 sind beide NULL. .SH BEISPIEL Das folgende Programm ist dafür gedacht, vom zweiten folgenden Programm ausgeführt zu werden. Es gibt nur seine Befehlszeile (eine pro Zeile) wieder aus. .PP .in +4n .EX /* myecho.c */ #include #include int main(int argc, char *argv[]) { int j; for (j = 0; j < argc; j++) printf("argv[%d]: %s\en", j, argv[j]); exit(EXIT_SUCCESS); } .EE .in .PP Dieses Programm kann zur Ausführung des in seinem Befehlszeilenargument benannten Programms verwandt werden: .PP .in +4n .EX /* execve.c */ #include #include #include int main(int argc, char *argv[]) { char *newargv[] = { NULL, "Hallo", "Welt", NULL }; char *newenviron[] = { NULL }; if (argc != 2) { printf(stderr, "Aufruf: %s \en", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() kehrt nur im Fehlerfall zurück */ exit(EXIT_FAILURE); } .EE .in .PP Wir können das zweite Programm verwenden, um das erste wie folgt aufzurufen: .PP .in +4n .EX $\fB cc myecho.c \-o myecho\fP $\fB cc execve.c \-o execve\fP $\fB ./execve ./myecho\fP argv[0]: ./myecho argv[1]: Hallo argv[2]: Welt .EE .in .PP Wir können diese Programme auch zur Demonstration der Verwendung eines Skript\-Interpreters verwenden. Dafür erstellen wir ein Skript, dessen »Interpreter« unser \fImyecho\fP\-Programm ist. .PP .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB^D\fP $\fB chmod +x script\fP .EE .in .PP Wir können dann unser Programm verwenden, um das Skript auszuführen: .PP .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: Hallo argv[4]: Welt .EE .in .SH "SIEHE AUCH" \fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2), \fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetopt\fP(3), \fBsystem\fP(3), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7), \fBld.so\fP(8) .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 5.04 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@\:lists.\:debian.\:org Mailingliste der Übersetzer .ME .