Plano de Aula: Programação avançada 3 - Subshell e shell
restrito
PROGRAMAÇÃO PARA SERVIDORES -CCT0327
Título Programação avançada 3 - Subshell e shell restrito Número de Aulas por Semana Número de Semana de Aula 10 Tema Subshell e shell restrito Objetivos O aluno deverá ser capaz de: Compreender o conceito de subshells; Entender o funcionamento de um subshell; Criar rotinas paralelas com subshell; Entender os mecanismos de segurança de um shell restrito; Desenvolver scripts usando shell restrito; Estrutura do Conteúdo 1. SubshellUm subshell é uma instância separada do processador de comandos. Assim como comandos são interpretados pelo prompt da linha de comando, um script
é um processamento batch de uma lista de comandos. Cada shell script sendo executado é efetivamente um subprocesso (processo filho) de um shell.
Um shell script pode por si criar subprocessos. Tais subshells permitem ao script realizar um processamento paralelo, executando múltiplas subtarefas simultaneamente.
Para criar um subshell dentro de um script, colocar os comandos do subshell entre parênteses. Por exemplo, criar o script de nome "teste_subshell.sh" com o seguinte conteúdo: ( while [ 1 ] do sleep 1 echo "Dentro do loop 1 ..." done ) e executar com o comando: bash teste_subshell.sh Se em outro terminal entrar com o comando: ps -ef | grep teste_subshell.sh será apresentado: UID PID PPID C STIME TTY TIME CMD root 25357 31092 0 21:01 pts/2 00:00:00 bash teste_subshell.sh root 25358 25357 0 21:01 pts/2 00:00:00 bash teste_subshell.sh mostrando que o script que possui PID 25357 deu origem ao subshell 25358. Um comando externo executado em um script gera um subprocesso, enquanto um comando interno não gera qualquer subprocesso. Por isto um comando interno executa mais rápido e consome menos recursos que comandos externos equivalentes. Variáveis em um subshell não são visíveis fora do bloco do subshell, não sendo, assim, acessíveis pelo processo pai. Desta forma um subshell pode ser utilizado para criar um ambiente específico para determinado bloco de comandos. COMANDO1 COMANDO2
( PATH=/home/fabio/bin COMANDO3 COMANDO4 exit # sai apenas do subshell ) # o shell pai não eh afetado e seu ambiente eh preservado COMANDO5 COMANDO6 1.1 Execução paralela dentro de um subshell
Para colocar um comando executando em segundo plano basta colocar o símbolo & no final do comando. Da mesma forma para executar um subshell em segundo plano basta colocar o símbolo & após o fechamento do parentese. ( while [ 1 ] do sleep 1 echo "Dentro do loop 1 ..." done )& ( while [ 1 ] do sleep 1 echo "Dentro do loop 2 ..." done )& ( while [ 1 ]
do sleep 1 echo "Dentro do loop 3 ..." done ) No exemplo acima o primeiro e o segundo blocos executam paralelamente em segundo plano, enquanto o terceiro bloco executa em paralelo aos dois primeiros.
No exemplo abaixo o script termina sua execução, mas os dois blocos anteriores continuam executando em segundo plano até terminarem seus respectivos loops. ( i=1 while [ $i -le 5 ] do sleep 1 echo "Dentro do loop 1 ($i)..." let i=i+1 done )& ( i=1 while [ $i -le 5 ] do sleep 2 echo "Dentro do loop 2 ($i)..." let i=i+1 done )& echo "Fim do script."
Para fazer com que o script continue sua execução somente após o termino dos blocos que estão em segundo plano, pode ser utilizado o comando interno wait: ( i=1 while [ $i -le 5 ] do sleep 1 echo "Dentro do loop 1 ($i)..." let i=i+1 done )& ( i=1 while [ $i -le 5 ] do sleep 2 echo "Dentro do loop 2 ($i)..." let i=i+1 done )& wait echo "Fim do script." 2. Shell restrito
Executar um script ou parte de um script em modo restrito desativa alguns comandos, tornando-os indisponíveis. É uma medida de segurança destinada a limitar os privilégios do usuário do script e minimizar possíveis danos causados pela execução do script.
Os seguintes comandos e ações são desabilitados: Utilizar o comando cd para alterar o diretório.
Alterar os valores das variáveis de ambiente $PATH, $SHELL, $BASH_ENV ou $ENV. Ler ou alterar opções do shell ($SHELLOPTS). Redirecionar a saída. Executar comando contendo uma ou mais barras (/). Chamar exec para substituir o shell por um processo diferente. #!/bin/bash # Iniciando o script com "#!/bin/bash -r" # executa todo o script em modo restrito echo echo "Mudando o diretorio." cd /usr/local echo "Agora em `pwd`" echo "Voltando para o home." cd echo "Agora em `pwd`" echo # Até aqui tudo normal, estamos em modo n restrito set -r echo "==> Agora em modo restrito. <==" echo echo "Tentando mudar o diretório em modo restrito." cd .. echo "Ainda em in `pwd`" echo echo "\$SHELL = $SHELL" echo "Tentando mudar o shell em modo restrito."
SHELL="/bin/ash" echo echo "\$SHELL = $SHELL" echo echo "Tentando redirecionar a saída em modo restrito." ls -l /usr/bin > bin.files ls -l bin.files echo exit 0 Aplicação Prática Teórica Estudo dirigido: leitura do capítulo 15 do livro "Classic Shell Scripting".