script bash informa quando o novo computador se associa à LAN via smbclient

1

Estou pensando em criar um script que faça um loop até encontrar um novo IP na rede criada pelo servidor DHCP do roteador. Estou pensando em usar o NMAP.

nmap 192.168.0.1-254

No entanto eu estou querendo saber como eu poderia escrever o script para identificar o IP recém-criado, em seguida, envie uma mensagem (smbclient?) no computador local, que IP ### foi criado. O meesage diria "IP / HOST ###, entrou na sua rede"

Alguma ideia é? Exemplos?

    
por Benjamin Jones 31.12.2013 / 05:38

2 respostas

1

Eu posso ajudá-lo, em parte, com o seguinte roteiro.

Adicionei muitos comentários (para esclarecer o script), mas você pode editá-los.

BTW. Eu usaria o parâmetro -sP com nmap . O padrão nmap varrerá muitas portas (lento) e normalmente é suficiente apenas usar o método ping (em uma rede local). Se não for, você pode sempre ajustá-lo.

#!/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" [email protected]

  fi

done <<< "$ONLINE"

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

O único problema que encontrei foi enviar uma mensagem para o meu PC com Windows 7.

Eu tenho meu próprio aplicativo do Windows (sempre presente na bandeja de tarefas) que monitora chamadas telefônicas recebidas e que se comunica com meu servidor Linux por meio de pacotes UDP. No meu script, essa é a linha com /home/util/udp.pl (para enviar um pacote de transmissão UDP na porta 1200).

Eu tentei smbclient enviar uma mensagem, mas não consegui fazer isso funcionar. Talvez você tenha mais sorte na sua caixa do Ubuntu.

Então eu adicionei uma linha para enviar uma mensagem via e-mail.

Você deve primeiro tentar se pode enviar mensagens com o Ununtu para suas outras estações de trabalho (ou desktop local):

echo "hello world" | smbclient -M YOUR_PC

ou

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

Se você não puder enviar nada para a sua área de trabalho, terá que se contentar com o método de e-mail.

    
por 08.01.2014 / 13:56
1

Se você não estiver usando um roteador simples, mas um serviço dns / dhcp mais capaz, como o dnsmasq, você pode deixar o DHCPd lidar com isso. Eu tenho meu dnsmasq configurado para executar um script toda vez que uma concessão de DHCP é dada. Você pode fazer isso com uma única linha no dnsmasq.conf:

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

No script eu escrevo o endereço mac, ip, nome e datetime para um banco de dados. Se o endereço MAC é desconhecido, ele envia um e-mail para mim, notificando-me do novo dispositivo na minha rede.

Meu script PHP com um banco de dados SQLite é assim:

#!/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;
}
?>
    
por 08.01.2014 / 15:18