Variáveis ​​de ambiente protegidas?

Variáveis ​​de ambiente protegidas?

Existem nomes de variáveis ​​de ambiente que não podem ser substituídas pelo usuário/uma chamada para setenv? Pelo que entendi no POSIX1.2008, qualquer processo pode editar o bloco de ambiente, mas deve evitar a substituição de vars como LANG etc.

Responder1

O ambiente é uma lista de strings no formato var=value(por convenção) que é passado como o terceiro argumento para a chamada do sistema execve().

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

Em programas que usam libc (a maioria), um código de inicialização chamado antes da main()função ser invocada torna essas strings de ambiente disponíveis como environarray.

O libctambém fornece putenvfunções setenvque podem modificar (uma cópia) daquela lista que o programa recebeu. Essa cópia modificada e mantida será então passada para o próximo comando executado pelo processo ou qualquer um de seus filhos por meio das funções execvp()/ execl()/ system()/ popen()... da libc (que acabam chamando a execve()chamada do sistema).

Agora, enquanto você cria uma lista de strings que você passa manualmente para a execve()chamada do sistema, você pode passar strings como foo(sem =caractere) ou =bar(com um nome de variável vazio), setenvnã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 setenvsempre estarão no formato x=yonde xnão podem estar vazias.

Essa é praticamente a única restrição (também aplicada por putenv). Bem, sendo strings 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 no que setenv()diz respeito ao kernel. Agora, se você será capaz de fazer algo útil com eles é outra questão.

Responder2

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 seucópia própriado ambiente herdado, e um processo não pode alterar nenhuma variável de ambiente em qualquer outro processo. A setenvchamada só pode modificar o ambiente dentro do processo de chamada.

Responder3

export MYENV=value
readonly MYENV

Responder4

Acho que depende completamente do shell que você está executando.

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

Por outro lado, em csh de acordo com o manualVariáveis ​​de ambiente não podem ser tornadas somente leitura.

informação relacionada