systemime 发表于 2019-1-3 19:44

[python+Bat]读表修改机房IP

本帖最后由 systemime 于 2019-1-4 08:32 编辑

技术渣渣,勿喷

使用Python+bat读取IP表修改机房机器IP


先说一下不足

[*]机房系统,保证兼容性,不装Python,所以不采用bat脚本调用py脚本获取返回值的用法
[*]py脚本打包调用bat,涉及管理员权限传参不正常,不采用
[*]纯bat脚本对字符串处理能力真的是极其糟糕,不想调试了
[*]纯python在网卡选择判断上简直写的心累,干脆混合写,发挥各自优势
[*]使用效率慢一点的方法,通过文本传参,这一点大佬勿喷,望传授经验


机房大约80台机器,修改原联想IP分配工具因驱动问题不能运行,网上已有批量修改工具均达不到理想效果,顾采用单机脚本设置开机自启的方法



[*]首先获取整个机房的Mac地址,全部开机状态下对局域网扫描,网上很多方法,不累赘叙述
[*]为每个Mac在Ttxt中写好一个IP,格式如下:
1**.30.132.102 d8-cb-8a-0b-17-44
1**.30.132.103 d8-cb-8a-0a-d8-73
中间使用tab或空格隔开
[*]编写bat,Python代码
[*]打包自解压程序exe,
[*]在机房设置开机自启然后同传

Python代码如下:(代码中ip部分字段用*号已隐藏)
#此代码需要以管理员方式运行
import uuid
import re
import os
try:
    address = hex(uuid.getnode())
    mac = '-'.join(address for i in range(0, len(address), 2))
    print(mac)
except:
    print("all Error!!!")
    os.system("pause")
    exit()
   
try:
    f = open('./ip.txt')
    lines = f.readlines()
except:
    print("file read error!!!")
    os.system("pause")
    exit()
else:
    f.close()
    l_list = lines

for l in l_list:
    if mac.lower() in l:
      try:
            local_ip = re.findall(r"((?:(?:25|2\d|(?:1\d{2}|?\d))\.){3}(?:25|2\d|(?:1\d{2}|?\d)))",l)
            get_ip = ''.join(local_ip)
            print(get_ip) # str(local_ip)
      except:
            print("Get ip error!!!")
            os.system("pause")
            exit()
      with open('local.txt', 'w') as f:
            f.write(get_ip)
      f.close()
      exit()
print("未找到改IP")
os.system("pause")
exit()


其中ip.txt为提前准备好的ip与Mac对应文本,local.txt用于传参(除去我上面提到的方法外,暂时只能想起这一个方法,不喜勿喷)


bat脚本如下:(代码中ip部分字段用*号已隐藏)
@echo off

cd /d "%~dp0"

cacls.exe "%SystemDrive%\System Volume Information" >nul 2>nul

if %errorlevel%==0 goto Admin

if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"

echo Set RequestUAC = CreateObject^("Shell.Application"^)>"%temp%\getadmin.vbs"

echo RequestUAC.ShellExecute "%~s0","","","runas",1 >>"%temp%\getadmin.vbs"

echo WScript.Quit >>"%temp%\getadmin.vbs"

"%temp%\getadmin.vbs" /f

if exist "%temp%\getadmin.vbs" del /f /q "%temp%\getadmin.vbs"

exit

:Admin



color 70

echo Start....
start "" "NIP_Get.exe"
echo 如果我卡住,不要管我,一切正常!!!不要关闭!!!
ping 1**.30.132.1 -n 4
::上面一句话用于延时,ping了下网关,改成自己的或者换种延时方式都行
set /p local_IP=<local.txt
echo 下面任何报错都不用管,一切正常
netsh interface ipv4 set address name="本地连接" source=static addr=%local_IP% mask=255.255.255.0 gateway=1**.30.132.1 gwmetric=0 >nul
echo 正在添加本机首选DNS服务器...
netsh interface ipv4 set dns name="本地连接" source=static addr=2**.1**.1**.3 register=PRIMARY
echo 正在添加备用DNS服务器...
netsh interface ipv4 add dns name="本地连接" addr=2**.1**.1**.3
echo 检查当前本机配置...
ipconfig /all

cls
echo 检查完成,IP已修改

echo

pause

这些便是全部内容,通过py脚本读取txt文本,然后写入另一个文本进行传值,由bat脚本读取最后修改,其中NIP_Get.exe为NIP_Get.py打包成exe的程序
py脚本打包命令如下:
在其所在目录DOS下,pyinstaller -F NIP_Get.py,不加 -F时可以带上链接库,有些老系统不会报错,需要提前安装pyinstaller库
通过winrar可以将上述两个代码加上ip.txt打包成exe,
在机房主机上创建任务计划程序开机自启(方法不累赘叙述,百度一下)
找个时间同传一下,问题解决,不介意再装python的话可以免打包py脚本,调整一下bat脚本即可


渣渣请大佬勿喷,多传授修改经验



然后机房乱IP问题就解决了,望各位大神提些参考意见,:lol,

脚本链接如下,估计也没几个下载,哈哈



望安
--------------------------------------------------------
自动修改计算机名:出处csdn
如果说修改到改机器名的话,如下操作
set /p cname=请输入计算机名:,这句话是让用户输入,如果想自动改成自己需要的,这句话改成 cname = CZXT,CZXT是我计算机名称,或者,按照编号来的话,提取ip后三位或两位,把cname赋值
期末回来再更新
以下为转载的,无需重启改用户名的bat脚本

拷贝一下脚本到.bat文件,双击运行即可,有交互式提示输入新的计算机名



@ ECHO OFF
color 0A
ECHO ----------------------------------------------------------------------------
ECHO.
ECHO 版权所有 copyright of @@@@@@@@@
ECHO.
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO.
:name
set /p cname=请输入计算机名:

echo REGEDIT4 >c:\windows\reg.reg

echo >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "ComputerName"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "ComputerName"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "ComputerName"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "NV Hostname"="%cname%" >> c:\windows\reg.reg
echo "Hostname"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo @="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "ComputerName"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "NV Hostname"="%cname%" >> c:\windows\reg.reg
echo "Hostname"="%cname%" >> c:\windows\reg.reg

echo >> c:\windows\reg.reg
echo "DefaultDomainName"="%cname%" >> c:\windows\reg.reg
echo "AltDefaultDomainName"="%cname%" >> c:\windows\reg.reg

regedit /s c:\windows\reg.reg
cmd
---------------------

原文:https://blog.csdn.net/jiangqin115/article/details/50813534

systemime 发表于 2019-1-4 06:48

sdzdp 发表于 2019-1-3 20:30
怎么自动修改计算机名?

那种脚本在机房环境下很麻烦啊,一般都是要重启,同传一遍机器名相同了,因为还原系统的原因除非你再花时间把还原关闭,等脚本运行完以后再把保护开开,机房上百台机器如果是多系统的话还得一台一台选系统进入,,,,感觉会累死,,,,一般都是自带的原厂还原系统可以做的很好,,,,,真需要的话:https://blog.csdn.net/jiangqin115/article/details/50813534,把里面的cname写死

systemime 发表于 2019-1-4 06:50

cc78947 发表于 2019-1-3 23:31
等于说要拷到每台机子上运行一次,

现在的交换机应该都有客户端的,可以设置固定的IP,然后每台机子配 ...

原本是由联想保护系统自动分配的,但是现在因为到保修期,它所必须的驱动装不上了,而且要求按照机器摆放顺序进行IP分配,所以只能出此下策

君月栩 发表于 2019-1-4 11:54

感谢楼主分享

systemime 发表于 2019-1-4 06:52

cc78947 发表于 2019-1-3 23:31
等于说要拷到每台机子上运行一次,

现在的交换机应该都有客户端的,可以设置固定的IP,然后每台机子配 ...

学校给机房分配的11年的交换机,功能上大概有点落后

systemime 发表于 2019-1-4 06:43

激动的石榴 发表于 2019-1-3 20:28
可不可以理解为 从文件中获取自己的mac地址然后设置对应自己mac的IP

是的,因为老师要求IP必须按照机器摆放顺序排列,所以这样弄也是没办法的事

cc78947 发表于 2019-1-3 23:31

等于说要拷到每台机子上运行一次,

现在的交换机应该都有客户端的,可以设置固定的IP,然后每台机子配置成系统分配,不设置固定ip

cc78947 发表于 2019-1-3 22:54

读文件,确实是解耦的方式

℡小疯、 发表于 2019-1-3 22:43

之前我做运维的时候或许可以用到,不过现在离职了

bdsdwbdhdcdhd 发表于 2019-1-3 21:07

感谢分享
页: [1] 2
查看完整版本: [python+Bat]读表修改机房IP