Variáveis de ambiente protegidas?

3

Existem nomes de variáveis de ambiente que não podem ser sobrescritos pelo usuário / uma chamada para setenv ? Pelo que entendi do POSIX1.2008, qualquer processo pode editar o bloco de ambiente, mas deve evitar sobrescrever tais vars como LANG, etc.

    
por Deer Hunter 16.06.2014 / 04:31

4 respostas

5

O ambiente é uma lista de strings do formulário var=value ( por convenção ) que é passado como o argumento 3 rd para a chamada do sistema execve ().

Essa lista é colocada em algum lugar na pilha do processo quando começa a executar o novo comando como na lista de argumentos (outra lista de strings passou como segundo argumento para execve() ).

Em programas que usam a libc (a maioria), um código de inicialização chamado antes da função main() ser chamado, disponibiliza essas cadeias de ambiente como a matriz environ .

O libc também fornece com putenv e setenv funções que podem modificar (uma cópia) dessa lista que o programa recebeu. Essa cópia mantida, modificada, será então passada para o próximo comando executado pelo processo ou qualquer um dos seus filhos através das funções execvp() / execl() / system() / popen() ... da libc (que acabam chamando a chamada do sistema execve() .

Agora, quando você cria uma lista de cadeias de caracteres que passa manualmente para a chamada de sistema execve() , pode passar strings como foo (sem um caractere = ) ou =bar (com uma variável vazia name), setenv não permitirá que você faça isso ( setenv("", "bar", 1) é rejeitado).

setenv("a=b", "c") também será rejeitado. Portanto, as strings que serão definidas por setenv sempre terão o formato x=y , em que x pode não estar vazio.

Essa é a única restrição (também aplicada por putenv ). Bem, aqueles que estão sendo seqüências terminadas em NUL, é claro que o caractere NUL não pode aparecer no nome ou valor da variável.

setenv("*", "x", 1) , ou setenv("\n\n", "", 1) estão todos OK em relação a setenv() ou o kernel. Agora, se você vai ser capaz de fazer algo útil com isso, é outra questão.

    
por 17.06.2014 / 00:43
2

Não, não há restrições sobre quais variáveis de ambiente podem ser alteradas por um processo. No entanto, lembre-se de que cada processo tem sua própria cópia do ambiente herdado e um processo não pode alterar nenhuma variável de ambiente em nenhum outro processo. A chamada setenv só pode modificar o ambiente dentro do processo de chamada.

    
por 16.06.2014 / 04:42
1

Eu acho que depende completamente do shell que você está executando.

No Bash UID é um BASH_VERSINFO é outro de acordo com a página do manual.

Por outro lado, em csh, de acordo com o manual As variáveis de ambiente não podem ser feitas somente para leitura.

    
por 16.06.2014 / 15:54
0
export MYENV=value
readonly MYENV
    
por 16.06.2014 / 08:40