Das Setzen einer langen Umgebungsvariable führt zu vielen Befehlen

Das Setzen einer langen Umgebungsvariable führt zu vielen Befehlen

Ich habe ein seltsames Verhalten festgestellt, wenn ich mit den Umgebungsvariablen herumspiele. Ich richte eine sehr lange Umgebungsvariable ein und dies verhindert das Starten eines beliebigen Befehls:

( Ubuntu 14.04.5 LTS (GNU/Linux 4.4.0-66-generic x86_64) )

$ export A=$(python -c "print 'a'*10000000")
$ env
-bash: /usr/bin/env: Argument list too long
$ ls
-bash: /bin/ls: Argument list too long
$ cat .bashrc
-bash: /bin/cat: Argument list too long
$ id
-bash: /usr/bin/id: Argument list too long

Was passiert hier ?

Antwort1

Die Argumentliste und die Umgebung eines Befehls werden beim Start eines Programms in denselben Speicherbereich kopiert. Die Fehlermeldung lautet „Argumentliste zu lang“, aber tatsächlich besteht der genaue Fehler darin, dass die Argumentliste plus die Umgebung zu lang sind.

Dies geschieht im Rahmen derexecveSystemaufruf. Die meisten, wenn nicht alle Unix-Varianten haben eine Begrenzung der Größe dieses temporären Speicherplatzes. Der Grund für diese Begrenzung ist, zu verhindern, dass ein fehlerhaftes oder bösartiges Programm den Kernel dazu veranlasst, eine große Menge Speicher außerhalb des eigenen Speicherplatzes des Programms zu verwenden.

DerPOSIX-Standardgibt an, dass die maximale Größe dieses Speicherplatzes mindestens betragen muss ARG_MAXund dass dieMindestwertdavon ( _POSIX_ARG_MAX) ist 4096. In der Praxis erlauben die meisten Unix-Varianten mehr als das, aber nicht 10 MB. Sie können den Wert auf Ihrem System mit überprüfen getconf ARG_MAX. Auf modernen Linux-Systemen beträgt das Maximum 2 MB (mit typischen Einstellungen). Traditionell hatten viele Systeme ein Limit von 128 kB. Linux hat auch immer noch eine128 kB-Grenze für den Wert eines einzelnen Arguments oder die Definition einer Umgebungsvariablen.

Wenn Sie mehr als ein paar Hundert Bytes an Informationen übergeben müssen, übergeben Sie diese in einer Datei.

verwandte Informationen