恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
批量IP检测怎么做?用这几种脚本一键跑完,效率直接起飞
首页
资讯中心
/
批量IP检测怎么做?用这几种脚本一键跑完,效率直接起飞
批量IP检测怎么做?用这几种脚本一键跑完,效率直接起飞
发布时间:2026/9/16 8:57:29
前两天部门同事还在对着表格一行一行地复制IP做批量IP检测两百多个地址一个个点下去弄到快下班才跑完中间还抄错过一个地址。我扫了一眼他电脑叹了口气这种活三行脚本就能一键跑完他不信。今天我干脆把这套方法完整写出来凡是做运维、做网络维护、做IT资产管理的人看完直接拿走不用谢。先说清楚这东西是干什么的批量IP检测就是把一个网段、一个机房、一张Excel列表里的所有IP统一探测一遍是否在线、是否通、响应时间多少像给整片网络做一次“点名”。脚本的核心价值就一条把重复劳动变成一条命令的事把验证过程交给机器。适合的人群很明确——运维工程师、网络管理员、刚入行的IT支持以及所有被“今天又有一批IP要查验”支配过的人。1. 为什么一个个点IP检测的人是在给自己找罪受很多人觉得检测几十个IP而已又不难点了就完了。问题在于这种任务从来不是“几十个”就结束实际碰上的是这种场景资产盘点公司新到了几百台设备供应商丢给你一张表让你确认哪些是活的网络割接晚上要切换路由白天你得先把所有核心设备IP的连通性过一遍办公区调整一整个VLAN的终端能不能正常访问领导只给了你一个IP段服务巡检几十台服务器的管理口要确认每个都能远程登录。一个IP手工检测哪怕操作再熟练最少也得花30秒到1分钟。200个IP就是100分钟起步中途还得小心翼翼地复制粘贴生怕看错行。更折磨的是结果记录看到一个地址通了你得在表格里标一下“在线”没通还得截个图或敲一遍“超时”。一套“流水线”下来眼睛花了手也酸了最后交上去的报表还未必准。这个过程的本质问题有两个一是低价值重复劳动占据了人真正该做判断的时间二是人工操作带来的误判比机器高很多。你可能会说“我可以复制几个IP一起ping”但所有主流系统都没有“批量ping超多地址”的原生界面顶多允许你输入多几个地址输出还是一锅粥没有清晰结果。解决思路很简单把“检测”交给代码把“判断”留给自己。脚本批量检测的好处不只是快更在于稳定同一个IP列表每次跑的结果都是统一格式不会因为疲劳、分心而漏项。下面这几种方案我从最轻量的开始讲。2. 第一板斧Shell命令一键批量pingLinux运维的最短路径只要你手头有Linux环境或日常用的是Mac做批量IP检测最快的一条路就是Shell脚本。不需要装任何额外软件系统自带的基础命令就够了。2.1 最基本的for循环先把思路跑通假设你有一个文件叫ip.txt每行一个IP地址类似这样192.168.1.1 192.168.1.2 192.168.1.3最简单的批量检测可以这样写for ip in $(cat ip.txt) do ping -c 1 -W 1 $ip /dev/null 21 echo $ip 在线 || echo $ip 不通 done拆开来说ping -c 1表示只发一个ICMP包-W 1表示等待1秒就放弃这个参数适合局域网广域网可以改成2或者3 /dev/null 21是把ping的输出全部丢掉因为我们不关心过程只关心结果和||则是根据ping的返回码决定打印“在线”还是“不通”。这个循环在IP数量少的时候够用但有一个问题它是一个一个跑的200个IP即使每个1秒等待最坏情况也要200秒。能不能再快一点2.2 用xargs并发跑速度直接起飞把上面的写法改成用xargs做并发检测速度会明显提升cat ip.txt | xargs -P 50 -I {} sh -c ping -c 1 -W 2 {} /dev/null 21 echo {} 在线 || echo {} 不通关键在-P 50它表示同时起50个进程去处理这些IP。这就像你把任务分给50个人同时干活而不是一个人挨个打电话。50这个数值可以根据实际情况调网络环境好可以调到100但别太过火不然大批ICMP流量涌出去可能会触发防火墙的限速策略反倒让结果出现误判。我实测过200个IP用这个命令跑最慢也就十几秒比你手工点一个小时的效率高出太多。如果你还想把结果存起来只需要在命令末尾加个重定向cat ip.txt | xargs -P 50 -I {} sh -c ping -c 1 -W 2 {} /dev/null 21 echo {} 在线 || echo {} 不通 result.txt2.3 整段探测用nmap省去维护IP列表的时间如果你的检测对象不是散列IP而是一个网段比如192.168.1.0/24那还有更省事的办法用它nmap -sn 192.168.1.0/24-sn参数是纯主机发现模式只探测哪些IP在线不做端口扫描。一次就把整个网段的254个地址全部扫完输出结果中Host is up的行就是在线的主机。这个命令适合网络刚部署完、手上没有现成IP清单的场景直接对着C段扫一把全出来。不过nmap不一定装在你的系统里Debian/Ubuntu用apt install nmapCentOS/RHEL用yum install nmapMac用户用brew install nmap你得确保运行环境里有这个命令。3. 第二板斧Windows批处理和PowerShell不装软件也能跑Linux方案再香办公室环境里最常用的还是Windows。好消息是Windows同样有两条路线可以做批量IP检测一条是传统的批处理脚本一条是PowerShell都不需要额外安装工具。3.1 cmd批处理纯Windows原生方案新建一个文本文件把文件名改成check.bat注意扩展名必须是.bat然后用记事本编辑粘贴下面这段echo off chcp 65001 nul for /f %%i in (ip.txt) do ( ping -n 1 -w 1000 %%i nul if errorlevel 1 ( echo %%i 不通 ) else ( echo %%i 在线 ) ) pause这里面要注意几件事for /f %%i in (ip.txt)表示逐行读取ip.txt里的内容注意批处理里的循环变量是%%i写两个百分号这是批处理自成一派的语法ping -n 1 -w 1000表示只发一个包等1000毫秒如果地址通了ping的返回码是0errorlevel就不是1否则就是失败chcp 65001 nul是把代码页切到UTF-8编码避免中文乱码但前提是你的ip.txt得是UTF-8保存的如果还是乱就很折腾我后面专门说这个问题。把ip.txt放在和check.bat同一个目录双击运行就行。如果窗口一闪而过那就是脚本报错了根本原因大多是路径问题或编码问题这个放到第五节细讲。3.2 PowerShell版本并发更快还能导出报告批处理方案简单但胜在“零基础可复制”。如果你愿意接受现代一点的玩法PowerShell的体验会更好因为它能并发检测也能把结果直接导成CSV。先看基础版Get-Content ip.txt | ForEach-Object { $ip $_ if (Test-Connection $ip -Count 1 -Quiet -ErrorAction SilentlyContinue) { $ip 在线 } else { $ip 不通 } }Test-Connection是PowerShell对ping命令的封装-Count 1表示只发一个包-Quiet表示只返回True或False省去了解析字符串的麻烦。循环体内根据返回结果拼接输出逻辑很清楚。但这还是挨个跑可以改成并发版。离得远一点要看情况并发版依赖PowerShell 7.xWindows自带的5.1不支持ForEach-Object -Parallel你需要额外安装新版PowerShell或使用下面的基础版我平时就是装好了PowerShell 7再跑Get-Content ip.txt | ForEach-Object -Parallel { $ip $_ if (Test-Connection $ip -Count 1 -Quiet -ErrorAction SilentlyContinue) { $ip 在线 } else { $ip 不通 } } -ThrottleLimit 50参数-ThrottleLimit 50控制并发数量作用和xargs的-P 50一样。跑完后想让结果变成一份带时间、带状态的清单直接加一个导出$results Get-Content ip.txt | ForEach-Object -Parallel { $ip $_ [PSCustomObject]{ IP $ip Status if (Test-Connection $ip -Count 1 -Quiet -ErrorAction SilentlyContinue) { 在线 } else { 不通 } Time Get-Date -Format yyyy-MM-dd HH:mm:ss } } -ThrottleLimit 50 $results | Export-Csv -Path result.csv -NoTypeInformation -Encoding UTF8跑完打开目录下的result.csv每行一个IP在线不通一眼看清附上检测时间这正是运维表单最需要的样子。3.3 “因为在此系统上禁止运行脚本”的解决办法很多人在Windows上双击运行PS1脚本时会看到那句非常经典的话无法加载文件因为在此系统上禁止运行脚本。这其实不是脚本写错了而是系统默认执行策略在“保护”你。解决的办法是用管理员身份打开PowerShell执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUserRemoteSigned意思是本地脚本可以运行从网上下载的脚本必须有签名。这是最常用的折中方案既不影响使用又保留一点安全底线。如果公司电脑不让你改执行策略也可以不落地脚本文件直接在命令行窗口里一行行粘贴运行那样不受执行策略限制。4. 第三板斧Python脚本结果直接整理成Excel报表Shell和批处理适合“跑一遍看结果”但当你要把这套检测变成日常工作流比如周度巡检、月度资产复核或者要让不懂命令行的人也能用我建议直接上Python。4.1 为什么绕一圈最后还是选Python原因是它能把“检测”和“整理结果”两件事合并成一道工序。Shell能输出文本但要把结果整合成Excel、按状态排序、给不通的地址标红那得再费不少功夫。Python里一个openpyxl或pandas就搞定了。加上Python的线程池用起来非常顺手并发检测的逻辑比Shell简洁后期加需求也更方便。我日常用的检测脚本是这样的支持命令行参数传入IP文件支持控制线程数检测完自动生成CSV报告。4.2 先写一个能直接跑的检测脚本保存为ip_check.py脚本内容如下import csv import os import subprocess import sys import concurrent.futures from datetime import datetime def ping_ip(ip, timeout2): 跨平台执行ping返回是否在线 param -n if os.name nt else -c timeout_param -w if os.name nt else -W cmd [ping, param, 1, timeout_param, str(timeout * 1000 if os.name nt else timeout), ip] try: result subprocess.run(cmd, stdoutsubprocess.DEVNULL, stderrsubprocess.DEVNULL, timeouttimeout 2) return result.returncode 0 except Exception: return False def read_ip_list(file_path): 读取IP列表自动去掉空行和首尾空格 ips [] with open(file_path, r, encodingutf-8) as f: for line in f: ip line.strip() if ip: ips.append(ip) return ips def main(): input_file sys.argv[1] if len(sys.argv) 1 else ip.txt output_file sys.argv[2] if len(sys.argv) 2 else ip_result.csv threads int(sys.argv[3]) if len(sys.argv) 3 else 50 ip_list read_ip_list(input_file) results [] print(f待检测IP数量{len(ip_list)}并发线程{threads}) with concurrent.futures.ThreadPoolExecutor(max_workersthreads) as executor: future_to_ip {executor.submit(ping_ip, ip): ip for ip in ip_list} for future in concurrent.futures.as_completed(future_to_ip): ip future_to_ip[future] try: status future.result() except Exception: status False results.append({ IP: ip, 状态: 在线 if status else 不通, 检测时间: datetime.now().strftime(%Y-%m-%d %H:%M:%S) }) with open(output_file, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[IP, 状态, 检测时间]) writer.writeheader() writer.writerows(results) online_count sum(1 for r in results if r[状态] 在线) print(f检测完成在线{online_count}不通{len(results) - online_count}) print(f结果已保存到{output_file}) if __name__ __main__: main()这里的检测逻辑其实不复杂ping_ip函数把ping命令包了一层通过os.name判断当前平台Windows用-n和-wLinux/Mac用-c和-W保证一份脚本两边都能跑。read_ip_list负责把IP文件读成一个列表每一行都会strip掉空格。核心的并发检测在ThreadPoolExecutor里50个线程同时发起检测然后等结果全部回来最后写CSV。encodingutf-8-sig这个细节很关键因为Excel打开CSV时对UTF-8编码兼容不好不带上-sig后缀生成的CSV用Excel打开会出现中文乱码带上之后就不会。4.3 脚本之间怎么传参数配合其它工具用起来更顺有一个经常被提到的问题Python脚本怎么给另一个Python脚本传参数。其实上面这个脚本已经包含了标准做法。你在命令行里执行python ip_check.py ip.txt result.csv 50ip.txt、result.csv、50这三位参数分别被sys.argv[1]、sys.argv[2]、sys.argv[3]拿走。如果你是在另一个脚本里调用它用subprocess也能把参数带给它import subprocess subprocess.run([python, ip_check.py, ip.txt, 2025_result.csv, 80])这样设计的一个好处是检测脚本本身不需要改动换个IP文件、换个输出路径就完全适配另一套巡检任务灵活度比把参数写死在脚本里高得多。这也是我一直坚持的写法凡是要被反复使用的脚本路径、线程数、超时时间这些可变的量一律参数化。4.4 继续扩展检测IP之后还想看端口怎么办IP通只能说明主机活着很多故障场景是主机活着但业务死了所以端口检测是批量IP检测的天然进阶。在使用Python写检测脚本时增加端口检查非常简单import socket def check_port(ip, port, timeout2): sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) try: result sock.connect_ex((ip, port)) return result 0 except socket.error: return False finally: sock.close()这比ping更能反映真实业务可用性。比如一台Web服务器ping通了但80端口没起来就说明服务挂了SSH端口22通了说明这台机器至少还能接受远程登录。我建议把端口检查和ping结合起来先ping确认主机在线再连端口确认服务正常两层检测都过了才算真正“可用”。实际运用时可以把检测结果写成“IP、ping状态、端口状态、综合判断”四列一眼就知道该处理谁。5. 把常见的脚本运行报错一次讲清楚脚本写好了运行却一堆问题这是新手最容易卡住的地方。我结合平时看到的高频报错逐个说一遍你照着排查比到处搜快很多。5.1 报“无法将XX识别为cmdlet、函数、脚本文件或可运行程序的名称”比如常见的pip、git、cmake、claude这类命令在PowerShell里直接敲报错内容都是同一句话无法将“pip”项识别为cmdlet、函数、脚本文件或可运行程序的名称。这个问题的核心原因只有一个这个命令对应的可执行文件不在系统的环境变量Path里。系统找不到这个程序自然就报不认识它。解决办法分两步第一步确认程序确实装了第二步把它的安装路径加进Path。以Python为例你可以先看安装路径通常Windows下会在C:\Users\你的用户名\AppData\Local\Programs\Python\PythonXXX\Scripts或者在Python安装目录的Scripts子目录里。找到后打开系统环境变量设置把该路径新增到Path里重新打开命令行就能直接用了。另外更省事的方式是在安装Python时勾选“Add Python to PATH”选项但已经装好的机器只能老老实实去改环境变量。5.2 Windows提示“禁止运行脚本”这个就是第三节说过的PowerShell执行策略。除了手动改执行策略还可以试试在运行脚本时临时绕过powershell -ExecutionPolicy Bypass -File check.ps1Bypass表示本次运行完全跳过执行策略检查适合临时使用。但要注意绕过意味着不检查脚本内容正规工作场景里还是要谨慎对待来源不明的脚本。5.3 bat脚本双击闪退、中文乱码写批处理脚本最典型的问题是双击运行时窗口一闪就没你根本看不到报错信息。原因一般有三个脚本本身语法错误、ip.txt文件不存在、路径包含空格。我的调试习惯是先把脚本里的echo off注掉让它把每一条命令都打印出来或者先在cmd窗口里手动执行一遍不用双击这样窗口不会关闭报错信息会留在屏幕上。中文乱码则是编码不一致导致的经典问题ip.txt是UTF-8编码脚本是ANSI编码或者反过来。最稳妥的方案是统一使用UTF-8编码编辑所有文件并在批处理开头加上chcp 65001 nul。如果依然乱码那就检查一下你的ip.txt有没有被存成带BOM的UTF-8有时候带BOM也会捣乱。顺手一提编辑脚本不建议用Windows自带的记事本容易把编码搞乱推荐用VS Code或Notepad这类能明确控制编码的工具。5.4 ping不通就一定是宕机吗别急着下结论这是批量检测中最大的认知陷阱。很多时候IP检测结果是一条“不通”但现场实际状况完全不是那回事。最常见的原因是目标主机做了ICMP过滤防火墙把ping请求丢弃了或者目标主机的网络策略只开放业务端口不允许响应ICMP还有一种情况是IDC机房的交换机开启了防ping配置。遇到这类“假不通”我的排查习惯是先换协议验证拿同一个IP去测22、443或其它已知业务端口只要能连上说明主机和网络都没问题就是不让ICMP回应而已。所以检测结果中大量“不通”时不要急着断定大面积宕机先挑一两个地址做端口测试就能排除误判。5.5 从Excel复制的IP列表藏着看不见的坑手动把Excel里的IP粘贴到txt里经常出现看起来是三列每行都是一个IP但脚本跑起来却报错“找不到主机”。原因多半是Excel粘贴的内容里带了\r\n换行符或多余的tab空格有时候甚至还有一个看不见的零宽字符。这时用Python脚本里的strip()能处理掉大部分写在Shell里最好先过滤一遍sed -i s/\r$// ip.txt tr -d \r ip.txt ip_clean.txt这个命令把Windows格式的换行符去掉。养成“跑脚本前先清理IP列表”的习惯能避免很多奇怪问题。6. 把批量检测进化成自动巡检省下更多时间脚本写好了只是第一步。想让“省下来的时间”变成长期红利还得把它挂到定时任务里让机器每天早上自动替你跑一遍然后主动把异常结果推给你。6.1 任务计划程序与cron的配置Windows上我用的是“任务计划程序”。新建一个基本任务触发器选“每天”时间设成上班前半小时。操作里选“启动程序”程序填powershell.exe参数填-ExecutionPolicy Bypass -File D:\scripts\ip_check_day.ps1。这样一来你还没到工位检测已经做完了。Linux上更简单编辑一下crontabcrontab -e加入一行30 8 * * * cd /opt/ipcheck python ip_check.py ip.txt /var/reports/result_$(date \%F).csv 50每天8点30分自动执行一次结果文件名带日期方便留档不会把旧结果覆盖掉。6.2 检测结果主动通知而不是等你来看自动巡检要想真正发挥作用关键不在跑而在“发现问题主动喊你”。一个最简单的做法是让脚本在检测出不通的IP时自动把这些地址拼成一条消息发出来。你可以用企业微信机器人、钉钉机器人或飞书机器人原理都一样往一个特殊的Webhook地址发POST请求。以企业微信机器人为例在Python脚本后段接上这段即可import urllib.request import json def send_webhook(webhook_url, content): data json.dumps({msgtype: text, text: {content: content}}).encode(utf-8) req urllib.request.Request(webhook_url, datadata, headers{Content-Type: application/json}) urllib.request.urlopen(req) fail_list [r[IP] for r in results if r[状态] 不通] if fail_list: send_webhook(https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key你的key, 巡检发现以下IP不通\n \n.join(fail_list))这样即使没有人工盯着异常也能第一时间暴露。对于外包机房巡检、分支机构设备监控这类场景非常实用。6.3 从IP连通性扩展到业务可用性巡检真正用久了你会发现IP在线只是“它还活着”不代表“它在干活”。我最终把巡检脚本从纯ping升级到了两层检测先ping确认主机在线再针对常见业务端口做一次TCP连接。比如数据库服务器检查3306Web服务器检查80和443SSH服务器检查22。这个思路落实到Python脚本里就是在ping_ip函数之上再封装一层check_service函数把端口检测结果也写进CSV。这样一份报告出来每个IP后面带着“在线状态关键端口状态”领导要的“业务可用性概览”也就有了而这一切都是每天自动完成的。你可以按这个思路继续加需求比如检测DNS解析、检查HTTPS证书剩余天数脚本的框架完全不用动往里加函数就行。最后再分享个经验脚本这种东西别一次性写完就再也不管。刚开始跑的头几天一定多看看输出日志确认没有误报和漏报再让它进入无人值守状态。等真正稳定运行了你就会发现以前耗在挨个ping上的下午茶时间是真的可以拿回来了。