Executa um script toda vez que um shell é gerado

0

Eu preciso de uma maneira de fazer um script ser executado todo o tempo em todos os usuários e de iniciar automaticamente se qualquer novo shell for gerado. Alguma idéia?

    
por nyesss 13.12.2014 / 09:45

2 respostas

3

... por quê? Provavelmente existe uma solução melhor, então se você indicar por que provavelmente podemos sugerir algumas soluções mais sólidas. Lembre-se de que o shell é usado não apenas pelos usuários, mas também por muitos processos do sistema.

De qualquer forma, bash (o shell padrão) quando iniciado, irá (mas veja depois) executar uma série de scripts para todo o sistema. O shell pode ser iniciado como interativo ou não interativo e como shell de login ou não-login (consulte man bash e procure por "INVOCATION" para obter detalhes).

Basicamente, quando um usuário inicia um shell em um terminal em uma sessão gráfica, o bash é chamado como shell interativo e não-login e executa /etc/bash.bashrc :

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.

Então você pode adicionar comandos lá. Tenha cuidado, porém, erros aqui podem tornar seu sistema muito difícil de recuperar.

resumo executivo (testado)

Edite /etc/bash.bashrc e, DEPOIS da linha que diz

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

adicione por exemplo:

echo "Hello $USER, you started a new shell"

e de um terminal:

[romano:~] % bash
Hello romano, you started a new shell
romano@RRyS:~$

Se você deseja executar um script aqui, tenha cuidado e verifique novamente, como

if [ -x /full/path/to/script ]; then 
     /full/path/to/script  # double check here 
fi

verifique novamente que /full/path/to/script não chama bash no modo interativo, ou você terá um bom loop infinito aqui.

advertência:

Isso não é de todo imposto : outros shells ( zsh , tcsh , dash ) se comportarão de maneira diferente e usarão arquivos diferentes. E, obviamente, qualquer usuário pode chamar o shell com

bash --norc --noprofile 

e ter os arquivos de script ignorados.

Existe até um exemplo no/etc/bash.bashrc de 14.04% (provavelmente um remanescente de quando o Ubuntu mudou para sudo... ) para sugerir ao usuário usar sudo ao invés de logar como root:

# sudo hint
if [ ! -e "$HOME/.sudo_as_admin_successful" ] && [ ! -e "$HOME/.hushlogin" ] ; then
    case " $(groups) " in *\ admin\ *)
    if [ -x /usr/bin/sudo ]; then
        cat <<-EOF
        To run a command as administrator (user "root"), use "sudo <command>".
        See "man sudo_root" for details.

        EOF
    fi
    esac
fi

... mas isso é arqueologia de código; -).

    
por Rmano 13.12.2014 / 10:22
1

Não sei ao certo o que você quer dizer com "corra em todos os momentos", por isso não posso responder a essa parte, mas pelo resto.

link tem uma ótima explicação na seção 'Variáveis de ambiente de todo o sistema'.

Mas aqui está o que você precisa saber. Os shells de login e os shells interativos que não são de login são controlados por arquivos diferentes. Então, se você quiser que seu script seja executado quando TODOS os shells forem iniciados, você precisará criar seu script em ambos os lugares ou colocá-lo em ambos os lugares.

Faça um script ser executado quando qualquer shell de login for executado:

Quote from the above source: Files with the .sh extension in the /etc/profile.d directory get executed whenever a bash login shell is entered (e.g. when logging in from the console or over ssh), as well as by the DisplayManager when the desktop session loads.

Portanto, basta colocar seu script no diretório /etc/profile.d e dar a ele uma extensão .sh.

Faça um script ser executado quando qualquer shell interativo de não-login for executado:

praticamente o mesmo de antes, só que desta vez não é um diretório, mas um arquivo.

/etc/bash.bashrc será originado quando qualquer shell interativo de não-login for executado. Isso significa que você pode colocar o conteúdo do seu script diretamente em /etc/bash.bashrc ou pode criar seu script a partir dele. Se o seu script estiver localizado em /etc/myscript.sh, você poderá obtê-lo adicionando o source /etc/myscript.sh ao arquivo /etc/bash.bashrc.

    
por Tobias 13.12.2014 / 10:23