用脚本实现局域网消息群发

wen 实用脚本 3

高效办公与运维的实战指南

目录导读

  1. 为什么需要局域网消息群发?
  2. 核心原理:脚本如何绕过网络限制?
  3. 常用脚本方案对比(CMD/Python/Shell)
  4. 实操步骤:从零搭建一个消息群发脚本
  5. 常见问题与避坑指南
  6. 问答环节:解决你90%的疑惑

为什么需要局域网消息群发?

在企业内网、学校机房或实验室场景中,经常需要向多台设备发送通知、重启命令或告警信息,传统方法依赖逐一登录或第三方IM软件,效率低且存在隐私风险。用脚本实现局域网消息群发,可以做到:

用脚本实现局域网消息群发

  • 即时性:秒级触达所有在线设备
  • 可控性:无需依赖外网,避免数据泄露
  • 跨平台:支持Windows、Linux、macOS混合网络
  • 自动化:可嵌入监控系统或定时任务

适用场景举例

  • IT运维:批量通知系统更新、故障维护
  • 教育:向机房所有电脑发送考试指令
  • 行政:紧急通知办公区人员集合

核心原理:脚本如何绕过网络限制?

局域网消息群发的本质是利用网络协议或共享服务实现单向或双向通信,主流实现方式包括:

1 NetBIOS/SMB协议(Windows原生)

通过net send(已废弃)或msg命令,利用计算机名称或IP地址发送弹出窗口。
特点:无需安装客户端,但受防火墙和用户账户控制(UAC)限制。

2 广播与组播(UDP)

脚本向局域网广播地址(如192.168.1.255)发送UDP数据包,所有设备监听特定端口接收。
特点:效率高,但需接收端运行监听程序(如nc、自建服务端)。

3 SSH/SFTP(跨平台)

通过SSH远程执行命令,配合expectparamiko库实现批量推送。
特点:安全可靠,但需要每台设备开启SSH服务并配置密钥。


常用脚本方案对比(CMD/Python/Shell)

方案 优势 劣势 适用场景
Windows CMD 无需额外安装,msg命令原生支持 只能发送给本机或域内用户,不支持跨网段 小型Windows工作组
Python + socket 跨平台、灵活度高、可自定义协议 需部署Python环境,接收端需运行脚本 混合网络、需要数据校验
Shell + netcat Linux原生支持,轻量 Windows需额外安装WSL或cygwin Linux集群运维
PowerShell 支持Invoke-Command远程调用 需要WinRM和域环境配置 企业级Windows服务器群

实操步骤:从零搭建一个消息群发脚本

方案A:Windows环境用CMD + 批处理

适用:所有Windows 7/10/11都可直接运行。

@echo off
setlocal enabledelayedexpansion
:: 定义IP列表(用逗号或换行分隔)
set IP_LIST=192.168.1.101 192.168.1.102
set MSG=系统将于5分钟后重启,请保存工作!
for %%i in (%IP_LIST%) do (
    msg * /SERVER:%%i /TIME:5000 %MSG%
    if !errorlevel! equ 0 (
        echo 成功发送消息到 %%i
    ) else (
        echo 发送到 %%i 失败,可能目标未登录或防火墙拦截
    )
)
pause

注意msg命令要求目标机开启Remote Desktop Services服务,且发送者需有管理员权限。

方案B:Python跨平台脚本(推荐)

适用:任何操作系统,支持接收端同时监听。
发送端(sender.py)

import socket
import sys
def broadcast_message(server_port, message):
    # 创建UDP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    # 发送广播(需确定子网掩码)
    broadcast_addr = '192.168.1.255'  # 根据实际子网修改
    sock.sendto(message.encode(), (broadcast_addr, server_port))
    sock.close()
if __name__ == '__main__':
    broadcast_message(8888, sys.argv[1] if len(sys.argv)>1 else '测试消息')

接收端(receiver.py)

import socket
def listen_message(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('0.0.0.0', port))
    print(f'监听端口 {port},等待消息...')
    while True:
        data, addr = sock.recvfrom(1024)
        print(f'收到来自 {addr} 的消息:{data.decode()}')
        # 可集成弹窗/日志/执行脚本
s.listen_message(8888)

部署:在每台目标机运行receiver.py(可设为开机启动),然后发送端运行命令:
python sender.py "这是重要通知"

方案C:Linux Shell批量SSH推送

#!/bin/bash
# 需先配置SSH免密登录
HOSTS=("192.168.1.101" "192.168.1.102")
MSG="服务器即将更新,请勿操作!"
for host in "${HOSTS[@]}"; do
    # 使用ssh远程显示通知(需要目标系统安装notify-send)
    ssh -o ConnectTimeout=5 "$host" "echo '$MSG' | wall"
    # 或使用图形化通知
    # ssh "$host" "export DISPLAY=:0 && notify-send '警告' '$MSG'"
done

常见问题与避坑指南

Q1:为什么msg命令提示“找不到用户”?
A:目标机必须有人登录(锁屏也可),且调用msg * /SERVER:IP时,星号代表所有已登录用户,若目标机无用户则失败。

Q2:UDP广播收不到怎么办?
A:广播地址需与子网掩码匹配(如192.168.1.0/24的广播地址是192.168.1.255),另检查防火墙是否放行UDP端口(本例为8888)。

Q3:脚本被360/火绒拦截?
A:将脚本加入白名单,或改用Windows自带的PowerShell远程执行(需组策略允许)。

Q4:如何实现定时群发?
A:Python脚本配合schedule库,或直接用Windows任务计划程序触发bat文件。


问答环节:解决你90%的疑惑

问:用脚本群发消息和用企业微信/钉钉群发有什么区别?
答:脚本完全基于局域网,不依赖公网,适合运维应急、内网环境受限的场景,而企业IM需要注册账号、联网。

问:有没有不需要客户端监听的方法?
答:有,使用SMTP邮件服务器(如本地部署邮局),但设置复杂,最简方法是利用Windows的msg命令(但仅限域内),ARP协议和网络唤醒(WOL)只能发送魔力包,无法传递文本。

问:脚本能否批量修改消息内容(如每台不同IP)?
答:可以,在循环时动态拼接字符串,Python示例:

for ip in ip_list:
    custom_msg = f"{ip} 有更新任务"
    send_to(ip, custom_msg)

问:安全性如何?消息会不会被第三方截获?
答:UDP广播和msg命令明文传输,建议在内网隔离环境使用,若需加密,可在Python脚本中加入AES对称加密(双方共享密钥)。


通过脚本实现局域网消息群发,能极大提升办公与运维效率,根据网络环境选择合适方案:简单直接选CMD msg,灵活跨平台用Python UDP,Linux集群推荐SSH推送,关键点是理解协议限制做好错误处理,建议先在测试环境验证,再推广到生产网络。

(全文约1820字,涵盖原理、实操、排错与进阶需求)

抱歉,评论功能暂时关闭!