.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992
.\" and Copyright (c) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified by Michael Haardt <michael@moria.de>
.\" Modified 1993-07-21 by Rik Faith <faith@cs.unc.edu>
.\" Modified 1994-08-21 by Michael Chastain <mec@shell.portal.com>:
.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified 1999-11-12 by Urs Thuermann <urs@isnogud.escape.de>
.\" Modified 2004-06-23 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" 2006-09-04 Michael Kerrisk <mtk.manpages@gmail.com>
.\"     Added list of process attributes that are not preserved on exec().
.\" 2007-09-14 Ollie Wild <aaw@google.com>, mtk
.\"     Add text describing limits on command-line arguments + environment
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH execve 2 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
execve \- wykonuje program
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <unistd.h>\fP
.P
\fBint execve(const char *\fP\fIpathname\fP\fB, char *const _Nullable \fP\fIargv\fP\fB[],\fP
\fB           char *const _Nullable \fP\fIenvp\fP\fB[]);\fP
.fi
.SH OPIS
\fBexecve\fP() wykonuje program wskazywany przez \fIpathname\fP. Program, który
jest aktualnie wykonywany przez proces wywołujący jest zastępowany nowym
programem, z nowo zainicjowanym stosem, kopcem i (zainicjowanymi i
niezainicjowanymi) segmentami danych.
.P
\fIpathname\fP musi być albo wykonywalnym plikiem binarnym, albo skryptem
zaczynającym się od wiersza w postaci:
.P
.in +4n
.EX
\fB#!\fP\fIinterpreter \fP[opcjonalny\-parametr]
.EE
.in
.P
Szczegóły tego ostatniego przypadku można znaleźć poniżej w rozdziale
\[Bq]Skrypty interpretowane\[rq].
.P
\fIargv\fP jest tablicą wskaźników do łańcuchów przekazywanych jako argumenty
wiersza poleceń nowego programu. Zgodnie z konwencją, pierwszy z nich
(tj. \fIargv[0]\fP) powinien zawierać nazwę pliku skojarzonego z wykonywanym
programem. Tablica \fIargv\fP musi być zakończona wskaźnikiem null (dlatego w
nowym programie, \fIargv[argc]\fP będzie wskaźnikiem null).
.P
\fIenvp\fP jest tablicą wskaźników do łańcuchów, zgodnie z konwencją, postaci
\fBklucz=wartość\fP, która jest przekazywana jako środowisko do nowego
programu. Tablica \fIenvp\fP musi być zakończona wskaźnikiem pustym (NULL).
.P
Niniejszy podręcznik opisuje detale linuksowego wywołania systemowego; aby
zapoznać się z przeglądem nomenklatury oraz wieloma, często preferowanymi,
standardowymi wariantami niniejszej funkcji udostępnianymi przez libc, w tym
przeszukującymi zmienną środowiskową \fBPATH\fP, zob. \fBexec\fP(3).
.P
Argument wektora i środowiska może być dostępny z głównej funkcji nowego
programu, gdy zostanie zdefiniowany jako:
.P
.in +4n
.EX
int main(int argc, char *argv[], char *envp[])
.EE
.in
.P
Proszę jednak zauważyć, że użycie trzeciego argumentu głównej funkcji nie
jest określone normą POSIX.1; zgodnie z POSIX.1, dostęp do środowiska
powinien następować za pomocą zewnętrznej zmiennej \fBenviron\fP(7).
.P
W razie powodzenia \fBexecve\fP() nie powraca, a sekcje tekstu, zainicjowanych
danych, niezainicjowanych danych (bss) i stos wywołującego procesu są
nadpisywane zgodnie z zawartością nowo ładowanego programu.
.P
Jeśli obecny program jest śledzony za pomocą ptrace, wysyła się mu
\fBSIGTRAP\fP po pomyślnym \fBexecve\fP().
.P
Jeżeli plik programu, do którego odnosi się \fIfilename\fP, ma ustawiony bit
set\-user\-ID, to efektywny identyfikator użytkownika procesu wywołującego
jest ustawiany na właściciela pliku programu. Podobnie, jeżeli dla pliku
programu ustawiony jest bit set\-group\-ID, to efektywnemu identyfikatorowi
grupy procesu wywołującego jest przypisywana grupa pliku programu.
.P
Wyżej wymienione przekształcenia efektywnego identyfikatora \fInie\fP są
przeprowadzane (tzn. bity set\-user\-ID i set\-group\-ID są ignorowane) jeśli
dowolny z poniższych warunków jest prawdziwy:
.IP \[bu] 3
dla wywołującego wątku ustawiony jest atrybut \fIno_new_privs\fP
(zob. \fBprctl\fP(2));
.IP \[bu]
przedmiotowy system plików jest zamontowany z \fInosuid\fP (znacznik
\fBMS_NOSUID\fP dla \fBmount\fP(2)) lub
.IP \[bu]
wywołujący proces jest śledzony za pomocą ptrace.
.P
Przywileje pliku programu (zob. \fBcapabilities\fP(7)) są również ignorowane,
jeśli dowolny z powyższych warunków jest prawdziwy.
.P
Efektywny identyfikator użytkownika jest kopiowany do zapisanego
set\-user\-ID; podobnie efektywny identyfikator grupy jest kopiowany do
zapisanego set\-group\-ID. Kopiowanie odbywa się po zmianie któregokolwiek z
efektywnych identyfikatorów związanej z bitami trybu set\-user\-ID i
set\-group\-ID.
.P
Rzeczywisty identyfikator procesu i rzeczywisty identyfikator grupy,
podobnie jak uzupełniające identyfikatory grupy, pozostają bez zmian przy
wywołaniu do \fBexecve\fP().
.P
Jeśli program wykonywalny jest skonsolidowany dynamicznie w formacie a.out z
bibliotekami dzielonymi, to na początku uruchamiania wywoływany jest
konsolidator dynamiczny \fBld.so\fP(8), który ładuje wszystkie obiekty do
pamięci i konsoliduje z nimi program wykonywalny.
.P
.\"
Jeżeli program jest skonsolidowany dynamicznie jako ELF, to do załadowania
potrzebnych obiektów współdzielonych używany jest interpreter określony w
segmencie PT_INTERP. Tym interpreterem jest zazwyczaj \fI/lib/ld\-linux.so.2\fP,
w wypadku programów skonsolidowanych z glibc2 (zob. \fBld\-linux.so\fP(8)).
.SS "Wpływ na atrybuty procesu"
Wszystkie atrybuty procesu są zachowywane podczas \fBexecve\fP(), z wyjątkiem
poniższych:
.IP \[bu] 3
Ustawienia obsługi sygnałów, które są przechwytywane, są zmieniane na
wartości domyślne (\fBsignal\fP(7)).
.IP \[bu]
Alternatywny stos sygnałów nie jest zachowywany (\fBsigaltstack\fP(2)).
.IP \[bu]
Mapowania pamięci nie są zachowywane (\fBmmap\fP(2))
.IP \[bu]
Dołączone segmenty pamięci dzielonej Systemu\ V są odłączane (\fBshmat\fP(2)).
.IP \[bu]
Regiony pamięci dzielonej POSIX są odmapowane (\fBshm_open\fP(3)).
.IP \[bu]
Otwarte kolejki komunikatów POSIX są zamykane (\fBmq_overview\fP(7)).
.IP \[bu]
Otwarte semafory nazwane POSIX są zamykane (\fBmq_overview\fP(7)).
.IP \[bu]
Timery POSIX nie są zachowywane (\fBtimer_create\fP(2)).
.IP \[bu]
Otwarte strumienie katalogów są zamykane (\fBopendir\fP(3)).
.IP \[bu]
Blokady pamięci nie są zachowywane (\fBmlock\fP(2), \fBmlockall\fP(2)).
.IP \[bu]
Zarejestrowanie funkcje wykonywanych po zakończeniu procesu nie są
zachowywane (\fBatexit\fP(3), \fBon_exit\fP(3)).
.IP \[bu]
Środowisko zmiennoprzecinkowe jest ustawiane na domyślne (patrz \fBfenv\fP(3)).
.P
Atrybuty procesu w liście przedstawionej powyżej są określone w
POSIX.1. Następujące specyficzne dla Linuksa atrybuty procesu również nie są
zachowywane podczas \fBexecve\fP():
.IP \[bu] 3
Atrybut \[Bq]dumpable\[rq] (\[Bq]zrzucalny\[rq]) jest ustawiany na wartość
1, chyba że wykonywany jest program: z set\-user\-ID, z set\-group\-ID lub z
przywilejami (ang. capabilities); wówczas atrybut ten może być zresetowany
na wartość z \fI/proc/sys/fs/suid_dumpable\fP, w przypadkach opisanych odnośnie
\fBPR_SET_DUMPABLE\fP w podręczniku \fBprctl\fP(2). Proszę zauważyć, że zmiany
atrybutu \[Bq]dumpable\[rq] mogą spowodować zmianę własności plików w
katalogu procesu \fI/proc/\fPpid na \fIroot:root\fP, zgodnie z opisem w
podręczniku \fBproc\fP(5).
.IP \[bu]
Znacznik \fBPR_SET_KEEPCAPS\fP \fBprctl\fP(2) jest czyszczony.
.IP \[bu]
(Od Linuksa 2.4.36 / 2.6.23) Jeśli wykonywany program ma ustawiony bit
set\-user\-ID lub set\-group\-ID, to jest czyszczony znacznik
\fBPR_SET_PDEATHSIG\fP  sygnału śmierci rodzica ustawiony przez  \fBprctl\fP(2).
.IP \[bu]
Nazwa procesu ustawiona przez \fBPR_SET_NAME\fP z \fBprctl\fP(2) (i wyświetlana
przez \fIps\ \-o comm\fP) jest ustawiana na nazwę nowego pliku wykonywalnego.
.IP \[bu]
Znacznik \fBSECBIT_KEEP_CAPS\fP w \fIsecurebits\fP jest czyszczony. Patrz
\fBcapabilities\fP(7).
.IP \[bu]
Sygnał zakończenia jest ustawiany na \fBSIGCHLD\fP (patrz \fBclone\fP(2)).
.IP \[bu]
Tablica deskryptora plików nie jest dzielona, co anuluje działanie flagi
\fBCLONE_FILES\fP \fBclone\fP(2).
.P
Dalsze uwagi:
.IP \[bu] 3
Wszystkie wątki oprócz wątku wywołującego są niszczone podczas
\fBexecve\fP(). Zatrzaski (muteksy), zmienne warunkowe i inne obiekty pthreads
nie są zachowywane.
.IP \[bu]
Odpowiednik \fIsetlocale(LC_ALL, "C")\fP jest wykonywany po uruchomieniu
programu.
.IP \[bu]
POSIX.1 określa, że ustawienie procedur obsługi sygnału na ignorowanie lub
na wartość domyślną jest pozostawiane bez zmian. POSIX.1 przewiduje jeden
wyjątek od tej reguły: jeśli \fBSIGCHLD\fP jest ignorowany, to implementacja
może albo nie zmienić tego ustawienia, albo przestawić je na wartość
domyślną; Linux robi to pierwsze.
.IP \[bu]
Wszystkie asynchroniczne operacje wejścia/wyjście są anulowane
(\fBaio_read\fP(3), \fBaio_write\fP(3)).
.IP \[bu]
Sposób obsługi przywilejów procesu podczas \fBexecve\fP() opisano w
\fBcapabilities\fP(7).
.IP \[bu]
.\" 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
Domyślnie deskryptory plików pozostają otwarte po \fBexecve\fP(). Deskryptory
plików oznaczone jako \[Bq]zamknij\-przy\-wykonaniu\[rq] są zamykane, patrz
opis \fBFD_CLOEXEC\fP w \fBfcntl\fP(2). (Jeśli deskryptor pliku zostanie
zamknięty, to zwolnione zostaną wszystkie blokady rekordów dotyczące pliku
związanego z tym deskryptorem. Szczegóły można znaleźć w
\fBfcntl\fP(2)). POSIX.1 mówi, że jeżeli deskryptory plików 0, 1 i 2 zostałyby
zamknięte po pomyślnym wykonaniu \fBexecve\fP(), a proces uzyskałby przywileje
z powodu ustawionego na wykonywanym pliku bitu trybu set\-user\-ID lub
set\-group\-ID, to system może otworzyć bliżej nieokreślony plik dla każdego z
tych deskryptorów plików. Jako zasadę należy przyjąć, że żaden przenośny
program, uprzywilejowany czy nie, nie może zakładać, że te trzy deskryptory
plików będą zamknięte po \fBexecve\fP().
.SS "Skrypty interpretowane"
Skrypt interpretowany jest plikiem tekstowym mającym ustawione prawo do
wykonywania. Pierwszy wiersz tego pliku jest w postaci:
.P
.in +4n
.EX
\fB#!\fP\fIinterpreter \fP[opcjonalny\-parametr]
.EE
.in
.P
\fIinterpreter\fP mus być poprawną nazwą ścieżki do pliku wykonywalnego.
.P
Jeśli argument \fIpathname\fP wywołania \fBexecve\fP() określa interpreter, to
zostanie uruchomiony \fIinterpreter\fP z następującymi argumentami:
.P
.in +4n
.EX
\fIinterpreter\fP [opcjonalny\-arg] \fIpathname\fP arg...
.EE
.in
.P
.\" 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
gdzie \fIpathname\fP jest ścieżką pliku podanego jako pierwszy argument
\fBexecve\fP(), a \fIarg...\fP jest zestawem słów, na które wskazuje argument
\fIargv\fP \fBexecve\fP(), zaczynając od \fIargv[1]\fP. Proszę zauważyć, że nie da
się pozyskać \fIargv[0]\fP przekazanego do wywołania \fBexecve\fP().
.P
Dla zachowania przenośności na inne systemy, \fIoptional\-arg\fP albo w ogóle
nie powinien być podawany, albo powinien być podany jako pojedyncze słowo
(nie powinien zawierać spacji); patrz UWAGI poniżej.
.P
.\" commit bf2a9a39639b8b51377905397a5005f444e9a892
Od Linuksa 2.6.28 jądro pozwala, aby interpreterem skryptu również był
skrypt. To uprawnienie jest rekurencyjne, aż po czterykroć, tak więc
interpreter może być skryptem interpretowanym przez skrypt itd.
.SS "Ograniczenia rozmiaru argumentów i środowiska"
Większość implementacji Uniksa narzuca ograniczenia na całkowity rozmiar
argumentów linii poleceń (\fIargv\fP) i środowiska (\fIenvp\fP) przekazywanych do
nowego programu. POSIX.1 pozwala implementacji ogłosić te ograniczenia za
pomocą stałej \fBARG_MAX\fP (albo zdefiniowanej w \fI<limits.h>\fP, albo
dostępnej podczas wykonywania programu za pomocą wywołania
\fIsysconf(_SC_ARG_MAX)\fP).
.P
Przed Linuksem 2.6.23, pamięć używana do przechowywania łańcuchów znaków
środowiska i argumentów była ograniczana do 32 stron (zdefiniowane przez
stałą jądra \fBMAX_ARG_PAGES\fP). W architekturach mających strony o rozmiarze
4 kB oznaczało to maksymalny rozmiar równy 128\ kB.
.P
.\" For some background on the changes to ARG_MAX in Linux 2.6.23 and
.\" Linux 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 Linux 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).
W Linuksie 2.6.23 i późniejszych, większość architektur obsługuje
ograniczenie rozmiaru wywodzące się z miękkiego limitu zasobu
\fBRLIMIT_STACK\fP (patrz \fBgetrlimit\fP(2)), obowiązującego podczas wywołania
\fBexecve\fP() (Wyjątek stanowią architektury nie mające jednostki zarządzania
pamięcią: przechowują ograniczenie obowiązujące przed Linuksem
2.6.23). Zmiana ta pozwala programom na posiadanie znacznie większej listy
argumentów lub środowiska. Na tych architekturach całkowity rozmiar jest
ograniczony do 1/4 dopuszczalnego rozmiaru stosu. (Limit 1/4 zapewnia, że
zostanie jakaś przestrzeń na stos dla nowego programu). Dodatkowo, całkowity
rozmiar jest ograniczony do 3/4 wartości stałej jądra \fB_STK_LIM\fP (8
MiB). Od Linuksa 2.6.25 jądro przyjmuje również wartość minimalną 32 stron
dla tego limitu rozmiaru, tak żeby zagwarantować, że w przypadku gdy
\fBRLIMIT_STACK\fP ma niewielką wartość, aplikacje dostaną co najmniej taką
przestrzeń na argumenty i środowisko, jaką miały w Linuksie 2.6.22 i
wcześniejszych. (Takiej gwarancji nie ma w Linuksach 2.6.23 i
2.6.24). Dodatkowo ograniczeniem na pojedynczy łańcuch znaków są 32 strony
(stała jądra \fBMAX_ARG_STRLEN\fP), a maksymalna liczba takich łańcuchów wynosi
0x7FFFFFFF.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu \fBexecve\fP() nie wraca, w wypadku błędu zwracane
jest \-1 i ustawiane \fIerrno\fP wskazując błąd.
.SH BŁĘDY
.TP 
\fBE2BIG\fP
Całkowita liczba bajtów w środowisku (\fIenvp\fP) i liście argumentów (\fIargv\fP)
jest zbyt duża, argument łańcucha środowiska jest zbyt długi lub pełna
ścieżka \fIpathname\fP pliku wykonywalnego jest zbyt długa. Końcowy bajt null
jest wliczany do długości łańcucha.
.TP 
\fBEACCES\fP
Brak praw do przeszukiwania dla składnika ścieżki \fIpathname\fP lub ścieżki
interpretera skryptu (patrz także \fBpath_resolution\fP(7)).
.TP 
\fBEACCES\fP
Plik lub interpreter skryptu nie jest zwykłym plikiem.
.TP 
\fBEACCES\fP
Brak praw wykonywania dla pliku, skryptu lub intepretera ELF.
.TP 
\fBEACCES\fP
System plików jest zamontowany jako \fInoexec\fP.
.TP 
\fBEAGAIN\fP (od Linuksa 3.1)
.\" commit 72fa59970f8698023045ab0713d66f3f4f96945c
Po zmianie swojego rzeczywistego UID za pomocą jednego z wywołań
\fBset*uid\fP(), wywołujący był \[en] i wciąż jest \[en] powyżej swojego limitu
zasobów \fBRLIMIT_NPROC\fP (zob. \fBsetrlimit\fP(2)). Więcej informacji o tym
błędzie znajduje się w rozdziale UWAGI.
.TP 
\fBEFAULT\fP
\fIpathname\fP lub jeden ze wskaźników w wektorach \fIargv\fP lub \fIenvp\fP wskazuje
poza dostępną dla użytkownika przestrzeń adresową.
.TP 
\fBEINVAL\fP
Plik wykonywalny w formacie ELF ma więcej niż jeden segment PT_INTERP
(tzn. ma więcej niż jeden interpreter).
.TP 
\fBEIO\fP
Wystąpił błąd wejścia/wyjścia.
.TP 
\fBEISDIR\fP
Intepreter ELF jest katalogiem.
.TP 
\fBELIBBAD\fP
Nie został rozpoznany format interpretera ELF.
.TP 
\fBELOOP\fP
Podczas rozwiązywania \fIpathname\fP, nazwy skryptu lub interpretera ELF
napotkano zbyt wiele dowiązań symbolicznych.
.TP 
\fBELOOP\fP
.\" commit d740269867021faf4ce38a449353d2b986c34a67
Osiągnięto maksymalny limit rekurencji podczas intepretacji rekurencyjnego
skryptu (zob. pow. "Skrypty interpretowane"). Przed Linuksem 3.8 w takim
wypadku występował błąd \fBENOEXEC\fP.
.TP 
\fBEMFILE\fP
Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla
procesu.
.TP 
\fBENAMETOOLONG\fP
Ścieżka \fIpathname\fP jest zbyt długa.
.TP 
\fBENFILE\fP
Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych
plików.
.TP 
\fBENOENT\fP
Plik \fIpathname\fP, skrypt lub interpreter ELF nie istnieje.
.TP 
\fBENOEXEC\fP
Nie rozpoznano formatu pliku binarnego, plik ten jest skompilowany dla innej
architektury albo wystąpił jakiś inny błąd formatu pliku, który powoduje, że
program nie może być uruchomiony.
.TP 
\fBENOMEM\fP
Brak pamięci jądra.
.TP 
\fBENOTDIR\fP
Składowa ścieżki \fIpathname\fP, ścieżki skryptu lub ścieżki interpretera ELF
nie jest katalogiem.
.TP 
\fBEPERM\fP
System plików jest zamontowany jako \fInosuid\fP, użytkownik nie jest
administratorem, a plik ma ustawiony bit set\-user\-ID lub set\-group\-ID.
.TP 
\fBEPERM\fP
Proces jest śledzony (trace), użytkownik nie jest superużytkownikiem, a plik
ma ustawiony bit set\-user\-ID lub set\-group\-ID.
.TP 
\fBEPERM\fP
Aplikacje ślepe na przywileje nie pozyskają pełnego zestawu dozwolonych
przywilejów przyznanego przez plik wykonywalny. Zob. \fBcapabilities\fP(7).
.TP 
\fBETXTBSY\fP
Podany plik wykonywalny był otwarty do zapisu przez jeden lub więcej
procesów.
.SH WERSJE
POSIX nie opisuje zachowania #!, lecz istnieje ono (z pewnymi odmianami) na
innych systemach Uniksowych.
.P
.\" 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).
.\"
Pod Linuksem \fIargv\fP i \fIenvp\fP może być podany jako NULL. W obu przypadkach,
ma to ten sam skutek co podanie danego argumentu jako wskaźnika do listy
zawierającej pojedynczy wskaźnik null. \fBProsimy nie wykorzystywać tej niestandardowej i nieprzenośnej pseudofunkcji!\fP Na większości innych
systemów Uniksowych podanie jako \fIargv\fP wartości NULL spowoduje wystąpienie
błędu (\fBEFAULT\fP). \fICzęść\fP innych systemów Uniksowych traktuje przypadek
\fIenvp==NULL\fP tak samo jak Linux.
.P
.\"
POSIX.1 określa, że wartości zwracane przez \fBsysconf\fP(3) nie powinny się
zmieniać przez cały czas życia procesu. Jednakże od wersji 2.6.23 Linuksa
zmiana limitu zasobów \fBRLIMIT_STACK\fP powoduje również zmianę wartości
zwracanej przez \fB_SC_ARG_MAX\fP, żeby odzwierciedlić fakt, że zmieniły się
ograniczenia przestrzeni służącej do przechowywania argumentów linii poleceń
i zmiennych środowiska.
.SS "Skrypty interpretowane"
.\" commit 6eb3c3d0a52dca337e327ae8868ca1f44a712e02
Jądro narzuca maksymalną długość tekstu następującego po znakach
\[Bq]#!\[rq] na początku skryptu; znaki wykraczające poza limit są
ignorowane. Przed Linuksem 5.1, limit wynosi 127 znaków. Od Linuksa 5.1,
limit wynosi 255 znaków.
.P
.\" e.g., Solaris 8
.\" e.g., FreeBSD before 6.0, but not FreeBSD 6.0 onward
Semantyka argumentu \fIoptional\-arg\fP skryptu interpretera różni się pomiędzy
implementacjami. Pod Linuksem cały łańcuch znaków występujący po nazwie
\fIinterpreter\fPa jest przekazywany jako pojedynczy argument. Jednakże inne
systemy zachowują się inaczej. Niektóre systemy traktują  pierwszy znaku
białej spacji jako znak kończący \fIoptional\-arg\fP. Na innych systemach skrypt
interpretera może przyjmować wiele argumentów i białe znaki \fIoptional\-arg\fP
służą do ich rozdzielania.
.P
Linux (podobnie jest większość innych współczesnych systemów uniksowych)
ignoruje bity set\-user\-ID i set\-group\-ID dla skryptów.
.SH STANDARDY
POSIX.1\-2008.
.SH HISTORIA
.\" 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, SVr4, 4.3BSD.
.P
W Uniksie\ V6 lista argumentów wywołania \fBexec\fP() była kończona 0, podczas
gdy lista argumentów funkcji \fImain\fP była kończona \-1. Dlatego lista
argumentów przekazana do \fImain\fP nie mogła być bezpośrednio użyta w
wywołaniu \fBexec\fP(). Od Uniksa\ V7 obie te wartości są NULL.
.SH UWAGI
Można czasami przeczytać, że \fBexecve\fP() (i powiązane funkcje opisane w
\fBexec\fP(3)) są opisywane jako \[Bq]wykonujące \fInowy\fP proces\[rq] (lub
podobnie). Jest to stwierdzenie bardzo mylące: nie występuje tu nowy proces;
wiele atrybutów procesu wywołującego pozostaje niezmienionych (w
szczególności jego identyfikator procesu). Wszystko, co robi \fBexecve\fP(), to
zaaranżowanie wykonania nowego programu przez istniejący proces (proces
wywołujący).
.P
Procesy z ustawionymi znacznikami set\-user\-ID oraz set\-group\-ID nie mogą być
śledzone za pomocą \fBptrace\fP(2).
.P
Efekt zamontowania systemu plików \fInosuid\fP jest różny dla różnych wersji
jądra Linux: niektóre odmówią uruchomienia programów set\-user\-ID i
set\-group\-ID, gdy spowodowałoby to udostępnienie użytkownikowi możliwości,
którymi w danym momencie nie dysponuje (i zwrócą \fBEPERM\fP), inne po prostu
zignorują bity set\-user\-ID i set\-group\-ID i pomyślnie wykonają \fBexec\fP().
.P
.\" commit 19d860a140beac48a1377f179e693abe86a9dac9
W większości sytuacji gdy \fBexecve\fP() zawiedzie, kontrola powraca do
oryginalnego obrazu wykonywalnego, a wywołujący \fBexecve\fP() może następnie
obsłużyć błąd. Jednak są (rzadkie) przypadki (zwykle przy braku zasobów),
gdy błąd może wystąpić w momencie bez powrotu: oryginalny obraz wykonywalne
został podzielony, a nie można całkowicie zbudować nowego obrazu. W takich
sytuacjach jądro zabija proces sygnałem \fBSIGSEGV\fP (\fBSIGKILL\fP do Linuksa
3.17).
.SS "execve() i EAGAIN"
Poniżej znajduje się bardziej szczegółowy opis błędu \fBEAGAIN\fP, który może
wystąpić (od Linuksa 3.1) przy wywoływaniu \fBexecve\fP().
.P
.\" commit 909cc4ae86f3380152a18e2a3c44523893ee11c4
Błąd \fBEAGAIN\fP może wystąpić, gdy wywołanie \fIpoprzedzające\fP \fBsetuid\fP(2),
\fBsetreuid\fP(2) lub \fBsetresuid\fP(2) spowodowało, że rzeczywisty ID
użytkownika procesu zmienił się i ta zmiana doprowadziła do wyczerpania jego
limitu zasobów \fBRLIMIT_NPROC\fP (tzn. liczba procesów należących do nowego
rzeczywistego UID przekroczy limit zasobów). Od Linuksa 2.6.0 do Linuksa 3.0
powodowało to niepowodzenie wywołania \fBset*uid\fP(). Przed Linuksem 2.6 limit
zasobów nie był nakładany w przypadku procesów zmieniających swój
identyfikator użytkownika.
.P
Od Linuksa 3.1, opisana sytuacja nie powoduje już niepowodzenia wywołania
\fBset*uid\fP(), ponieważ zbyt często prowadziło to do dziur bezpieczeństwa,
gdy nieprawidłowo napisane programy nie sprawdzały statusu zakończenia i
przyjmowały, że \[en] jeśli wywołujący ma uprawnienia roota \[en] wywołanie
zawsze powiedzie się. Obecnie wywołania \fBset*uid\fP() poprawnie zmieniają
rzeczywisty UID, lecz jądro ustawia wewnętrzną flagę \fBPF_NPROC_EXCEEDED\fP,
wskazując że przekroczono limit zasobów \fBRLIMIT_NPROC\fP. Jeśli flaga
\fBPF_NPROC_EXCEEDED\fP jest ustawiona, a limit zasobów jest wciąż przekroczony
w trakcie kolejnego wywołania \fBexecve\fP(), to wywołanie to zakończy się z
błędem \fBEAGAIN\fP.  Ta logika jądra zapewnia, że limit zasobów
\fBRLIMIT_NPROC\fP jest wciąż wymuszony dla zwykłej pracy demonów
uprzywilejowanych \[en] przykładem jest \fBfork\fP(2)  + \fBset*uid\fP()  +
\fBexecve\fP().
.P
.\"
.\" .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 Linux 2.0.34 or Linux 2.2.15.
Jeśli jednak limit zasobów nie był już przekroczony w trakcie wywołania
\fBexecve\fP() (ponieważ zakończyły się inne procesy należące do tego
rzeczywistego UID pomiędzy wywołaniami \fBset*uid\fP() i \fBexecve\fP()), to
wywołanie \fBexecve\fP() powiedzie się, a jądro usunie flagę procesu
\fBPF_NPROC_EXCEEDED\fP. Flaga jest usuwana również wówczas, gdy kolejne
wywołanie do \fBfork\fP(2) przez ten proces powiedzie się.
.SH PRZYKŁADY
Następujący program jest zaprojektowany do wykonania przez drugi program
przedstawiony poniżej. Wyświetla swoje argumenty uruchomienia po jednym w
wierszu.
.P
.in +4n
.\" SRC BEGIN (myecho.c)
.EX
/* myecho.c */
\&
#include <stdio.h>
#include <stdlib.h>
\&
int
main(int argc, char *argv[])
{
    for (size_t j = 0; j < argc; j++)
        printf("argv[%zu]: %s\[rs]n", j, argv[j]);
\&
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.in
.P
Tego programu można użyć do uruchomienia programu podanego w argumencie
wiersza poleceń:
.P
.in +4n
.\" SRC BEGIN (execve.c)
.EX
/* execve.c */
\&
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
\&
int
main(int argc, char *argv[])
{
    static char *newargv[] = { NULL, "witaj", "świecie", NULL };
    static char *newenviron[] = { NULL };
\&
    if (argc != 2) {
        fprintf(stderr, "Użycie: %s <plik\-do\-wykon>\[rs]n", argv[0]);
        exit(EXIT_FAILURE);
    }
\&
    newargv[0] = argv[1];
\&
    execve(argv[1], newargv, newenviron);
    perror("execve");   /* execve() powraca tylko przy błędzie */
    exit(EXIT_FAILURE);
}
.EE
.\" SRC END
.in
.P
Możemy użyć drugiego programu do uruchomienia pierwszego:
.P
.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]: witaj
argv[2]: świecie
.EE
.in
.P
Możemy także użyć tych programów do pokazania używania interpretera
skryptu. Aby to zrobić, tworzymy skrypt, którego \[Bq]interpreterem\[rq]
jest nasz program \fImyecho\fP:
.P
.in +4n
.EX
$\fB cat > script\fP
\fB#!./myecho script\-arg\fP
\fB\[ha]D\fP
$\fB chmod +x script\fP
.EE
.in
.P
Następnie używamy naszego programu do wykonania skryptu:
.P
.in +4n
.EX
$\fB ./execve ./script\fP
argv[0]: ./myecho
argv[1]: script\-arg
argv[2]: ./script
argv[3]: witaj
argv[4]: świecie
.EE
.in
.SH "ZOBACZ TAKŻE"
\fBchmod\fP(2), \fBexecveat\fP(2), \fBfork\fP(2), \fBget_robust_list\fP(2),
\fBptrace\fP(2), \fBexec\fP(3), \fBfexecve\fP(3), \fBgetauxval\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)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
