Definir uma variável de ambiente longa quebra vários comandos

2

Eu tenho visto um comportamento estranho quando estou atrapalhando as variáveis de ambiente. Estou configurando uma variável de ambiente muito longa e isso evita o lançamento de qualquer comando:

( 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

O que está acontecendo aqui?

    
por nobe4 09.04.2017 / 00:02

1 resposta

4

A lista de argumentos e o ambiente de um comando são copiados no mesmo espaço na memória quando um programa é iniciado. A mensagem de erro é "Lista de argumentos muito longa", mas, na verdade, o erro exato é que a lista de argumentos mais o ambiente é muito longa.

Isso acontece como parte da execve chamada do sistema. A maioria, senão todas, as variantes unix têm um limite no tamanho deste espaço temporário. A razão para este limite é evitar que um programa malicioso ou com bugs faça com que o kernel use uma grande quantidade de memória fora do espaço de memória do programa.

O padrão POSIX especifica que o tamanho máximo deste espaço de memória deve ser pelo menos ARG_MAX , e que o valor mínimo disso ( _POSIX_ARG_MAX ) é 4096. Na prática, a maioria das variantes do Unix permite mais que isso, mas não 10MB. Você pode verificar o valor em seu sistema com getconf ARG_MAX . Nos sistemas Linux modernos, o máximo é de 2 MB (com configurações típicas). Tradicionalmente muitos sistemas tinham um limite de 128kB. O Linux também ainda tem um 128kB limite para o valor de um único argumento ou a definição de uma variável de ambiente .

Se você precisar passar mais do que algumas centenas de bytes de informação, passe-a em um arquivo.

    
por 09.04.2017 / 02:14