.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" and Copyright (c) 2014 by Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Sat Jul 24 17:51:15 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 11 May 1998 by Joseph S. Myers (jsm28@cam.ac.uk) .\" Modified 14 May 2001, 23 Sep 2001 by aeb .\" 2004-12-20, mtk .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH system 3 "20. Juli 2023" "Linux man\-pages 6.05.01" .SH BEZEICHNUNG system \- einen Shell\-Befehl ausführen .SH BIBLIOTHEK Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP) .SH ÜBERSICHT .nf \fB#include \fP .PP \fBint system(const char *\fP\fIBefehl\fP\fB);\fP .fi .SH BESCHREIBUNG Die Bibliotheksfunktion \fBsystem\fP() verhält sich, als ob sie \fBfork\fP(2) verwenden würde, um einen Kindprozess zu erzeugen, der den in \fIBefehl\fP angegebenen Shell\-Befehl mittels \fBexecl\fP(3) wie folgt ausführte: .PP .in +4n .EX execl("/bin/sh", "sh", "\-c", Befehl, (char *) NULL); .EE .in .PP \fBsystem\fP() kehrt nach der Ausführung zurück. .PP Während der Ausführung des Befehls wird \fBSIGCHLD\fP blockiert und \fBSIGINT\fP sowie \fBSIGQUIT\fP werden in den \fBsystem\fP()\-Prozessaufrufen ignoriert (diese Signale werden gemäß ihrer Voreinstellungen innerhalb des Kindprozesses behandelt, der \fIBefehl\fP ausführt). .PP Falls \fIBefehl\fP NULL ist, gibt \fBsystem\fP() einen Status zurück, der angibt, ob auf dem System eine Shell verfügbar ist. .SH RÜCKGABEWERT Der Rückgabewert von \fBsystem\fP() ist einer der folgenden: .IP \[bu] 3 Falls \fIBefehl\fP NULL ist, ein Wert ungleich Null, wenn die Shell verfügbar ist oder Null, wenn nicht. .IP \[bu] Falls ein Kindprozess nicht erstellt werden konnte oder sein Status nicht erneut geholt werden kann, ist der Rückgabewert \-1 und \fIerrno\fP wird gesetzt, um den Fehler anzuzeigen. .IP \[bu] Falls in dem Kindprozess keine Shell ausgeführt werden kann, ist der Rückgabewert so, als ob die Shell im Kindprozess durch den Aufruf von \fB_exit\fP(2) mit dem Status 127 beendet worden wäre. .IP \[bu] Falls alle Systemaufrufe erfolgreich waren, dann wird der Rückgabewert der Status beim Beenden der Kind\-Shell sein, die zum Ausführen von \fIBefehl\fP benutzt wurde. (Der Status beim Beenden einer Shell ist der Status beim Beenden des letzten von ihr ausgeführten Befehls.) .PP In den letzten beiden Fällen ist der Rückgabewert ein »Wartestatus«, der mittels der in \fBwaitpid\fP(2) beschriebenen Makros untersucht werden kann (d.h. \fBWIFEXITED\fP(), \fBWEXITSTATUS\fP() und so weiter). .PP \fBsystem\fP() beeinflusst nicht den Wartestatus anderer Kindprozesse. .SH FEHLER \fBsystem\fP() kann mit den gleichen Fehlern wie \fBfork\fP(2) fehlschlagen. .SH ATTRIBUTE Siehe \fBattributes\fP(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke. .TS allbox; lbx lb lb l l l. Schnittstelle Attribut Wert T{ .na .nh \fBsystem\fP() T} Multithread\-Fähigkeit MT\-Sicher .TE .sp 1 .SH STANDARDS C11, POSIX.1\-2008. .SH GESCHICHTE POSIX.1\-2001, C89. .SH ANMERKUNGEN \fBsystem\fP() stellt Einfachheit und Komfort bereit. Es behandelt alle Einzelheiten beim Aufrufen von \fBfork\fP(2), \fBexecl\fP(3) und \fBwaitpid\fP(2) sowie die nötigen Manipulationen von Signalen. Zusätzlich führt die Shell die üblichen Ersetzungen von E/A\-Umleitungen für \fIBefehl\fP durch. Am stärksten geht dies zu Lasten der Leistungsfähigkeit: Zum Erzeugen des Prozesses, der die Shell startet, sowie zum Ausführen der Shell werden zusätzliche Systemaufrufe benötigt. .PP Falls das Feature\-Test\-Makro \fB_XOPEN_SOURCE\fP definiert wurde (vor dem Einbinden \fIirgendwelcher\fP Header\-Dateien), dann werden die in \fBwaitpid\fP(2) beschriebenen Makros (\fBWEXITSTATUS\fP(), etc.) durch das Einbinden von \fI\fP zur Verfügung gestellt. .PP Wie erwähnt, ignoriert \fBsystem\fP() \fBSIGINT\fP und \fBSIGQUIT\fP. Dies kann dazu führen, dass Programme, die es in einer Schleife aufrufen, nicht mehr unterbrochen werden können, sofern sie nicht aufpassen, dass sie selbst den Exit\-Status des Kindprozesses prüfen. Zum Beispiel: .PP .in +4n .EX while (etwas) { int ret = system("foo"); \& if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break; } .EE .in .PP Laut POSIX.1 ist nicht spezifiziert, ob mittels \fBpthread_atfork\fP(3) registrierte Handler während der Ausführung von \fBsystem\fP() aufgerufen werden. In der Glibc\-Implementierung werden solche Handler nicht aufgerufen. .PP Vor Glibc 2.1.3 wurde die Verfügbarkeit von \fI/bin/sh\fP genaugenommen nicht überprüft, wenn \fIBefehl\fP NULL war. Stattdessen wurde angenommen, es sei verfügbar und \fBsystem\fP() gab in diesem Fall immer 1 zurück. Seit Glibc 2.1.3 wird diese Überprüfung durchgeführt, da, obwohl POSIX.1\-2001 eine entsprechende Implementierung benötigt, um eine Shell zur Verfügung zu stellen, diese Shell nicht verfügbar oder ausführbar sein könnte, wenn das aufrufende Programm vorher \fBchroot\fP(2) aufrief (was nicht durch POSIX.1\-2001 spezifiziert ist). .PP .\" Es ist möglich, dass ein Shell\-Befehl mit dem Status 127 beendet wird. Dies ergibt einen Rückgabewert von \fBsystem\fP(), der nicht von dem Fall zu unterscheiden ist, in dem eine Shell nicht im Kindprozess ausgeführt werden kann. .SS Warnungen Benutzen Sie \fBsystem\fP() nicht aus einem privilegierten Programm (einem Set\-User\-ID\- oder Set\-Group\-ID\-Programm oder einem mit Capabilities), da merkwürdige Werte für einige Umgebungsvariablen benutzt werden könnten, die möglicherweise die Systemintegrität untergraben. Beispielsweise könnte \fBPATH\fP so verändert sein, dass ein beliebiges Programm mit Privilegien ausgeführt wird. Benutzen Sie stattdessen die Funktionen der \fBexec\fP(3)\-Familie, jedoch nicht \fBexeclp\fP(3) oder \fBexecvp\fP(3) (die auch die Umgebungsvariable \fBPATH\fP zur Suche nach Programmen verwenden). .PP Genaugenommen wird \fBsystem\fP() aus Programmen mit SUID\- oder SGID\-Rechten nicht richtig auf Systemen funktionieren, auf denen \fI/bin/sh\fP Bash in der Version 2 vorliegt, da Bash 2 als Sicherheitsmaßnahme beim Start Privilegien verwirft. (Debian benutzt eine andere Shell, \fBdash\fP(1), die dies unterlässt, wenn sie als \fBsh\fP aufgerufen wird. .PP Sämtliche Benutzereingaben, die als Teil von \fIcommand\fP eingesetzt werden, sollten \fIsorgfältig\fP bereinigt werden, um sicherzustellen, dass unerwartete Shell\-Befehle oder Befehlsoptionen nicht ausgeführt werden. Solche Risiken sind besonders schwerwiegend, wenn \fBsystem\fP() aus einem privilegierten Programm verwandt wird. .SH FEHLER .\" [BUG 211029](https://bugzilla.kernel.org/show_bug.cgi?id=211029) .\" [glibc bug](https://sourceware.org/bugzilla/show_bug.cgi?id=27143) .\" [POSIX bug](https://www.austingroupbugs.net/view.php?id=1440) Falls der Befehlsname mit einem Minuszeichen beginnt, interpretiert \fBsh\fP(1) den Befehlsnamen als Option, was in einem nicht definierten Verhalten resultiert (siehe die Option \fB\-c\fP zu \fBsh\fP(1)). Um dieses Problem zu umgehen, stellen Sie dem Befehl ein Leerzeichen voran, wie im folgenden aufruf: .PP .in +4n .EX system(" \-ungünstiger\-Befehlsname"); .EE .in .SH "SIEHE AUCH" \fBsh\fP(1), \fBexecve\fP(2), \fBfork\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBwait\fP(2), \fBexec\fP(3), \fBsignal\fP(7) .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother , Chris Leick , Dr. Tobias Quathamer , Helge Kreutzmann und Mario Blättermann erstellt. .PP 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. .PP 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 .