Índice das dicas

Criando um script para ativar a rede wireless

Criado 4/out/2007 às 11h28 por Carlos E. Morimoto

1

Hoje em dia, quase todas as distribuições incluem utilitários para configurar a rede wireless. O Ubuntu, por exemplo, inclui o network-manager, o Kubuntu inclui o knetworkmanager (uma variação dele), o OpenSuSE inclui opções dentro do Yast e assim por diante. Isso faz com que, na maioria dos casos, configurar a rede wireless seja bastante simples.

Apesar disso, existem sempre casos em que os utilitários de configuração não funcionam como deveriam, casos onde você está usando alguma distribuição onde eles não estão disponíveis ou simplesmente casos em que você resolveu colocar a mão na massa e fazer as coisas manualmente.

Nesta dica vamos ver como criar um script de conexão, para acesso a redes wireless com encriptação via WPA, que inclui funções para detectar erros comuns e pode ser executado durante o boot, automatizando a ativação da rede. Ela inclui também dicas diversas sobre shell script.

Para usá-lo é necessário que a placa wireless tenha sido detectada pelo sistema e o pacote "wpasupplicant" (necessário para conectar a redes com encriptação WPA) esteja instalado.

O primeiro passo é criar o arquivo de configuração do wpa_supplicant (note que o comando é diferente do nome do pacote), que contém o ESSID e a chave de autenticação da rede onde ele deve se conectar. Para isso, use o comando:

# wpa_passphrase minharede passphrase > /etc/wpa_supplicant.conf

Como em:

# wpa_passphrase casa 12345678 > /etc/wpa_supplicant.conf

O (criado automaticamente) arquivo ficará assim:

network={
ssid="casa"
#psk="12345678"
psk=bedc07580f71c85d6e0029f3663bab5cbe0720cc84bf94eb7c20722208b7f004
}

Como você pode ver, a terceira linha contém a passphrase da rede em modo texto, o que não é nada bom do ponto de vista da segurança. Apesar disso, ele não é necessária (tanto que está comentada) pois a linha seguinte contém um hash, que é suficiente para que a conexão seja efetuada. É sempre recomendável que você edite o arquivo e apague a terceira linha, deixando apenas o hash.

Com isso, precisamos apenas ativar o wpa_supplicant, usando o comando:

# wpa_supplicant -i eth1 -c /etc/wpa_supplicant.conf -d -D wext

O "eth1" no comando indica a interface de rede, e naturalmente deve ser alterado conforme necessário. O "wext" é o driver (interno do wpa_supplicant) que será usado. Atualmente, o wext é usado em quase todos os casos, inclusive no caso de placas configuradas através do ndiswrapper. A única exceção fica por conta das placas com chipset Atheros, onde você deve substituir o "wext" por "madwifi".

Se a conexão for bem-sucedida, você terá (depois de uma rápida sucessão de mensagens), algo como:

State: GROUP_HANDSHAKE -> COMPLETED
CTRL-EVENT-CONNECTED - Connection to 00:50:50:81:81:01 completed (auth)
EAPOL: External notification - portValid=1
EAPOL: External notification - EAP success=1
EAPOL: SUPP_PAE entering state AUTHENTICATING
EAPOL: SUPP_BE entering state SUCCESS
EAP: EAP entering state DISABLED
EAPOL: SUPP_PAE entering state AUTHENTICATED
EAPOL: SUPP_BE entering state IDLE
EAPOL: startWhen --> 0

Estas mensagens indicam que ele se conectou ao ponto de acesso com o endereço MAC "00:50:50:81:81:01" e que a conexão está disponível para transmitir dados.

Para confirmar, rode o comando "iwconfig" que mostrará algo como:

# iwconfig
lo no wireless extensions.
eth0 no wireless extensions.
eth1 IEEE 802.11g ESSID:"casa"

Mode:Managed Frequency:2.447 GHz Access Point: 00:50:50:81:81:01
Bit Rate=54 Mb/s Tx-Power:32 dBm
RTS thr=2347 B Fragment thr=2346 B
Encryption key:
Security mode:restricted
Power Management:off
Link Quality:65/100 Signal level:-54 dBm Noise level:-96 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0

Isso significa que ele se conectou com sucesso ao ponto de acesso. Falta agora apenas fazer a configuração manual da rede, o que pode ser feito usando os comandos "ifconfig" e "route". Note que estou usando os comandos manuais, pois a idéia é justamente que possamos transformá-los em um script mais tarde.

# ifconfig eth1 192.168.1.65 netmask 255.255.255.0 up
# route del default
# route add default gw 192.168.1.1 dev eth1
# echo 'nameserver 208.67.222.222' > /etc/resolv.conf

Nesses 4 comandos eu configurei a rede, especificando o endereço IP e a máscara, removi a rota padrão (só para garantir, já que em um micro com duas placas de rede é normal que a primeira fique como rota padrão e você não consiga navegar através da segunda), configurei o gateway padrão da rede, colocando a rota padrão na interface wireless (eth1) e aproveitei para colocar o endereço do DNS no arquivo /etc/resolv.conf.

Com isso, a rede estaria configurada. Vamos então à criação do script.

Como a idéia é que ele seja executado durante o boot, vamos colocá-lo na pasta /etc/init.d", onde ficam os scripts de configuração do sistema. Vou chamá-lo de "/etc/init.d/wireless".

Vamos começar "limpando a casa", para ter certeza de que o script encontrará um ambiente previsível. Estes passos são opcionais e você pode incluir outros comandos que achar necessários:

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down
Desativa o cliente dhcp
killall dhclient3

O network-manager, usado no Ubuntu "sabota" a configuração manual, por isso é necessário desativá-lo usando os dois comandos. No caso do Kubuntu, é necessário também desativar o knetworkmanager dentro do ambiente gráfico, desmarcando o início automático nas configurações do programa.

Um problema comum em scripts de configuração da rede é que pode acontecer da interface de rede mudar ao reiniciar o sistema ou ao instalar uma nova placa de rede. Se o script espera que a placa wireless seja a "eth1" e a muda para "eth2", o script deixa de funcionar.

Podemos tornar o script mais inteligente, detectando sozinho qual é a interface da rede wireless. Isso é simples, pois o sistema guarda a informação no arquivo "/proc/net/wireless". Veja só:

# cat /proc/net/wireless

Inter-| sta-| Quality | Discarded packets | Missed | WE
face | tus | link level noise | nwid crypt frag retry misc | beacon | 21
eth1: 0000 65 202 160 0 0 0 0 0 0

Podemos filtrar a informação, ficando apenas com o device da placa de rede e atribuí-lo a uma variável que poderemos usar mais adiante no script, usando o pipe, o tail e o cut, veja só:

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d ":" | cut -c 3-`

A variável "placa" passa a conter o "eth1", que é o device atual da placa de rede. Com isso, o script se adapta automaticamente a mudanças.

Falta agora adicionar as linhas que configuram a rede. Note que fiz uma pequena mudança no comando do wpa_supplicant, substituindo o "-d" por "-B". Isso faz com que ele rode em modo daemon, sem travar o terminal. Sem isso o script não funcionaria, pois o comando do wpa_supplicant pararia a execução do script, não deixando que os comandos seguintes fossem executados.

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa 192.168.1.65 netmask 255.255.255.0 up
route del default
route add default gw 192.168.1.1 dev $placa
echo "nameserver 208.67.222.222" > /etc/resolv.conf

O script completo ficaria:

#!/bin/sh
# script para configurar a rede wireless

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d ":" | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa 192.168.1.65 netmask 255.255.255.0 up
route del default
route add default gw 192.168.1.1 dev $placa
echo "nameserver 208.67.222.222" > /etc/resolv.conf

Você poderia também torná-lo mais elegante, declarando os parâmetros da rede no início do script:

#!/bin/sh
# script para configurar a rede wireless

endip="192.168.1.65"
masc="255.255.255.0"
gtw="192.168.1.1"
enddns="208.67.222.222"

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d ":" | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa $endip netmask $masc up
route del default
route add default gw $gtw dev $placa
echo "nameserver $enddns" > /etc/resolv.conf

Ao terminar, transforme o arquivo em executável e crie um link para ele dentro da pasta "/etc/rc5.d", de forma que ele seja executado durante o boot:

# chmod +x /etc/init.d/wireless
# cd /etc/rc5.d
# ln -s ../init.d/wireless S99wireless

Se preferir, você pode também adicionar o comando "/etc/init.d/wireless" em algum dos arquivos de inicialização, como o "/etc/rc.local", de forma que ele seja executado diretamente. Vai do que achar mais prático de acordo com a situação.

Terminado, é só reiniciar o micro e testar. :)

Este script "base" pode ser adaptado de acordo com a necessidade, incluindo outros comandos que você precise executar para ativar a placa de rede (ou ativar o transmissor ou para resolver problemas diversos).

Por exemplo, em um Acer 5043, preciso rodar os dois comandos abaixo para ativar o transmissor da placa wireless, caso contrário a placa simplesmente não transmite dados:

# modprobe acer_acpi
# echo "enabled : 1" > /proc/acpi/acer/wireless

Em outro (com uma placa Atheros) notei um problema estranho onde a placa é detectada apenas às vezes ao ativar o módulo. Às vezes é necessário carregar e descarregar o módulo várias vezes antes da rede ser detectada. Resolvi o problema na base da "força bruta" usando esse função, que continua carregando e descarregando os módulos até que a placa seja ativada e o device apareça no arquivo /proc/net/wireless:

atheros=`cat /proc/net/wireless | grep ath0`
while [ -z "$atheros" ]; do
/sbin/modprobe -r ath_pci
/sbin/modprobe -r ath_hal
sleep 3
/sbin/modprobe ath_hal
/sbin/modprobe ath_pci
atheros=`cat /proc/net/wireless | grep ath0`
done

Em ambos os casos, os comandos poderiam ser adicionados no início do script, de forma que a rede fosse ativada antes dos demais comandos, como em:

#!/bin/sh
# script para configurar a rede wireless

endip="192.168.1.65"
masc="255.255.255.0"
gtw="192.168.1.1"
enddns="208.67.222.222"

atheros=`cat /proc/net/wireless | grep ath0`
while [ -z "$atheros" ]; do
/sbin/modprobe -r ath_pci
/sbin/modprobe -r ath_hal
sleep 3
/sbin/modprobe ath_hal
/sbin/modprobe ath_pci
atheros=`cat /proc/net/wireless | grep ath0`
done

# Desativa o network-manager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop

# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant

# Desativa a interface de rede cabeada
ifconfig eth0 down

# Desativa o cliente dhcp
killall dhclient3

# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d ":" | cut -c 3-`

# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D wext
ifconfig $placa $endip netmask $masc up
route del default
route add default gw $gtw dev $placa
echo "nameserver $enddns" > /etc/resolv.conf

Naturalmente, escrever o script do zero pode ser bem mais complicado do que simplesmente configurar a rede usando as ferramentas disponíveis, mas agora que você tem um modelo pronto, pode usá-lo de forma bastante prática, simplesmente substituindo as informações que forem diferentes em cada situação. Esta é a beleza dos scripts de configuração: eles podem ser escritos uma vez e depois usados indefinidamente, com pequenas alterações.



1 comentárioPor Carlos E. Morimoto. Revisado 4/out/2007 às 11h28

Comentários

script limpo
Criado 11/mar/2011 às 15h27 por laertilinux (anônimo)
so sobe a plca com o camndo

posta um script limpo

axo que so começando do zero aqui nao vai ta dando canseira

laerti@laerti-desktop:~$ sudo su
sudo: unable to resolve host laerti-desktop
[sudo] password for laerti:
root@laerti-desktop:/home/laerti# /etc/init.d/networking restart
* Reconfiguring network interfaces... /etc/network/interfaces:1: too few parameters for iface line
ifdown: couldn't read interfaces file "/etc/network/interfaces"
/etc/network/interfaces:1: too few parameters for iface line
ifup: couldn't read interfaces file "/etc/network/interfaces"
[fail]
root@laerti-desktop:/home/laerti# wpa_supplicant -i wlan5 -c /etc/wpa_supplicant.conf -d -D wext
Initializing interface 'wlan5' conf '/etc/wpa_supplicant.conf' driver 'wext' ctrl_interface 'N/A' bridge 'N/A'
Configuration file '/etc/wpa_supplicant.conf' -> '/etc/wpa_supplicant.conf'
Reading configuration file '/etc/wpa_supplicant.conf'
Priority group 0
id=0 ssid='AirLIve_laertlinux'
ioctl[SIOCGIFFLAGS]: No such device
Could not get interface 'wlan5' flags
Failed to initialize driver interface
Failed to add interface wlan5
Cancelling scan request
Cancelling authentication timeout
root@laerti-desktop:/home/laerti# wpa_passphrase AirLIve_laertlinux laertiLinux1958laC > /etc/wpa_supplicant.conf
root@laerti-desktop:/home/laerti# wpa_passphrase AirLIve_laertlinux laertiLinux1958laC > /etc/wpa_supplicant.conf
root@laerti-desktop:/home/laerti# gedit /etc/init.d/wirelessroot@laerti-desktop:/home/laerti# gedit /etc/modules
root@laerti-desktop:/home/laerti# gedit /etc/modprobe.d/blacklist.conf
root@laerti-desktop:/home/laerti# modprobe rt61pci nohwcrypt=1
WARNING: Deprecated config file /etc/modprobe.conf, all config files belong into /etc/modprobe.d/.
WARNING: All config files need .conf: /etc/modprobe.d/aliases, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/ralink, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/ndiswrapper, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/blacklist, it will be ignored in a future release.
WARNING: All config files need .conf: /etc/modprobe.d/blacklist., it will be ignored in a future release.
WARNING: /etc/modprobe.d/aliases line 1: ignoring bad line starting with ''alias'
WARNING: /etc/modprobe.d/aliases line 2: ignoring bad line starting with ''alias'
WARNING: /etc/modprobe.d/aliases line 3: ignoring bad line starting with ''alias'
WARNING: /etc/modprobe.d/blacklist. line 1: ignoring bad line starting with 'rt61pci'
WARNING: /etc/modprobe.d/blacklist. line 2: ignoring bad line starting with 'rt61pci'
WARNING: /etc/modprobe.d/blacklist. line 3: ignoring bad line starting with 'rt61pci,rt2x00pci'
WARNING: /etc/modprobe.d/blacklist. line 4: ignoring bad line starting with 'rt2x00lib'
WARNING: /etc/modprobe.d/blacklist. line 5: ignoring bad line starting with 'rt2x00pci,rt2x00lib'
WARNING: /etc/modprobe.d/blacklist. line 6: ignoring bad line starting with 'rt2x00lib,mac80211'
WARNING: /etc/modprobe.d/blacklist. line 7: ignoring bad line starting with 'rt61pci'
root@laerti-desktop:/home/laerti# lspci
03:01.0 Network controller: RaLink RT2561/RT61 802.11g PCI
03:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8110SC/8169SC Gigabit Ethernet (rev 10)
root@laerti-desktop:/home/laerti#
root@laerti-desktop:/home/laerti# lsmod
Module Size Used by
aes_i586 7268 2
aes_generic 26863 1 aes_i586
arc4 1153 2
rt61pci 18920 0
crc_itu_t 1371 1 rt61pci
rt2x00pci 6027 1 rt61pci
rt2x00lib 27541 2 rt61pci,rt2x00pci
led_class 2864 1 rt2x00lib
mac80211 205402 2 rt2x00pci,rt2x00lib
cfg80211 126528 2 rt2x00lib,mac80211
eeprom_93cx6 1333 1 rt61pci
nls_iso8859_1 3249 1
nls_cp437 4919 1
root@laerti-desktop:/home/laerti# ifconfig
eth0 Link encap:Ethernet Endereço de HW 00:1d:7d:86:9e:d3
UP BROADCAST MULTICAST MTU:1500 Métrica:1
pacotes RX:0 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:0 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
IRQ:21

eth0:avahi Link encap:Ethernet Endereço de HW 00:1d:7d:86:9e:d3
inet end.: 169.254.9.65 Bcast:169.254.255.255 Masc:255.255.0.0
UP BROADCAST MULTICAST MTU:1500 Métrica:1
IRQ:21

lo Link encap:Loopback Local
inet end.: 127.0.0.1 Masc:255.0.0.0
endereço inet6: ::1/128 Escopo:Máquina
UP LOOPBACK RUNNING MTU:16436 Métrica:1
pacotes RX:386 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:386 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:46230 (46.2 KB) TX bytes:46230 (46.2 KB)

wlan5 Link encap:Ethernet Endereço de HW 00:02:2a:e7:28:f3
inet end.: 192.168.1.100 Bcast:192.168.1.255 Masc:255.255.255.0
endereço inet6: fe80::202:2aff:fee7:28f3/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:694 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:831 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:1000
RX bytes:385607 (385.6 KB) TX bytes:129166 (129.1 KB)

root@laerti-desktop:/home/laerti# gedit /etc/init.d/wireless

#!/bin/sh
# script para configurar a rede wireless
# Declara os parâmetros
endip="192.168.1.65"
masc="255.255.255.0"
gtw="192.168.1.1"
enddns="200.204.0.10"
placa="wlan5"
wpadriver="wext"
# Desativa o networkmanager do Ubuntu/Kubuntu
/etc/dbus-1/event.d/??NetworkManagerDispatcher stop
/etc/dbus-1/event.d/??NetworkManager stop
# Fecha outras instâncias ativas do wpa_supplicant
killall wpa_supplicant
# Desativa a interface de rede cabeada
ifconfig eth0 down
# Desativa o cliente dhcp
killall dhclient3
# Descobre qual é o device da placa wireless
placa=`cat /proc/net/wireless | tail -n 1 | cut -f 1 -d ":" | cut -c 3-`
# Configura a rede
wpa_supplicant -i $placa -c /etc/wpa_supplicant.conf -B -D $wpadriver
ifconfig $placa $endip netmask $masc up
route del default
route add default gw $gtw dev $placa
echo "nameserver $enddns" > /etc/resolv.conf
root@laerti-desktop:/home/laerti# lshw -C network
*-network:0
description: Wireless interface
product: RT2561/RT61 802.11g PCI
vendor: RaLink
physical id: 1
bus info: pci@0000:03:01.0
logical name: wlan5
version: 00
serial: 00:02:2a:e7:28:f3
width: 32 bits
clock: 33MHz
capabilities: pm bus_master cap_list ethernet physical wireless
configuration: broadcast=yes driver=rt61pci ip=192.168.1.100 latency=96 multicast=yes wireless=IEEE 802.11bg
resources: irq:19 memory:e4000000-e4007fff
*-network:1
description: Ethernet interface
product: RTL-8110SC/8169SC Gigabit Ethernet
vendor: Realtek Semiconductor Co., Ltd.
physical id: 5
bus info: pci@0000:03:05.0
logical name: eth0
version: 10
serial: 00:1d:7d:86:9e:d3
size: 10MB/s
capacity: 1GB/s
width: 32 bits
clock: 66MHz
capabilities: pm bus_master cap_list rom ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=2.3LK-NAPI duplex=half latency=64 link=no maxlatency=64 mingnt=32 multicast=yes port=MII speed=10MB/s
resources: irq:21 ioport:a000(size=256) memory:e4008000-e40080ff memory:80000000-8001ffff(prefetchable)
root@laerti-desktop:/home/laerti# lsmod | grep rt61
rt61pci 18920 0
crc_itu_t 1371 1 rt61pci
rt2x00pci 6027 1 rt61pci
rt2x00lib 27541 2 rt61pci,rt2x00pci
eeprom_93cx6 1333 1 rt61pci
root@laerti-desktop:/home/laerti#