bash 脚本告诉我新计算机何时通过 smbclient 加入 LAN

bash 脚本告诉我新计算机何时通过 smbclient 加入 LAN

我正在考虑创建一个脚本,该脚本循环运行,直到它在路由器 DHCP 服务器创建的网络上找到新 IP。我正在考虑使用 NMAP。

nmap 192.168.0.1-254

但是我想知道如何编写脚本来识别新创建的 IP,然后在本地计算机上向自己发送一条消息(smbclient?),告知 IP### 已创建。该消息会显示“IP/HOST ###,已加入您的网络”

有什么想法吗?有例子吗?

答案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" [email protected]

  fi

done <<< "$ONLINE"

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

我遇到的唯一问题是向我的 Windows 7 PC 发送消息。

我有自己的 Windows 应用程序(始终显示在任务栏中),它监控来电并通过 UDP 数据包与我的 Linux 服务器通信。在我的脚本中,这是一行/home/util/udp.pl(在端口 1200 上发送 UDP 广播数据包)。

我尝试smbclient发送消息,但无法成功。也许你的 Ubuntu 机器更幸运。

因此我添加了一行来通过电子邮件发送消息。


您应该首先尝试是否可以使用 Ununtu 发送消息到其他工作站(或本地桌面):

echo "hello world" | smbclient -M YOUR_PC

或者

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

如果您无法将任何内容发送到您的桌面,那么您将不得不采用电子邮件方式。

答案2

如果您使用的不是简单的路由器,而是更强大的 dns/dhcp 服务(如 dnsmasq),您可以让 DHCPd 处理此问题。我已将 dnsmasq 配置为每次授予 DHCP 租约时运行脚本。您可以在 dnsmasq.conf 中使用一行代码执行此操作:

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

在脚本中,我将 mac 地址、ip、名称和日期时间写入数据库。如果 mac 地址未知,它会向我发送一封电子邮件,通知我网络中有新设备。

我的带有 SQLite 数据库的 PHP 脚本如下所示:

#!/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;
}
?>

相关内容