.\" -*- 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 "13 août 2020" Linux "Manuel du programmeur Linux" .SH NOM execve \- Exécuter un programme .SH SYNOPSIS \fB#include \fP .PP \fBint execve(const char *\fP\fIchemin\fP\fB, char *const \fP\fIargv\fP\fB[],\fP .br \fB char *const \fP\fIenvp\fP\fB[]);\fP .SH DESCRIPTION \fBexecve\fP() exécute le programme auquel renvoie \fIpathname\fP. Il s'ensuit que le programme en cours d'exécution par le processus appelant sera remplacé par un nouveau programme, avec une pile, un tas et des segments de données (initialisés ou non) nouvellement initialisés. .PP \fIpathname\fP doit être soit un exécutable binaire, soit un script qui commence par une ligne sous la forme\ : .PP .in +4n .EX \fB#!\fP\fIinterpréteur \fP[argument\-optionnel] .EE .in .PP Pour des détails sur ce dernier cas, consultez «\ Scripts\ » ci\(hydessous. .PP \fIargv\fP est un tableau de pointeurs vers des chaînes passées au nouveau programme en tant qu'arguments de la ligne de commande. Par convention, la première de ces chaînes (à savoir \fIargv[0]\fP) devrait contenir le nom de fichier associé au fichier étant exécuté. Le tableau \fIargv\fP doit se terminer par un pointeur NULL (ainsi, dans le nouveau programme, \fIargv[argc]\fP vaudra NULL). .PP \fIenvp\fP est un tableau de pointeurs vers des chaînes, ayant par convention la forme \fBclé=valeur\fP, qui sont passés au nouveau programme en tant qu'environnement. Le tableau \fIenvp\fP dois se terminer par un pointeur NULL. .PP Le vecteur d'argument et l'environnement sont accessibles à la fonction principale du nouveau programme quand elle est définie ainsi\ : .PP .in +4n .EX int main(int argc, char *argv[], char *envp[]) .EE .in .PP Notez, cependant, que l'utilisation d'un troisième argument dans la fonction principale n'est pas spécifiée dans POSIX.1, selon laquelle l'environnement doit être accessible par la variable externe \fBenviron\fP(7). .PP En cas de réussite, \fBexecve\fP() ne renvoie rien et les segments de texte, les données initialisées et non initialisées «\ bss\ »), ainsi que la pile du processus appelant sont remplacés par ceux du programme chargé. .PP Si l'on effectuait un \fBptrace\fP(2) sur le programme actuel, un signal \fBSIGTRAP\fP lui est envoyé après la réussite de \fBexecve\fP(). .PP Si le bit set\-user\-ID est positionné sur le fichier du programme auquel renvoie \fIpathname\fP, l'ID de l'utilisateur effectif du processus appelant passe à celui du propriétaire du programme. De même, lorsque le bit set\-group\-ID est positionné sur le fichier du programme, l'ID du groupe effectif du processus appelant est modifié pour correspondre à celui du groupe du fichier. .PP Les transformations précitées des ID effectifs \fIne sont pas\fP effectuées (c'est\-à\-dire que les bits set\-user\-ID et set\-group\-ID sont ignorés) si un des éléments suivants est vrai\ : .IP * 3 l'attribut \fIno_new_privs\fP est défini pour le thread appelant (voir \fBprctl\fP(2))\ ; .IP * le système de fichiers sous\-jacent est monté en \fInosuid\fP (le drapeau \fBMS_NOSUID\fP de \fBmount\fP(2))\ ; .IP * ou un ptrace va être appliqué au processus appelant. .PP Les capacités du fichier du programme (voir \fBcapabilities\fP(7)) sont également ignorées si un des éléments ci\-dessus est vrai. .PP L'UID effectif du processus est copié dans le Set\-UID sauvegardé\ ; de la même manière, le GID effectif est copié dans le Set\-GID sauvegardé. Ces copies ont lieu après toute modification d'ID effectif à cause des bits de permission Set\-UID et Set\-GID. .PP L'UID et le GID réel du processus ainsi que ses ID de groupe complémentaires ne sont pas modifiés par un appel à \fBexecve\fP(). .PP Si l'exécutable est un fichier binaire a.out lié dynamiquement, et contenant des appels aux bibliothèques partagées, l'éditeur de liens dynamiques de Linux \fBld.so\fP(8) est appelé au début de l'exécution, afin de charger les bibliothèques partagées nécessaires en mémoire et d'effectuer l'édition des liens de l'exécutable avec eux. .PP .\" Si l'exécutable est au format ELF lié dynamiquement, l'interpréteur indiqué dans le segment PT_INTERP sera invoqué pour charger les bibliothèques partagées. Cet interpréteur est généralement \fI/lib/ld\-linux.so.2\fP pour les fichiers binaires liés avec la glibc (voir \fBld\-linux.so\fP(8)). .SS "Effets sur les attributs de processus" Tous les attributs de processus sont préservés lors d'un \fBexecve\fP(), à l'exception des suivants\ : .IP * 3 Les signaux pour lesquels le processus avait placé un gestionnaire sont réinitialisés à leur valeur par défaut (consultez \fBsignal\fP(7)). .IP * L'éventuelle pile spécifique pour les gestionnaires de signal n'est pas conservée (\fBsigaltstack\fP(2)). .IP * Les projections en mémoire ne sont pas conservées (\fBmmap\fP(2)). .IP * Les segments de mémoire partagée System\ V sont détachés (\fBshmat\fP(2)). .IP * Les objets de mémoire partagée POSIX sont supprimés (\fBshm_open\fP(3)). .IP * Les descripteurs de files de messages POSIX ouverts sont fermés (\fBmq_overview\fP(7)). .IP * Les sémaphores nommés POSIX ouverts sont fermés (\fBsem_overview\fP(7)). .IP * Les temporisations POSIX ne sont pas conservées (\fBtimer_create\fP(2)). .IP * Les flux de répertoires ouverts sont fermés (\fBopendir\fP(3)). .IP * Les verrouillages de mémoire ne sont pas préservés (\fBmlock\fP(2), \fBmlockall\fP(2)). .IP * Les gestionnaires de terminaison ne sont pas préservés (\fBatexit\fP(3), \fBon_exit\fP(3)). .IP * L'environnement de travail en virgule flottante est réinitialisé à celui par défaut (consultez \fBfenv\fP(3)). .PP Les attributs de processus listés ci\-dessus sont spécifiés dans POSIX.1. Les attributs de processus spécifiques à Linux suivants sont également réinitialisés lors d'un \fBexecve\fP()\ : .IP * 3 L'attribut «\ dumpable\ » du processus est positionné sur la valeur \fB1\fP, sauf si un programme set\-user\-ID, set\-group\-ID ou en ayant les capacités est exécuté, auquel cas l'attribut dumpable peut, au contraire, être réinitialisé à la valeur dans \fI/proc/sys/fs/suid_dumpable\fP, dans les circonstances décrites sous \fBPR_SET_DUMPABLE\fP dans \fBprctl\fP(2). Remarquez que les modifications d'un attribut «\ dumpable\ » peut entraîner le passage du propriétaire des fichiers du répertoire \fI/proc/[pid]\fP de processus à \fIroot:root\fP, comme décrit dans \fBproc\fP(5). .IP * L'attribut \fBPR_SET_KEEPCAPS\fP de \fBprctl\fP(2) est effacé. .IP * (Depuis Linux 2.4.36\ ou 2.6.23) Si un programme setuid ou setgid est exécuté, alors le signal de mort de son parent défini par l'attribut \fBPR_SET_PDEATHSIG\fP de \fBprctl\fP(2) est effacé. .IP * Le nom du processus, positionné par \fBprctl\fP(2) \fBPR_SET_NAME\fP (et affiché avec \fIps\ \-o comm\fP), est réinitialisé avec le nom du nouvel exécutable. .IP * L'attribut \fIsecurebits\fP \fBSECBIT_KEEP_CAPS\fP de \fBprctl\fP() est effacé. Consultez \fBcapabilities\fP(7). .IP * Le signal de terminaison est réinitialisé à \fBSIGCHLD\fP (consultez \fBclone\fP(2)). .IP * La table des descripteurs de fichier n'est pas partagée, ce qui annule les effets de l'attribut \fBCLONE_FILES\fP de \fBclone\fP(2). .PP Notez également les points suivants\ : .IP * 3 Tous les threads autres que l'appelant sont détruits lors d'un \fBexecve\fP(). Les mutex, les variables de condition, et les autres objets de pthreads sont détruits. .IP * L'équivalent de \fIsetlocale(LC_ALL, "C")\fP est exécuté au démarrage du programme. .IP * POSIX.1 indique que les actions pour les signaux ignorés ou placés à la valeur par défaut ne sont pas modifiées. Une exception est néanmoins spécifiée dans POSIX.1 : si \fBSIGCHLD\fP est ignoré, l'implémentation peut laisser l'action inchangée ou la replacer à la valeur par défaut\ ; Linux ne modifie pas l'action. .IP * Toutes les opérations d'E/S asynchrones en cours sont annulées (\fBaio_read\fP(3), \fBaio_write\fP(3)). .IP * Pour le traitement des capacités lors d'un \fBexecve\fP(), consultez \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 Par défaut, les descripteurs de fichier restent ouverts au travers d'un \fBexecve\fP(). Les descripteurs marqués close\-on\-exec sont fermés\ ; consultez la description de \fBFD_CLOEXEC\fP dans \fBfcntl\fP(2). (Si un descripteur de fichier est fermé, cela cause la libération de tous les verrous d'enregistrement obtenus sur le fichier correspondant par ce processus. Consultez \fBfcntl\fP(2) pour les détails.) POSIX.1 indique que si les descripteurs de fichiers \fB0\fP, \fB1\fP et \fB2\fP devaient être fermés après un \fBexecve\fP() réussi, et que le processus devient privilégié en raison d'un bit set\-user\-ID ou set\-group\-ID sur le fichier exécuté, le système peut ouvrir un fichier non indiqué pour chacun de ces descripteurs. En général, aucun programme portable, privilégié ou pas, ne peut considérer que ces trois descripteurs resteront fermés après un \fBexecve\fP(). .SS Scripts Un script d’interpréteur est un fichier textuel dont le bit d'exécution est activé et dont la première ligne est de la forme\ : .PP .in +4n .EX \fB#!\fP\fIinterpréteur \fP[argument\-optionnel] .EE .in .PP L’\fIinterpréteur\fP doit être le chemin valable d'un fichier exécutable. .PP Si l'argument \fIpathname\fP de \fBexecve\fP() indique un script interprété, l'\fIinterpréteur\fP sera appelé avec les arguments suivants\ : .PP .in +4n .EX \fIinterpréteur\fP [argument\-optionnel] \fIpathname\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 où \fIpathname\fP est le chemin absolu du fichier indiqué en premier argument de \fBexecve\fP(), et \fIarg...\fP est la série de mots vers lesquels pointe l'argument \fIargv\fP de \fBexecve\fP(), à partir de \fIargv\fP[1]. Remarquez qu'il n'y a aucune manière d'obtenir \fIargv[0]\fP passé à l'appel \fBexecve\fP(). .PP Pour être portable, \fIargument\-optionnel\fP doit soit être absent, soit être un seul mot (c'est\(hyà\(hydire ne pas contenir d'espace)\ ; consultez les NOTES ci\(hydessous. .PP .\" commit bf2a9a39639b8b51377905397a5005f444e9a892 Depuis Linux 2.6.28, le noyau autorise l'interpréteur de script à être lui\-même un script. Cette autorisation est récursive jusqu'à quatre niveaux, pour qu'un interpréteur puisse être interprété par un script qui est interprété par un script, et ainsi de suite. .SS "Limites sur la taille des paramètres et d'environnement" La plupart des implémentations UNIX imposent des limites sur la taille totale des chaînes des paramètres des lignes de commande (\fIargv\fP) et de l'environnement (\fIenvp\fP) qui peuvent être passées à un nouveau programme. POSIX.1 permet à une implémentation d'annoncer cette limite en utilisant la constante \fBARG_MAX\fP (soit définie dans \fI\fP, soit disponible à l'exécution en utilisant l'appel \fIsysconf(_SC_ARG_MAX)\fP). .PP Sur les noyaux Linux antérieurs à 2.6.23, la mémoire utilisée pour stocker les chaînes d'environnements et d'arguments était limitée à 32 pages (définie par la constante noyau \fBMAX_ARG_PAGES\fP). Sur les architectures dont la taille de page est 4\ Ko, cela donne un maximum de 128\ Ko. .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). Sur les noyaux 2.6.23 et ultérieurs, la plupart des architectures ont une limite de taille dérivée de la limite de ressources souple \fBRLIMIT_STACK\fP (consultez \fBgetrlimit\fP(2)) qui est en vigueur au moment de l'appel à \fBexecve\fP() (ce n'est pas le cas pour les architectures sans unité de gestion mémoire\ : elles conservent la limite des noyaux antérieurs à 2.6.23). Ce changement permet aux programmes d'avoir une liste de paramètres ou un environnement beaucoup plus grand. Pour ces architectures, la taille totale est limitée à 1/4 de la taille de pile permise (imposer une limite de 1/4 permet d'assurer que le nouveau programme garde de l'espace pour la pile). De plus, la taille totale est limitée à 3/4 de la valeur de la constante \fB_STK_LIM\fP du noyau (8 Mio). Depuis Linux 2.6.25, le noyau place une limite inférieure de 32 pages à cette limite de taille, de telle sorte que même si \fBRLIMIT_STACK\fP est très faible, il est garanti aux applications qu'elles auront au moins autant de place pour les paramètres et leur environnement que ce qui était fourni par Linux 2.6.23 et les précédents (cette garantie n'était pas présente dans les noyaux 2.6.23 et 2.6.24). De plus, la limite par chaîne est de 32 pages (la constante noyau \fBMAX_ARG_STRLEN\fP), et le nombre maximal de chaînes est de 0x7FFFFFFF. .SH "VALEUR RENVOYÉE" En cas de réussite, \fBexecve\fP() ne renvoie rien, en cas d'échec il renvoie \fB\-1\fP et \fIerrno\fP contient le code d'erreur. .SH ERREURS .TP \fBE2BIG\fP Le nombre total d'octets dans l'environnement (\fIenvp\fP) et la liste d'arguments (\fIargv\fP) est trop grande. .TP \fBEACCES\fP Le droit de parcours est refusé pour un des composants du préfixe du chemin \fIpathname\fP ou du nom d'un interpréteur de script (consultez aussi \fBpath_resolution\fP(7)). .TP \fBEACCES\fP Le fichier ou l'interpréteur de script n'est pas un fichier régulier. .TP \fBEACCES\fP L'autorisation d'exécution est refusée pour le fichier, ou un interpréteur de script, ou un interpréteur ELF. .TP \fBEACCES\fP Le système de fichiers est monté avec l'option \fInoexec\fP. .TP \fBEAGAIN\fP (depuis Linux\ 3.1) .\" commit 72fa59970f8698023045ab0713d66f3f4f96945c Ayant modifié son UID réel avec un des appels \fBset\fP\fI*\fP\fBuid\fP(), l’appelant était –\ et est toujours\ — au\-delà de sa limite de ressources \fBRLIMIT_NPROC\fP (consultez \fBsetrlimit\fP(2)). Pour une explication plus précise de cette erreur, consultez \fBNOTES\fP. .TP \fBEFAULT\fP \fIpathname\fP ou l'un des pointeurs du vecteur \fIargv\fP ou \fIenvp\fP pointe en dehors de l'espace d'adressage accessible. .TP \fBEINVAL\fP Un exécutable ELF a plusieurs segments PT_INTERP (indique plusieurs interpréteurs). .TP \fBEIO\fP Une erreur d'entrée\-sortie s'est produite. .TP \fBEISDIR\fP L'interpréteur ELF cité est un répertoire. .TP \fBELIBBAD\fP L'interpréteur ELF mentionné n'est pas dans un format connu. .TP \fBELOOP\fP Trop de liens symboliques rencontrés dans la résolution de \fIpathname\fP ou du nom de l'interpréteur de script ou ELF. .TP \fBELOOP\fP .\" commit d740269867021faf4ce38a449353d2b986c34a67 La limite maximale de niveaux a été atteinte pendant l'interprétation récursive du script (voir «\ scripts interpréteurs\ » ci\-dessus). Avant Linux 3.8, l'erreur générée dans ce cas était \fBENOEXEC\fP. .TP \fBEMFILE\fP La limite du nombre de descripteurs de fichiers par processus a été atteinte. .TP \fBENAMETOOLONG\fP \fInom_chemin\fP est trop long. .TP \fBENFILE\fP La limite du nombre total de fichiers ouverts pour le système entier a été atteinte. .TP \fBENOENT\fP Aucun fichier \fIpathname\fP ou interpréteur de script ou ELF n'existe. .TP \fBENOEXEC\fP Le fichier exécutable n'est pas dans le bon format, ou est destiné à une autre architecture. .TP \fBENOMEM\fP La mémoire disponible du noyau n'était pas suffisante. .TP \fBENOTDIR\fP Un composant du préfixe du chemin de \fIpathname\fP ou de l'interpréteur de script ou ELF n'est pas un répertoire. .TP \fBEPERM\fP Le système de fichiers est monté avec l'attribut \fInosuid\fP, l’utilisateur n’est pas le superutilisateur et le fichier a un bit Set\-UID ou Set\-GID positionné. .TP \fBEPERM\fP Le processus est suivi avec \fBptrace\fP(2), l'utilisateur n'est pas le superutilisateur, et le fichier a un bit Set\-UID ou Set\-GID positionné. .TP \fBEPERM\fP Une application «\ capability\-dumb\ » n'obtiendrait pas toutes les capacités rendues possibles par le fichier exécutable. Voir \fBcapabilities\fP(7). .TP \fBETXTBSY\fP L'exécutable spécifié était ouvert en écriture par un ou plusieurs processus. .SH CONFORMITÉ .\" 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 ne documente pas le comportement de «\ #!\ » mais celui\-ci existe (avec quelques variations) sur d'autres systèmes UNIX. .SH NOTES On pourrait parfois voir \fBexecve\fP() (et les fonctions associées décrites dans \fBexec\fP(3)) décrit comme un «\ exécuteur de \fInouveau\fP processus\ » (ou équivalent). C'est une description très trompeuse\ : il n'y a pas de nouveau processus\ ; beaucoup d'attributs du processus appelant demeurent inchangés (en particulier son PID). Tout ce que fait \fBexecve\fP() est de s'organiser pour qu'un processus existant (le processus appelant) exécute un nouveau programme. .PP Les processus Set\-UID et Set\-GID ne peuvent pas être suivis par \fBptrace\fP(2). .PP Le résultat d'un montage de système de fichiers avec l'attribut \fInosuid\fP peut varier suivant les versions du noyau Linux\ : certaines refuseront l'exécution des fichiers Set\-UID et Set\-GID lorsque cela donnerait à l'appelant des privilèges qu'il n'a pas (et renverront l'erreur \fBEPERM\fP), d'autres ignoreront simplement les bits Set\-UID et Set\-GID mais accepteront d'effectuer l'appel \fBexec\fP(). .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). .\" Sur Linux, \fIargv\fP et \fIenvp\fP peuvent être indiqués comme NULL. Dans les deux cas, cela a le même effet que de spécifier un argument comme un pointeur sur une liste contenant un seul pointeur NULL. \fBN'en profitez pas pour faire des choses non standard et non portables\ !\fP. Sur de nombreux autres systèmes UNIX, spécifier \fIargv\fP comme NULL donnera une erreur (\fBEFAULT\fP). \fID'autres\fP systèmes UNIX traitent le cas \fIenvp==NULL\fP comme Linux. .PP POSIX.1 indique que les valeurs renvoyées par \fBsysconf\fP(3) ne doivent pas changer pendant la vie d'un processus. Cependant, depuis Linux 2.6.23, si la limite de ressources \fBRLIMIT_STACK\fP change, alors la valeur renvoyée par \fB_SC_ARG_MAX\fP changera également, pour refléter le fait que la limite de l'espace qui reçoit les paramètres de la ligne de commande et les variables d'environnement a changé. .PP .\" commit 19d860a140beac48a1377f179e693abe86a9dac9 .\" Dans la plupart des cas où \fBexecve\fP() échoue, le contrôle renvoie vers l’image exécutable d’origine et l’appelant de \fBexecve\fP() peut alors traiter l’erreur. Cependant, dans de (rares) cas (typiquement provoqués par un épuisement de ressources), l’échec pourrait se produire après le point de non\-retour\ : l’image exécutable d’origine a été supprimée, mais la nouvelle image n’a pas pu être construite complètement. Dans ces cas\-là, le noyau tue le processus avec un signal \fBSIGSEGV\fP (\fBSIGKILL\fP jusqu'à Linux 3.17). .SS Scripts .\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02 Le noyau impose une longueur maximale de texte après les caractères «\ #!\ » au début du script\ ; les caractères au\-delà de cette limite sont ignorés. Avant Linux 5.1, la limite était de 127 caractères. Depuis Linux 5.1, elle est de 255 caractères. .PP .\" e.g., Solaris 8 .\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward La sémantique de l'\fIargument\-optionnel\fP d'un script diffère selon les implémentations. Sous Linux, la chaîne qui suit le nom de l'\fIinterpréteur\fP est passée à l'interpréteur comme un seul mot, et cette chaîne peut contenir des espaces. Cependant, le comportement est différent sur d'autres systèmes. Certains utilisent la première espace comme fin de l'\fIargument\-optionnel\fP. Sur certains systèmes, un script peut avoir plusieurs arguments, délimités par des espaces dans \fIargument\-optionnel\fP. .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 (comme la plupart des autres systèmes UNIX modernes) ignore les bits Set\-UID et Set\-GID sur les scripts. .SS "execve() et EAGAIN" Une explication plus détaillée de l’erreur \fBEAGAIN\fP qui peut se produire (depuis Linux\ 3.1) en appelant \fBexecve\fP() est comme suit. .PP .\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4 L’erreur \fBEAGAIN\fP peut se produire quand un appel \fIprécédent\fP de \fBsetuid\fP(2), \fBsetreuid\fP(2) ou \fBsetresuid\fP(2) a causé la modification de l’identifiant d’utilisateur réel du processus et que cette modification a forcé le processus à dépasser sa limite de ressources \fBRLIMIT_NPROC\fP (c’est\-à\-dire que le nombre de processus appartenant au nouvel UID réel dépasse la limite de ressources). De Linux\ 2.6.0 à 3.0, cela provoquait un échec de l’appel \fBset\fP\fI*\fP\fBuid\fP() (avant 2.6, la limite de ressources n’était pas imposée sur les processus qui modifiaient leurs identifiants d’utilisateur). .PP Depuis Linux\ 3.1, le scénario précédemment décrit ne provoque plus un échec de l’appel \fBset\fP\fI*\fP\fBuid\fP(), parce que cela avait trop souvent pour conséquence des trous de sécurité quand les applications boguées ne vérifiaient pas l’état de retour et assumait que —\ si l’appelant avait les droits du superutilisateur\ — l’appel réussirait toujours. À la place, les appels \fBset\fP\fI*\fP\fBuid\fP() modifient vraiment l’UID réel, mais le noyau définit un attribut interne, appelé \fBPF_NPROC_EXCEEDED\fP, pour noter que la limite de ressources \fBRLIMIT_NPROC\fP a été dépassée. Si l’attribut \fBPF_NPROC_EXCEEDED\fP est défini et que la limite de ressources est toujours dépassée au moment d’un appel \fBexecve\fP() ultérieur, cet appel échoue avec l’erreur \fBEAGAIN\fP. Cette logique du noyau assure que la limite de ressources \fBRLIMIT_NPROC\fP est toujours respectée pour le mode de fonctionnement habituel du démon avec droits —\ c’est\-à\-dire \fBfork\fP(2) + \fBset\fP\fI*\fP\fBuid\fP() + \fBexecve\fP(). .PP Si la limite de ressources n’était pas encore dépassée au moment de l’appel \fBexecve\fP() (parce que d’autres processus appartenant à cet UID réel se sont terminés entre l’appel \fBset*uid\fP() et l’appel \fBexecve\fP()), alors l’appel \fBexecve\fP() réussit et le noyau efface l’attribut de processus \fBPF_NPROC_EXCEEDED\fP. L’attribut est aussi effacé si un appel ultérieur de \fBfork\fP(2) par ce processus réussit. .SS Historique .\" .\" .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. Avec UNIX\ V6, la liste des arguments d'un appel \fBexec\fP() se terminait par \fB0\fP, alors que la liste des arguments de \fImain\fP se terminait par \fB\-1\fP. Aussi, cette liste d'arguments n'était pas utilisable directement dans un appel \fBexec\fP() supplémentaire. Depuis UNIX\ V7, les deux terminateurs sont NULL. .SH EXEMPLES Le programme suivant est conçu pour être exécuté par le second programme ci\(hydessous. Il se contente d'afficher les paramètres de sa ligne de commande, un par ligne. .PP .in +4n .EX /* myecho.c */ #include #include int main(int argc, char *argv[]) { for (int j = 0; j < argc; j++) printf("argv[%d]: %s\en", j, argv[j]); exit(EXIT_SUCCESS); } .EE .in .PP Ce programme peut être utilisé pour exécuter le programme donné comme argument de ligne de commande\ : .PP .in +4n .EX /* execve.c */ #include #include #include int main(int argc, char *argv[]) { char *newargv[] = { NULL, "hello", "world", NULL }; char *newenviron[] = { NULL }; if (argc != 2) { fprintf(stderr, "Utilisation : %s \en", argv[0]); exit(EXIT_FAILURE); } newargv[0] = argv[1]; execve(argv[1], newargv, newenviron); perror("execve"); /* execve() ne renvoie qu'en cas d'erreur */ exit(EXIT_FAILURE); } .EE .in .PP On peut utiliser le second programme pour exécuter le premier de la façon suivante\ : .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]: hello argv[2]: world .EE .in .PP On peut aussi utiliser ces programmes pour montrer l'utilisation d'un interpréteur de scripts. Pour ce faire, on crée un script dont l'«\ interpréteur\ » est notre programme \fImyecho\fP\ : .PP .in +4n .EX $\fB cat > script\fP \fB#!./myecho script\-arg\fP \fB\(haD\fP $\fB chmod +x script\fP .EE .in .PP On peut alors utiliser notre programme pour exécuter le script\ : .PP .in +4n .EX $\fB ./execve ./script\fP argv[0]: ./myecho argv[1]: script\-arg argv[2]: ./script argv[3]: hello argv[4]: world .EE .in .SH "VOIR AUSSI" \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), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBenviron\fP(7), \fBpath_resolution\fP(7), \fBld.so\fP(8) .SH COLOPHON Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à l'adresse \%https://www.kernel.org/doc/man\-pages/. .SH TRADUCTION La traduction française de cette page de manuel a été créée par Christophe Blaess , Stéphan Rafin , Thierry Vignaud , François Micaux, Alain Portal , Jean-Philippe Guérard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas François , Florentin Duneau , Simon Paillard , Denis Barbier , David Prévot et Jean-Philippe MENGUAL . Cette traduction est une documentation libre ; veuillez vous reporter à la .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License version 3 .UE concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE. Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à .MT debian-l10n-french@lists.debian.org .ME .