Execute o mesmo comando para cada sessão bash não interativa

5

Eu preciso implementar algumas configurações - eu preciso executar algum código, se alguém no meu sistema solicitar o comando bash em qualquer formato (interativo, não interativo e bash -c form). Por exemplo, este é o comando que quero adicionar a cada chamada do bash:
touch /tmp/$RANDOM
Eu adicionei essa linha para /bash/bash.bashrc e ele funciona bem para o shell de logon e para shells, que foi iniciado chamando o comando bash .
Mas isso não funcionará para a sessão bash inicializada assim:
bash -c 'echo 1' - novo arquivo não será criado

A partir da documentação, eu entendo que bash.bashrc e bash_profile são chamados apenas para shells de logon ou interativos. Existe alguma maneira de criar algumas chamadas semelhantes para shells não interativos também?

    
por ShockwaveNN 12.12.2015 / 15:09

1 resposta

2

Para fazer o bash analisar um arquivo quando invocado como um shell não interativo, você precisa definir a variável de ambiente BASH_ENV para apontar para esse arquivo. De man bash (seção na INVOCATION):

When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute. Bash behaves as if the following com‐ mand were executed:

    if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

but the value of the PATH variable is not used to search for the file‐ name.

Então, onde definir BASH_ENV ?

Ou: Se você quiser que uma variável esteja disponível para o ambiente em todo o sistema, um bom local para colocá-la é /etc/environment . Este arquivo é feito especificamente para configurações de variáveis de ambiente em todo o sistema. Ele não é analisado pelo shell, mas pelo módulo PAM pam_env , portanto, você não pode usar a sintaxe do shell ou a expansão de variáveis, mas apenas designações simples do tipo a seguir:

    VARIABLE=value

ou

    VARIABLE=/full/path/to/file

As alterações entrarão em vigor no próximo login / autenticação, então mude para um novo console ou logout tty e faça o login novamente na sua sessão.

Em um sistema de desktop padrão, isso deve funcionar para todos os tipos de sessões autenticadas usando o PAM, incluindo logins de console, ssh e gerenciadores de exibição, mas também daemons como atd e cron. Se tudo funcionar como esperado, então você está pronto e não há necessidade de ler.

No entanto, erros ocasionalmente surgem nos arquivos de configuração do PAM de alguns programas / distribuições, portanto, se /etc/environment não for analisado por um certo tipo de programa, certifique-se de que o módulo PAM necessário esteja carregado no arquivo de configuração PAM. esse programa em /etc/pam.d :

    session       required   pam_env.so readenv=1

(Nota: O readenv flag que liga / desliga a configuração do arquivo de configuração não deve ser realmente necessário, já que é definido como on (1) por padrão - mas não faz mal ter certeza disso. )

Ou: Se você estiver trabalhando em um sistema que não forneça pam_env , a melhor alternativa que venha à minha mente seria escrever um script de inicialização simples (ou arquivo de unidade de serviço no systemd) que analise um arquivo de configuração personalizado (como /etc/default/environment ) na inicialização.

    
por 21.01.2016 / 15:59