Configurando Apache em ambiente chroot

Este artigo foi extraido do site Underlinux.com.br:

Rodando o Apache em Chroot
Enviado em Domingo, 27 de mar?o 2005 as 11:32:21
Rodar o Apache em Chroot ? uma outra forma de melhorar a seguran?a de sua m?quina. Porque? Imagine que de ultima hora descubram um bug remoto no Apache, e esse bug pode ser explorado e com isso o atacante obtenha acesso privilegiado no sistema (root)! Com toda certeza algum dano ele vai causar na m?quina, mas se ele estiver rodando dentro de uma “jaula” chroot, na pior das hipoteses ele vai conseguir destruir apenas as p?ginas, e nao vai comprometer o servidor inteiro.

Isso ? ?timo n?o ? mesmo? Sim, mas como tudo, tamb?m tem sua desvantagem, configurar o Apache para rodar assim ? bem complicado.
Por isso estou fazendo essa “receita de bolo” para voc?s.

Antes de mais nada existem dois pontos a serem salientados:
1 – N?o vou ensinar a compilar o apache, j? existem milhares de tutoriais para isso, e pode ser que meu m?todo de compila??o n?o agrade a todos 😉
2 – Vou usar como base o meu sistema, ent?o pode ser que no seu caso, ao inv?s dos arquivos estarem em /etc/httpd/ eles estejam em /etc/apache.

Agora vamos por a mao na massa:

Caso seu apache j? n?o tenha usu?rio e grupo pr?prios, crie da seguinte maneira:
# groupadd apache
# useradd -c “Apache Server” -d /dev/null -g apache -s /bin/false apache

Vamos criar a estrutura de diret?rio necess?ria. Se voc? tiver uma parti??o separada para rodar o chroot, melhor ainda.
# mkdir /chroot/httpd
# mkdir /chroot/httpd/dev
# mkdir /chroot/httpd/lib
# mkdir /chroot/httpd/etc
# mkdir /chroot/httpd/usr
# mkdir /chroot/httpd/usr/sbin
# mkdir /chroot/httpd/usr/lib
# mkdir /chroot/httpd/usr/libexec
# mkdir -p /chroot/httpd/var/run
# mkdir /chroot/httpd/var/www/
# mkdir -p /chroot/httpd/var/log/httpd
# mkdir -p /chroot/httpd/home/httpd

Agora vamos acertar as permiss?es:
# chown -R root /chroot/httpd
# chmod -R 0755 /chroot/httpd
# chmod 750 /chroot/httpd/var/log/httpd/
# chmod 750 /chroot/httpd/home/httpd/

Agora alguns devices necess?rios para o Apache:
# mknod /chroot/httpd/dev/null c 1 3
# chown root.sys /chroot/httpd/dev/null
# chmod 666 /chroot/httpd/dev/null

O device null ? necess?rio porque dentro da jaula chroot, o Apache ir? entender o /chroot/httpd como sendo a raiz do sistema /. Ou seja, ele n?o teria acesso ao /dev/null normal do sistema.

Agora vem a parte mais complicada, vamos copiar os arquivos necess?rios
Primeiro pare o apache, como falei anteriormente pode ser que alguns diret?rios na minha m?quina sejam diferente dos da sua, ent?o n?o use CTRL+C CTRL+V, LEIA!
Primeiro copiamos os arquivos de configura??o:
# cp -r /etc/httpd/ /chroot/httpd/etc/

Agora as paginas e os scripts cgi:
# cp -r /var/www/html/ /chroot/httpd/var/www/
# cp -r /var/www/cgi-bin/ /chroot/httpd/var/www/

Agora os bin?rios do Apache e seus scripts
# cp /usr/sbin/httpd /chroot/httpd/usr/sbin/
# cp /usr/sbin/apache* /chroot/httpd/usr/sbin/

Se voc? utiliza o mod_ssl, copie este diret?rio tamb?m:
# cp -a /etc/ssl /chroot/httpd/etc/

Copie os modulos da sua instala??o original:
# cp -r /usr/lib/apache/ /chroot/httpd/usr/lib/
ATEN??O, pode ser que na sua m?quina esses arquivos estejam em /usr/libexec/apache, edite seu httpd.conf e veja onde ficam as libs.

Depois de ter copiado todos os arquivos do apache, precisamos descobrir quais s?o as libs externas que o apache necessita, para isso execute:
# ldd /chroot/httpd/usr/sbin/httpd
No meu caso ele retornou isso:

libssl.so.0.9.7 => /usr/lib/libssl.so.0.9.7 (0xb7fae000)
libcrypto.so.0.9.7 => /usr/lib/libcrypto.so.0.9.7 (0xb7ea7000)
libaprutil-0.so.0 => /usr/lib/libaprutil-0.so.0 (0xb7e93000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0xb7e74000)
libapr-0.so.0 => /usr/lib/libapr-0.so.0 (0xb7e53000)
librt.so.1 => /lib/librt.so.1 (0xb7e4a000)
libm.so.6 => /lib/libm.so.6 (0xb7e27000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0xb7df8000)
libnsl.so.1 => /lib/libnsl.so.1 (0xb7de3000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7dd1000)
libdl.so.2 => /lib/libdl.so.2 (0xb7dcd000)
libc.so.6 => /lib/libc.so.6 (0xb7cb7000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7fe9000)

Agora temos que copiar todas essas libs que ele retornou do comando ldd:
# cp /usr/lib/libssl* /chroot/httpd/lib/
# cp /usr/lib/libcrypt* /chroot/httpd/lib/
# cp /usr/lib/libapr* /chroot/httpd/lib/
# cp /lib/librt* /chroot/httpd/lib/
# cp /lib/libm* /chroot/httpd/lib/
# cp /lib/libnsl* /chroot/httpd/lib/
# cp /lib/libpthread* /chroot/httpd/lib/
# cp /lib/libdl* /chroot/httpd/lib/
# cp /lib/libc.so.6 /chroot/httpd/lib/
# cp /usr/lib/libexpat* /chroot/httpd/lib/
Tamb?m s?o necess?rias algumas libs para funcionalidades de rede:
# cp /lib/libnss_compat* /chroot/httpd/lib/
# cp /lib/libnss_dns* /chroot/httpd/lib/
# cp /lib/libnss_files* /chroot/httpd/lib/

Para que o Apache execute normalmente, s?o necess?rios varios arquivos do /etc, primeiro vamos mexer nos arquivos de senha e grupo, elas devem conter apenas os valores para o usu?rio apache, por exemplo:
# cp /etc/passwd /chroot/httpd/etc/
# cp /etc/group /chroot/httpd/etc
Edite esses arquivos e remova tudo que n?o for do apache, deve ficar algo parecido com isso:
/chroot/httpd/etc/passwd:
apache:x:1005:105:Apache Server:/dev/null:/bin/false
/chroot/httpd/etc/group:
apache:x:105:
Depois copie os arquivos de rede:
# cp /etc/hosts /chroot/httpd/etc/
# cp /etc/resolv.conf /chroot/httpd/etc/
# cp /etc/nsswitch.conf /chroot/httpd/etc/

Se voc? utiliza sistema de arquivos ext2 ou ext3 voc? aumentar ainda mais a seguran?a com o chattr, se quiser saber mais detalhes sobre o chattr, leia meu outro artigo: Protegendo Arquivos Contra Desastres
# chattr +i /chroot/httpd/etc/hosts
# chattr +i /chroot/httpd/etc/resolv.conf
# chattr +i /chroot/httpd/etc/nsswitch.conf
# chattr +i /chroot/httpd/etc/passwd
# chattr +i /chroot/httpd/etc/group

Para que os arquivos de log sejam gravados com a data correta, voc? precisa do arquivo /etc/localtime.
# cp /etc/localtime /chroot/httpd/etc

Crie os arquivos de log necess?rios:
# touch /chroot/httpd/var/log/httpd/access_log
# touch /chroot/httpd/var/log/httpd/error_log
# chmod 600 /chroot/httpd/var/log/httpd/*

Altera tamb?m o syslog para gravar o que acontece dentro do chroot tb, no meu script de inicializacao do syslog estava assim:
loadproc syslogd $SYSLOGD_OPTIONS
mudei para isso:
loadproc syslogd $SYSLOGD_OPTIONS -a /chroot/httpd/dev/log

E para finalizar, altere o script de inicializa??o do apache para executar dentro do chroot. Dependendo da sua ditro fica em /etc/rc.d/rc.apache ou /etc/rc.d/init.d/apache. Altere o comando para executar o /usr/sbin/chroot /chroot/httpd/ /usr/sbin/apache ou inv?s de /usr/sbin/apachectl.

Testando o servidor
Para testar se todas as libs necess?rias foram copiadas, execute:
/usr/sbin/chroot /chroot/httpd/ /usr/sbin/apachectl -k restart
Se tiver faltando alguma ele vai mostrar, ai basta voc? copiar a lib para dentro do chroot
Para ter certeza que o apache est? rodando dentro do chroot e nao fora pegue o PID do apache com o ps ax | grep apache e execute:
ls -la /proc/PID/root/
Isso deve mostrar a estrutura de diret?rios do chroot:
dev
etc
home
lib
usr
var

Posted in Sem categoria

Exemplo de script de firewall para Netfilter Iptables

SCRIPT DE FIREWALL
=============

# !/bin/bash
# Script do Firewall / Gateway de Internet
# Utilizando iptables e squid

# Script iniciada automaticamente atraves do link simbolico em:
# /etc/rc.d/init.d/firewall -> chamado atraves do servico IPTABLES

# Fazendo Flush
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Carregando os Modulos do Kernel
#modprobe ip_tables
#modprobe ipt_LOG

# Variaveis do firewall
CONFIAVEL1=192.168.0.30
CONFIAVEL2=192.168.0.50
REDEMASQ=192.168.0.0/24

# Pol?ica Padr? de Acesso
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -s $REDEMASQ -p tcp –dport 3128 -j ACCEPT
#iptables -A INPUT -s $REDEMASQ -p tcp –dport 8080 -j ACCEPT
iptables -A INPUT -s $REDEMASQ -p tcp –dport 53 -j ACCEPT
iptables -A INPUT -s $REDEMASQ -p udp –dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –dport 111 -j DROP
iptables -A INPUT -i eth0 -p tcp –dport 3128 -j DROP
# Habilitando a prote?o contra “TCP SYN COOKIES”
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Ocultando a rota de origem dos pacotes (evita spoof)
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done

# Evita atques de spoof (na rede interna)
# Em alguns casos de roteamento esta linha dever?ser desativada

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done

# Permisses de acesso ao firewall
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
# Permite acesso de SSH via Internet
iptables -A INPUT -i eth0 -p tcp –dport 2222 -j ACCEPT

# Trocando o intervalo de portas locais
PORT_INI=61000
PORT_FIM=65095
echo $PORT_INI $PORT_FIM > /proc/sys/net/ipv4/ip_local_port_range

# Criando perfil de acesso administrativo (apenas por SSH)
iptables -N ADMIN
iptables -A ADMIN -i eth1 -p tcp –dport 2222 –syn -j LOG –log-level info
–log-prefix “[Acesso Admin]: “
iptables -A ADMIN -i eth1 -p tcp –dport 2222 –syn -j ACCEPT

iptables -A ADMIN -i eth0 -p tcp –dport 2222 –syn -j LOG –log-level info
–log-prefix “[Acesso Admin EXTERNO]: “
iptables -A ADMIN -i eth0 -p tcp –dport 2222 –syn -j ACCEPT

# Aplicando a permiss? de acesso ssh a CONFIAVEL 1 e 2
iptables -A INPUT -i eth1 -s $CONFIAVEL1 -j ADMIN
iptables -A INPUT -i eth1 -s $CONFIAVEL2 -j ADMIN

# Para tratar as quedas dos roteadores ADSL
GW=`route | grep default | awk ‘{print $2}’`
iptables -A INPUT -i eth0 -s 200.204.179.228 -p tcp ! –syn -j ACCEPT

# Compartilhando o acesso ?Internet
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s $REDEMASQ -o eth0 -j MASQUERADE
#PROXY TRANSPARENTE
iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j REDIRECT
–to-port 3128

# Permitindo requisi?es de DNS
iptables -A FORWARD -o eth0 -s $REDEMASQ -p tcp –dport 53 -j ACCEPT
iptables -A FORWARD -o eth0 -s $REDEMASQ -p udp –dport 53 -j ACCEPT

# Bloaquear pacotes com estado “novo/inv?ido” que saiam pela eth1
# Permitir pacotes com estado “estabelecido/reinicidente”
iptables -A FORWARD -o eth1 -m state –state NEW,INVALID -j DROP
iptables -A FORWARD -o eth1 -m state –state ESTABLISHED,RELATED -j ACCEPT

# Permitindo qualquer solicita?o de Internet que parta da rede
192.168.0.0/24
iptables -A FORWARD -i eth1 -s $REDEMASQ -j ACCEPT

# Bloqueia qualquer pacote (forward) que n? liberado por regras anteriores
iptables -A FORWARD -j DROP

# Bloqueando o logando sinais de ping ao firewall
iptables -N LPI
iptables -A LPI -m limit –limit 5/hour –limit-burst 3 -p icmp –icmp-type
echo-request -j LOG –log-level info –log-prefix “Log ping: “
iptables -A LPI -j REJECT –reject-with icmp-port-unreachable
iptables -A INPUT -p icmp –icmp-type echo-request -j LPI

# Bloqueia qualquer pacote (input) que n? liberado por regras anteriores
iptables -A INPUT -j DROP

Posted in Sem categoria

Transformando seu Linux em um roteador

Este artigo foi tirado do site Dicas-L da Unicamp
Colabora??o: Rodrigo Klein Santos

O Zebra ? um projeto Open Source, que transforma seu linux praticamente em um router cisco, ou seja, ele te d? a op??o de configurar sua rede por uma interface identica a dos roteadores cisco, inclusive administrando protocolos avan?ados de roteamento como RIP, OSPF e BGP, de maneira facil e r?pida.

De inicio vamos abranger apenas a parte de instala??o e configura??o b?sica do zebra.

Para que voc? tire maior proveito do Zebra, ? bom ir se familiarizando com os comando da fam?lia Cisco.

Vamos l?…

Primeiro baixe o pacote Zebra

[root@saopaulo install]# wget ftp://ftp.zebra.org/pub/zebra/zebra-0.94.tar.gz

Descompactando.

[root@saopaulo install]# tar -zxvf zebra-0.94.tar.gz

Com isso criamos o diret?rio zebra-0.94

Vamos entrar nele.

[root@saopaulo install]# cd zebra-0.94

Execute na sequencia,

[root@saopaulo zebra-0.94]# ./configure –with-mib-modules=smux
[root@saopaulo zebra-0.94]# make
[root@saopaulo zebra-0.94]# make install

Feito isso, vamos criar o arquivo de configura??o do zebra.

Crie o arquivo: /usr/local/etc/zebra.conf

com o seguinte conte?do.

!
! Zebra configuration saved from vty
! 2008/02/04 20:04:45
!
hostname Router
password zebra
enable password zebra
!
interface lo
!
interface eth0
!
interface eth1
!
!
line vty
!



Em /etc/rc.d/init.d

Crie o script zebra

Feito isso.

[root@saopaulo zebra-0.94]# chmod 755 /etc/rc.d/init.d/zebra

[root@saopaulo zebra-0.94]# /etc/rc.d/init.d/zebra start
Iniciando Zebra : [ OK ]
[root@saopaulo zebra-0.94]#

Agora vamos acessar o zebra. Ele abre uma porta de comunica??o com o protocolo telnet, porta 2601

[root@saopaulo zebra-0.94]# telnet 127.0.0.1 2601
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.

Hello, this is zebra (version 0.94).
Copyright 1996-2002 Kunihiro Ishiguro.

User Access Verification

Password:
Router> en
Password:
Router#

A senha padr?o que vem no conf ? ‘zebra’, mude-a depois.

Existem duas senhas, uma padr?o para acesso via rede (VTY) e uma segunda que ? a do ‘enable’ (root no cisco)…

Voc? pode abreviar quase tudo, o comando ‘enable’ por exemplo pode-se usar como ‘en’.

Agora basta voc? executar os mesmos comandos de um router Cisco..

Exemplos.


Router# sh run

Current configuration:
!
hostname Router
password zebra
enable password zebra
!
interface lo
!
interface eth0
!
interface eth1
!
!
line vty
!
end
Router#

< \zebra>

Router# conf t
Router(config)# int eth0
Router(config-if)# ip address 10.0.0.1/8 secondary


Router(config)# wr m
Router# exit

< \zebra>

Agora vamos ver como ficou a interface do Linux…

[root@saopaulo zebra-0.94]# ip a
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:01:03:d7:f5:cb brd ff:ff:ff:ff:ff:ff
inet 172.16.0.1/24 brd 172.16.0.255 scope global eth0
inet 10.0.0.1/8 brd 10.255.255.255 scope global eth0

Notem que o novo IP 10.0.0.1 que configuramos pelo zebra e j? apareceu na configura??o do sistema.

Bom, basicamente ? isso, vale a pena dar uma boa lida na documenta??o, para saber os comandos e m?os a obra, aproveite as vantagens que o zebra proporciona em termos de facilidade de configura??o e boa sorte.

Posted in Sem categoria

Mrxvt um terminal r?pido e com v?rias op??es.

Artigo tirado do site Dicas-L da Unicamp

Colabora??o: Edosn A. Dezounet

O mrxvt ? um terminal com suporte a v?rias tabs, em cada tab ? poss?vel iniciar com um comando e um nome diferente. Voc? pode baixar o pacote ou compilar o c?digo fonte de acordo com as suas prefer?ncias. Caso voc? opte por instalar o pacote a quantidade m?xina de “tabs” que poder?o ser abertas ? de 10.

Site do projeto: http://materm.sourceforge.net/

Algumas op??es:

* Modo reverso. Terminal preto com letras brancas.

-rv

* Para ficar com o fundo 100% transparente.

-tr

* Para indicar a pocentagem da tranpar?ncia.

-tr -bgfade 80%

* Coloca a barra de rolagem na direita.

-sr

* Barra de rolagem transpar?nte.

-trs

* Tamanho da fonte que ser? utilizada.

-fn 9×15

* Titulo da jenela principal.

-title “Titulo”

* Tamanho inicial do terminal.

-g 100×60

* Voc? pode escolher cores para o texto e para o fundo.
* Cor do fundo. Caso esteja habilitado a tranpar?ncia ele n?o ter? efeito.

-bg black

* Cor do texto.

-fg cyan

* Cor do cursor, escolha a sua cor preferida.

-cr red

* N?mero de terminais que ser?o abertos no inicio do Mrxvt.

-tnum 4

* Titulo de todas as tabs abertas:

-tt titulo

* Mudando o titulo das tabs.

Selecione o texto e pressione “shift+del”

* Navegando entre as tabs.

Shift + seta direcional para a esquerda ou direita
Ctrl + “Page Up/PageDown”

* Abrindo novas tabs.

Crtl + Shift + t

* Exemplos:
* Mrxvt com duas tabs, cada tab com um nome diferente.

mrxvt -tnum 2 -vt0.tt “Terminal 1” -vt1.tt “Terminal 2”

* Mrxvt com duas tabs, cada uma iniciando com um comando direfente:

mrxvt -tnum 2 -vt0.ss “top” -vt1.ss “ssh usuario@servidor.com.br”

* Reverso, com tranpar?ncia em %, tamanho da fonte, titulo da janela, titulo igual para todas as tabs.

mrxvt -rv -tr -bgfade 80% -sr -fn 9×15 -title “Terminal Mrxvt” -g 100×60 -cr red -tnum 4 -tt Linux

Posted in Sem categoria

Iniciando o Kurumin(Sem Instalar) usando o boot.ini do Windows XP/2000

Artigo tirado do site Dicas-L da Unicamp

Colabora??o: Fernando Braz de Souza

Devido a uma duvida postada no ForumWeb resolvi procurar uma maneira de fazer com que o sistema, desse boot em um CD do Kurumin copiado para o hd. Depois de varias tentativas e perder a area de boot do XP, consegui uma maneira de fazer isso.

A solu??o foi chamar o GRUB pelo c:\boot.ini

Vamos ao passo-a-passo:

1) Baixe uma imagem ISO do kurumin, ou pegue um cd do kurumin e copie a pasta KNOPPIX para uma parti??o fat. Caso voc? tenha a imagem ISO sera necessario usar ou o winrar, ou o winiso, ou outro programa de sua prefer?ncia para copiar a pasta KNOPPIX.

2) Crie um disco de boot da imagem boot.img, e copie todo o conteudo do disco para a pasta KNOPPIX do hd. Obs.:No windows utilize o rawwritewin.exe, e no linux utilize como root o comando:

dd if=/mnt/cdrom/KNOPPIX/boot.img of=/dev/fd

3) Baixe o GRUB para o windows em http://www.geocities.com/lode_leroy/grubinstall/

4) Depois descompacte o arquivo zip dentro da pasta c:\boot

5) Crie um arquivo c:\boot\menu.lst com o seguinte conteudo

default 0
fallback 1
timeout 30
title Kurumin
root (hd0,0)
kernel /knoppix/vmlinuz
initrd /knoppix/miniroot.gz
boot

No meu caso a pasta knoppix est? na disco 0 parti??o 0 (hd0,0) . Caso o seu knoppix esteja no disco 0 e na primeira unidade l?gica da parti??o estendida vai ser (hd0,4).

6) abra um prompt do DOS e entre na pasta c:\boot e digite

grubinstall -d (hd0,0) -1 C:\boot\stage1 -2 C:\boot\stage2

7) Edite o arquivo c:\boot.ini colocando o timeout=30 e adicionando a linha abaixo no final do arquivo.

c:\boot\stage1=”GRUB”

8) Agora ? s? reiniciar e testar.

9) Vantagens:

* Permitir que n?o tem gravador de CD utilizar o kurumin.
* ? mais Rapido do que rodando direto do cd.
* O Drive de CDROM fica livre. Obs.: O /dev/cdrom n?o ? um link para o dispositivo de cdrom e sim para a parti??o onde esta a pasta knoppix.

Esse passo-a-passo foi testado no windows XP com parti??o FAT32. Como o bootloader do Windows 2000 ? o mesmo do Windows XP, ent?o o mesmo dever? funcionar perfeitamente no w2k com parti??o FAT32. Quem testar e conseguir fazer o procedimento em parti??es NTFS poderia me enviar um email dizendo que conseguiu.

Posted in Sem categoria

Curso de Shell

Curso de Shell – Aula IV
Por: Alex Borro ( 10/04/2001 )

Nesta aula vamos aprender sobre comandos de la?o como o while, for, case e select. Eles nos permitem executar alguns comandos diversas vezes, sob determinadas condi??es e at? montar menuzinhos para interagir com o usu?rio.

While

Este ? provavelmente o comando de la?o mais utilizado em programa??o. Seu entendimento ? simples. Ele testa uma condi??o (como faz o IF) e executa um conjunto de comandos se esta condi??o for verdadeira. Ap?s a execu??o desses comandos, ele torna a testar a condi??o e se esta for verdadeira, ele reexecuta os comandos e assim por diante.

Sua sintaxe ? a seguinte:

while [ condi??o ];
do
comando 1;
comando 2;

done;

O par?metro [ condi??o ] funciona exatamente igual ao do IF. N?o voltarei a abortar os par?metros condicionais pois eles j? foram explicados na aula 3. Em caso de d?vida sobre isso, uma r?pida revis?o na aula 3 ? suficiente.

Bom, vamos ao exemplo mais simples do While: um contador.

x = 0
While [ “$x” -le 10 ];
do
echo “Execu??o n?mero: $x”?;
x = $((x+1));
done;

Analisando:

Na primeira linha temos a condi??o: enquanto o valor da vari?vel x ( $x ) for menor-igual ( -le ) a 10, fa?a: mostre “Execu??o n?mero: ” e o valor de x ($x). Fa?a x = x + 1. Isso no bash ? feito pelo comando $(( )). Ele realiza opera??es alg?bricas com vari?veis. No caso acima, estamos somando x + 1 e colocando o resultado no pr?prio x.

Preste aten??o, que as linhas do While precisam de um “;” para terminar, exceto a que cont?m o “do”, pois ele representa o come?o do bloco de comandos.

Quando executamos o script acima, temos uma contagem de 1 at? 10:

neo@matrix:~$ x=0; while [ “$x” -lt 10 ]; do x=$((x+1)); echo
“Execu??o n?mero: $x”; done;
Execu??o n?mero: 1
Execu??o n?mero: 2

Execu??o n?mero: 10
neo@matrix:~$

O While tem muita utilidade em programa??o, mas fica dif?cil dar exemplos usando somente ele, pois geralmente ele est? associado a execu??o de outros programas e rotinas mais complexas.

Eu costumo usar ele, por exemplo, quando quero que o napster fique tentando conectar, pois quando ele vai tentar conectar o servidor e n?o consegue, ele simplesmente termina. Ai eu coloco o while testando a c?digo de retorno dele (lembram da vari?vel $? ) e enquanto estiver diferente de zero (o napster terminou com erro), ele fica executando o napster:

? = 1; while [ “$?” -ne “0” ]; do ./nap; done;

O comando “? = 1” tenta atribuir 1 a vari?vel ?. Isso provoca um erro, pois a vari?vel ? ? somente de leitura. Isso ? necess?rio para que ? Contenha algo diferente de 0, pois sen?o o While n?o executa a primeira intera??o.

For

O for ? semelhante ao while usado como um contador. ? necess?rio fornecer uma lista de nomes e ele executa os comandos para cada nome na lista. Parece meio confuso, mas ? simples. Veja a sintaxe:

for in ;
do
comandos
done;

O For associa o primeiro item da lista de nomes ? vari?vel e executa os comandos. Em seguida, associa novamente o segundo item da lista ? e executa novamente os comandos… e assim por diante, at? acabar a lista.

Veja o exemplo:

neo@matrix:~$ for x in Compra Venda Aluguel; do echo $x; done;
Compra
Venda
Aluguel

Ou seja, primeiro ele coloca “Compra” na vari?vel x e executa os comandos, no caso, “echo $x”, e assim por diante.

Podemos facilmente implementar um contador, usando em conjunto com o for, o programinha “seq”. Ele simplesmente gera uma seq??ncia de n?meros. Por exemplo, “seq 10” gera uma seq??ncia de 1 at? 10. Assim, podemos us?-lo no for:

for x in $(seq 10); do echo $x; done;

Esse comando ? semelhante ao contador implementado com o While. Primeiro o x vale 1 e o for executa os comandos. Depois x vale 2 e ele reexecuta os comandos…

Vamos usar o For para renomear os arquivo de um diret?rio, mudando todos os arquivo terminados em “.mp3” para “.mp3.bak”.

for x in *; do
mv “$x” “${x}.bak”;
done;

for x in *.mp3; do
if [ -e “$x” ];
then mv “$x” “${x}.bak”;
fi;
done;

No local de nos colocamos “*.mp3”. Isso diz ao bash para expandir (transformar) ele na lista de arquivos terminados com “.mp3”. Sen?o houver nenhum arquivo com essa termina??o, o bash n?o faz nada, ficando para o for a string “*.mp3”. Por isso precisamos do IF para testar se o arquivo existe.

Experimente no seu sistema.

echo *.mp3

Vai mostrar os arquivos no diret?rio atual com termina??o mp3, mas sem quebra de linha entre eles, ou seja, um nome ap?s o outro. Se n?o houver nenhum arquivo com termina??o mp3, ele apenas vai mostrar “*.mp3”.

Bom, voltando ao For, ele vai atribuir a “x” cada nome na lista de arquivos com termina??o “.mp3” e executar os comandos seguintes.

Primeiro ele testa para ver se o arquivo existe ( if [ -e “$x” ]; ), e se existir, renomeia ele para o seu pr?prio nome acrescido de “.bak” ( ${x}.bak ).

Resumindo, o For faz isso: voc? fornece uma lista de nomes para ele e ele vai atribuindo esses nomes, em ordem e um por vez, ? vari?vel e executa os comandos entre o “do” e o “done;”.

Case

O Case est? mais para um comando condicional do que para comando de la?o, visto que ele n?o executa “loopings” como o While e o For.

Ele geralmente ? utilizado como substitui??o de v?rios IFs.. Um exemplo cl?ssico e muito utilizado ? quando voc? precisa testar um par?metro fornecido na linha de comando. O Case ? utilizado desta forma em scripts de inicializa??o de servi?os do sistema.

Vou mostrar a sintaxe em em seguida um script que inicialize/ reinicialize ou pare algum servi?o (como o sendmail, apache, bind, etc).

Sintaxe:

case in

)

;;

[op??o 2] )

;;
* )
< comandos se n?o for nenhuma das
op??es >
;;
esac

Vamos as explica??es. O Case pega a string fornecida em e compara com . Se forem iguais, ele executa e sai fora. Caso contrario, ele compara com e assim por diante.

Caso n?o seja igual a nenhuma das op??es, ele executa os comandos da op??o “*”, se este existir.

Prestem aten??o a alguns detalhes na sintaxe. Deve existir um “)” ap?s cada op??o e tamb?m um “;;” ap?s todos os comandos de cada op??o. Vejam o exemplo abaixo:

case “$1” in

‘start’ )
echo “Iniciando o servi?o…”

;;
‘restart’ )
echo “Reinicializando o servi?o…”

;;
‘stop’ )
echo “Parando o servi?o…”

;;
*)
echo “Op??o invalida!”
echo “As op??es v?lidas s?o:
start, stop e restart”
;;
esac

O Case serve exatamente para isso, ou seja, evitar o teste de v?rios Ifs. No caso acima, ter?amos que utilizar 3 Ifs. Mesmo se o primeiro j? fosse verdadeiro, o bash iria testar o segundo e o terceiro, ou seja, ia perder tempo desnecessariamente. J? no case isso n?o acontece. Ap?s entrar em uma op??o e executar seus comandos, ele j? pula fora do case sem testar as outras op??es abaixo.

Select

O Select ? um comando de la?o que nos permite mostrar um pequeno menuzinho de op??es para o usu?rio. Cada op??o possui um n?mero e para escolher, o usu?rio digita o n?mero correspondente a op??o desejada. Vejamos a sintaxe a seguir:

select in ;
do

done;

Como disse acima, o select vai mostrar as op??es contidas em , uma por linha, com um n?mero na frente e espera que o usu?rio digite a op??o desejada. Ao digitar a op??o, o select atribui o nome da op??o a vari?vel e executa os comandos. Para sair do select, ? necess?rio executar o comando “break”. Vamos a um exemplo:

select x in Iniciar Reiniciar Parar Sair; do
echo “Op??o Escolhida: $x”
if [ “$x” == “Sair” ]; then break; fi;
done;

Ou seja, se o usu?rio escolher alguma op??o diferente de “Sair”, o script apenas escreve a op??o. Se for escolhida Sair, ele mostra a op??o, entra no IF e executa o break, saindo do select.

? interessante combinar o Select com o Case. Vamos mostrar como ficaria aquele exemplo do case, de iniciar um servi?o, utilizando o Select, para tornar o script interativo:

select x in Iniciar Reiniciar Parar Sair; do

case “$x” in
‘Iniciar’ )
echo ” Iniciando o
servi?o…”
;;
‘Reiniciar’ )
echo ” Reinicializando o
servi?o…”
;;
‘Parar’ )
echo ” Parando o servi?o…”
;;
‘Sair’ )
echo ” Script encerrado.”
break
;;
*)
echo ” Op??o
inv?lida!”
;;
esac
done;

Primeiramente o Select mostra um menuzinho:

1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#?

Quando o usu?rio digitar um n?mero de op??o, o select executa o case e este compara a vari?vel x com suas op??es. Se achar alguma, executa seus comandos, no caso um echo. Se o usu?rio escolher Sair, al?m do echo, ele executa o “break”, que interrompe o select:

neo@matrix:~/test$ ./t
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 1
Iniciando o servi?o…
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 5
Op??o inv?lida!
1) Iniciar
2) Reiniciar
3) Parar
4) Sair
#? 4
Script encerrado.
neo@matrix:~/test$

Bom pessoal, acho que por hoje ? s?. 😉 Espero que voc?s tenham pego a id?ia de como funciona comandos de la?os. Pelos menos sabendo a utilidade, sintaxe e como funcionam, quando surgir a necessidade, voc?s j? v?o saber quais ferramentas usar.

Qualquer d?vida, sugest?o, etc, podem me enviar um e-mail. Terei o maior prazer em responder. At? a pr?xima aula!

Copyright (C) 1999-2000 Linux Solutions

Posted in Sem categoria