Wake no arquivo lan hosts

2

Existe algo como um arquivo que vincula endereços MAC a endereços IP / nomes DNS para uso com o wakeonlan no Linux? Algo parecido com isto:

$ cat /etc/machosts
00:1f:d0:34:e0:ea 192.168.0.5
00:1f:d0:34:a1:06 192.168.0.7
$ cat /etc/hosts
192.168.0.5 mypc
$ wakeonlan mypc

Obrigado.

    
por felamaslen 08.08.2012 / 20:41

7 respostas

4

Alguma pequena bash:

$ cat /path/to/machosts
macs[mypc1]=00:1f:d0:34:e0:ea 
macs[mypc2]=00:1f:d0:34:a1:06 

$ cat wakeonlan.sh
#!/bin/bash

. /path/to/machosts

echo wakeonlan ${macs[$1]}

$ ./wakeonlan.sh mypc1
wakeonlan 00:1f:d0:34:a1:06

Isso usa matrizes do bash: link

O site unix.stackexchange.com provavelmente pode ajudar mais a fazer esse script e aquele que processa a saída arp.

    
por 08.08.2012 / 21:09
3

O utilitário etherwake (o upstream parece estar morto) pode ler endereços MAC de /etc/ethers ( ou outro tipo de banco de dados ethers especificado em /etc/nsswitch.conf ).

    
por 08.08.2012 / 21:22
2

Eu criei meu próprio script para isso:

#!/bin/bash

die () {
  echo >&2 "$@"
  exit 1
}

# we need one parameter - the hostname or IP address
[ "$#" -eq 1 ] || die "1 argument required, $# provided"

if [[ ! -f "/etc/machosts" ]]; then
  die "Can't find /etc/machosts file!"
fi

host="$1"

# if argument isn't an IPv4 address, try to resolve it
if [[ ! $host =~ ^([0-2]?[0-9]{1,2}\.){3}([0-2]?[0-9]{1,2})$ ]]; then
  echo "Attempting to identify IP from name: $host..."
  host=$(getent ahosts $host | head -n 1 | cut -d" " -f1)
fi

if [[ ! $host =~ ^([0-2]?[0-9]{1,2}\.){3}([0-2]?[0-9]{1,2})$ ]]; then
  die "Invalid hostname"
fi

mac=""

# read /etc/machosts line by line
while read line
do
  if [[ !(${line:0:1} == "#") && ( -n "$line" ) ]]; then
    ip=$(echo $line | cut -d" " -f2)
    addr=$(echo $line | cut -d" " -f1)

    if [[ $ip == $host ]]; then
      mac=$addr
      break
    fi
  fi
done < "/etc/machosts"

if [[ -z $mac ]]; then
  die "No MAC address asociated with that host!"
fi

wakeonlan $mac

exit 0

Meu / etc / machosts tem esta aparência:

# here the MAC hosts are defined
#
# e.g. 50:e7:24:ab:c0:d3 10.3.12.5

50:e5:49:1a:8c:9c 192.168.0.4
00:1f:d0:34:e0:ea 192.168.0.5
00:25:22:b1:f6:be 192.168.0.6
00:1f:d0:34:a1:06 192.168.0.7
    
por 08.08.2012 / 22:10
1

" Existe um [...] arquivo ligando endereços MAC a endereços IP [...] no Linux? "

Sim, mais ou menos: / proc / net / arp . Mas, claro, isso não é um arquivo permanente real.

O arquivo padrão para sua finalidade é / etc / ethers , mas você precisa criá-lo e preenchê-lo. Fazer isso manualmente é chato, mas escrever uma linha de comando para fazer isso é divertido.

Você pode

  • pingando todos os hosts e parse / proc / net / arp (ou arp -n se não estiver no Linux),

  • ou pode utilizar o nmap ( sudo apt-get install nmap ?) para analisar a rede local e fornecer-lhe os endereços IP e MAC.

A primeira solução poderia ser algo assim:

for i in 'seq 1 254'; do
    ip=192.168.1.$i
    if ping -c 1 -w 1 $ip >/dev/null; then
        mac=$(grep "^$ip" /proc/net/arp | awk '{print $4}')
        echo "$mac  $ip"
    fi
done

A solução nmap, que deve ser mais rápida, pode ser assim:

sudo nmap -sP -n -oN - 192.168.1.0/24 | \
perl -nle 'if (/ \b ([0-9\.]{7,15}) \b /x) {$ip=$1} elsif (/ ([0-9A-F:]{17}) /i) {print "$1  $ip"}'

Para obter também os nomes DNS, você pode enviar a saída de cima por meio de algo como

| while read mac ip; do name=$(dig -x $ip +short | grep -v '^;'); [ -n "$name" ] && ip=$name; echo "$mac  $ip"; done

(Com a solução nmap, você também pode remover a opção -n e adaptar o regex para obter o nome. Se você realmente gosta de expressões regulares).

    
por 10.01.2013 / 01:15
1

Uma ferramenta que manipulará a maior parte disso é arpwatch . Por padrão (no Debian, pelo menos) é que ele grava em /var/lib/arpwatch/arp.dat . Este arquivo é liberado e atualizado sempre que arpwatch é interrompido.

O arquivo contém entradas deste formulário:

52:54:00:aa:bb:cc  192.168.1.2  1452252063  somehostname  eth0

O arquivo /etc/ethers requer apenas o endereço MAC e o endereço IP ou o nome de host resolvível:

52:54:00:aa:bb:cc  192.168.1.2

É bastante simples manter /etc/ethers atualizado e sincronizado com um script pequeno, executado diariamente em crontab :

#!/bin/bash

# Flush arp.dat
service arpwatch restart

# Save a copy
test -f /etc/ethers || touch /etc/ethers
cp -fp /etc/ethers /etc/ethers.old

# Check to see if anything new has arrived. If so rebuild the file
(
    echo '# This file is updated automatically from /var/lib/arpwatch/arp.dat'
    echo '# Take care when editing'
    echo '#'
    (
        awk '{print $1,$2}' /var/lib/arpwatch/arp.dat
        grep -v '^#' /etc/ethers.old
    ) |
        sort -u
) >/etc/ethers.tmp

# Update ethers with the new file
cmp -s /etc/ethers.tmp /etc/ethers || cat /etc/ethers.tmp >/etc/ethers
rm -f /etc/ethers.tmp

# All done
exit 0
    
por 08.01.2016 / 12:41
0

arp -a listará a tabela de cache ARP em seu sistema, que deverá mostrar os endereços MAC para os endereços IP na sub-rede local do seu computador que você acessou recentemente. No entanto, para o seu uso pretendido, esta tabela pode não ser útil, pois as entradas nessa tabela podem e serão removidas após algum período de tempo. Esse período de tempo é dependente da implementação da pilha TCP do sistema operacional.

É claro que seria possível ter um script em execução constante que executa periodicamente o comando arp -a e atualiza um arquivo com as novas informações recuperadas.

    
por 08.08.2012 / 20:50
0

Eu escrevi um pequeno script que recupera o endereço MAC e o nome do host ou endereço IP do dhcpd.conf e, em seguida, constroi o pacote de ativação (versão aprimorada do script 'perl' de outra pessoa). Se você quiser, posso colocá-lo em pastebin.com ou algo assim.

    
por 08.08.2012 / 21:11