Wake on lan hosts file
Есть ли такая вещь, как файл, связывающий MAC-адреса с IP-адресами / DNS-именами для использования с wakeonlan в Linux? Что-то вроде этого:
$ 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
Благодарю.
7 ответов
Некоторый незначительный удар:
$ 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
Для этого используются массивы bash: http://tldp.org/LDP/abs/html/arrays.html
Сайт unix.stackexchange.com, вероятно, может больше помочь с выполнением этого сценария и сценария, который обрабатывает вывод arp.
Утилита etherwake (кажется, что upstream мертв) может считывать MAC-адреса с /etc/ethers
(или другой вид ethers
база данных указана в /etc/nsswitch.conf
).
Я создал свой собственный скрипт bash для этого:
#!/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
Мой /etc/machosts выглядит так:
# 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
Инструмент, который справится с большинством из этого, arpwatch
, По умолчанию (по крайней мере, в Debian) он пишет в /var/lib/arpwatch/arp.dat
, Этот файл сбрасывается и обновляется каждый раз arpwatch
остановлен
Файл содержит записи этой формы:
52:54:00:aa:bb:cc 192.168.1.2 1452252063 somehostname eth0
/etc/ethers
Для файла требуется только MAC-адрес и либо IP-адрес, либо разрешаемое имя хоста:
52:54:00:aa:bb:cc 192.168.1.2
Тогда довольно просто сохранить /etc/ethers
обновляется и синхронизируется с небольшим скриптом, запускается ежедневно с 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
"Есть ли в Linux файл, связывающий MAC-адреса с IP-адресами [...]?"
Да, вроде: / proc / net / arp. Но, конечно, это не настоящий постоянный файл.
Стандартный файл для вашей цели - / etc / ethers, но вы должны его создать и заполнить. Делать это вручную скучно, но писать командную строку, чтобы сделать это для вас, весело.
Вы также можете
пропингуйте все хосты и проанализируйте /proc/net/arp (или
arp -n
если не в Linux),или вы можете использовать Nmap (
sudo apt-get install nmap
?) сканировать локальную сеть для вас, и дать вам как IP, так и MAC-адреса.
Первое решение может быть что-то вроде этого:
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
Решение Nmap, которое должно быть быстрее, может выглядеть так:
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"}'
Чтобы также получить DNS-имена, вы можете передать вывод сверху через что-то вроде
| while read mac ip; do name=$(dig -x $ip +short | grep -v '^;'); [ -n "$name" ] && ip=$name; echo "$mac $ip"; done
(С помощью решения Nmap вы также можете удалить -n
вариант, и адаптировать регулярное выражение, чтобы получить имя. Если вам действительно нравятся регулярные выражения).
Я написал небольшой скрипт, который извлекает mac-адрес и имя хоста или ip-адрес из dhcpd.conf, а затем создает пакет пробуждения (улучшенная версия чужого скрипта perl). Если вы хотите, я могу поставить его на pastebin.com или что-то подобное.
arp -a
отобразит таблицу кеша ARP в вашей системе, в которой должны быть указаны MAC-адреса для IP-адресов в локальной подсети вашего компьютера, к которым вы недавно обращались. Однако для вашего предполагаемого использования эта таблица может оказаться бесполезной, поскольку записи в этой таблице могут и будут удалены через некоторое время. Этот период времени зависит от реализации стека TCP ОС.
Конечно, было бы возможно иметь постоянно работающий скрипт, который периодически выполняет arp -a
команда и обновляет файл с полученной новой информацией.