1

Я подумываю о создании сценария, который зацикливается до тех пор, пока не найдет новый IP в сети, созданной DHCP-сервером маршрутизатора. Я думаю об использовании NMAP.

nmap 192.168.0.1-254

Однако мне интересно, как я мог бы написать скрипт для идентификации вновь созданного IP-адреса, а затем отправить себе сообщение (smbclient?) на локальном компьютере этот IP ### был создан. Meesage сказал бы: «IP /HOST ###, присоединился к вашей сети»

Есть идеи? Примеры?

2 ответа2

1

Отчасти я могу помочь вам со следующим сценарием.

Я добавил много комментариев (чтобы уточнить сценарий), но вы можете их отредактировать.

КСТАТИ. Я бы использовал параметр -sP с nmap . По умолчанию nmap будет сканировать много портов (медленно), и обычно достаточно просто использовать ping-метод (в локальной сети). Если это не так, вы всегда можете настроить его.

#!/bin/sh

# the file in which the last know ips are stored
LOG_FILE="last_online.txt"

# use this if you want to "hard" set the ip range
# IP_RANGE="192.168.0.1-100"
#

# however, we use this
# this is more flexible and gets the ip range from the ip-command
# if this doesn't work use the "hard"-setting above
# result is i.e. 192.168.0.1/24
IP_RANGE=`ip -o addr show | grep inet\  | grep eth | cut -d\  -f 7 | head -n1`

# this would give you IP numbers ONLY (no text "appears to be up")
# i didn't use it here because the message "Host xx (ip) appears to be up"
# is (almost) exactly what we want
# ONLINE=`nmap -oG - -sP $IP_RANGE | grep ": Up" | awk '/Host/{print $2}'`

# and this line gives us a complete message-line
# like "Host router (192.168.1.254) appears to be up."
ONLINE=`nmap -sP $IP_RANGE | grep "up\."`

# loop through all the "up" ip addresses
while read -r IP
do

  # check if IP-line (with complete appears-text) exists in last know ip-file
  if ! grep -Fxq "$IP" $LOG_FILE
  then

     # if not, do this (note the ! in the if-line)

     # my own script for sending udp signal to my windows-app
     # /home/util/udp.pl 1200 "$IP"

     # smclient winpopup message
     # couldn't get this to work in win7 anymore
     # echo "$IP" | smbclient -M YOUR_PC

     # ok, lets send an e-mail
     echo "$IP" | mail -s "$IP" your_email@example.com

  fi

done <<< "$ONLINE"

# write the new online ip addresses to the log_file
echo "$ONLINE" > $LOG_FILE

Единственной проблемой, с которой я столкнулся, была отправка сообщения на мой ПК с Windows 7.

У меня есть собственное Windows-приложение (всегда присутствует в панели задач), которое отслеживает входящие телефонные звонки и связывается с моим сервером Linux через UDP-пакеты. В моем скрипте это строка с /home/util/udp.pl (для отправки пакета UDP-широковещания через порт 1200).

Я пытался smbclient , чтобы отправить сообщение , но не могу получить, чтобы работать. Может быть, у вас больше удачи на вашей Ubuntu-коробке.

Поэтому я добавил строку для отправки сообщения по электронной почте.


Сначала вы должны попробовать, если вы можете отправлять сообщения с Ununtu на другие рабочие станции (или локальный рабочий стол):

echo "hello world" | smbclient -M YOUR_PC

или же

echo "hello world" | smbclient -M YOUR_PC -U YOUR_USERNAME

Если вы ничего не можете отправить на рабочий стол, вам придется согласиться на метод электронной почты.

1

Если вы не используете простой маршрутизатор, но более работоспособный сервис dns/dhcp, такой как dnsmasq, вы можете позволить DHCPd справиться с этим. Мой dnsmasq настроен для запуска сценария каждый раз, когда предоставляется аренда DHCP. Вы можете сделать это с помощью одной строки в dnsmasq.conf:

dhcp-script=/path/to/new_lease.php

В сценарии я записываю mac-адрес, ip, name и datetime в базу данных. Если MAC-адрес неизвестен, он отправляет мне электронное письмо с уведомлением о новом устройстве в моей сети.

Мой PHP-скрипт с базой данных SQLite выглядит так:

#!/usr/bin/php
<?php
# The arguments sent to the script are "add" or "del",
# then the MAC address, the IP address and finally the hostname
# if there is one.
$params = extract_array($argv, array(null, 'command', 'mac', 'ip', 'name'));
extract($params);

switch ($command) {
    case 'old':
    case 'add':
        $stmt = $db->prepare("UPDATE leases SET ip='' WHERE ip=:ip");
        $stmt->bindParam(":ip", $ip);
        $stmt->execute();
        if ($stmt->rowCount() == 0) {
                // new device
                $stmt = $db->prepare("SELECT vendor_name FROM vendors WHERE mac_prefix=:mac COLLATE NOCASE");
                $stmt->bindParam(":mac", $mac_prefix);

                $mac_prefix = substr($mac,0,8);
                if ($stmt->execute()) {
                  $result = $stmt->fetch();
                  $vendor = $result['vendor_name'];
                }

                // send email
        }
        $stmt = $db->prepare("INSERT OR IGNORE INTO leases (mac) VALUES (:mac)");
        $stmt->bindParam(":mac", $mac);
        $stmt->execute();
        $stmt = $db->prepare("UPDATE leases SET ip=:ip,name=:name,`date`=DATETIME('now') WHERE mac=:mac");
        $stmt->bindParam(":mac", $mac);
        $stmt->bindParam(":ip", $ip);
        $stmt->bindParam(":name", $name);
        $stmt->execute();
        break;
    case 'delete':
        $stmt = $db->prepare("UPDATE leases SET ip='' WHERE ip=:ip");
        $stmt->bindParam(":ip", $ip);
        $stmt->execute();
        break;
}
?>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .