如何用脚本批量添加TACACS用户?——从原理到实战
目录导读
-
为什么需要脚本批量添加TACACS用户?

- 传统手动添加的痛点
- 脚本自动化带来的效率提升
-
TACACS+认证核心原理回顾
- 协议架构与用户数据库存储
- 常见配置方式对比(CLI vs 文件注入)
-
脚本批量添加TACACS用户的四种方法
- Expect脚本自动交互(适用于旧版设备)
- Bash+CSV文件批量生成配置
- Python + Netmiko库实现多厂商兼容
- 直接修改TACACS服务器数据库(如RADIUS兼容模式)
-
实战案例:使用Python脚本批量添加500个用户
- 准备工作:环境搭建与文件格式
- 脚本核心代码解析
- 执行结果验证与常见错误处理
-
安全与性能考量
- 密码策略与加密存储
- 脚本执行频率与设备负载
-
问答专区
- Q1: 脚本添加用户后,是否需要重启TACACS服务?
- Q2: 如何防止脚本重复添加已有用户?
- Q3: 脚本能否支持不同TACACS厂商(例如Cisco、Aruba、FreeRADIUS)?
为什么需要脚本批量添加TACACS用户?
在传统企业网络中,当网络设备数量超过200台时,手动逐台执行命令添加TACACS用户无异于灾难。一位资深网络工程师曾统计:手动添加100个用户到10台核心交换机,平均耗时需要6小时,且出错率高达15%(如密码敲错、权限组名写错),而采用脚本批量添加后,同样任务可以压缩到5分钟内完成,误差率接近于零。
核心痛点:
- 多设备重复劳动:每台设备需重复相同的
username命令 - 权限不一致:手工操作容易遗漏某个设备的特殊权限组
- 密码管理混乱:临时密码记录在纸质文档或Excel中,安全性低
脚本优势:
- 一次编写,多次复用(通过CSV、YAML等配置文件调整用户列表)
- 自动校验:脚本可检测用户是否已存在,避免冲突
- 支持标准化:批量推送时统一密码复杂度与加密算法
TACACS+认证核心原理回顾
TACACS+协议(Terminal Access Controller Access-Control System Plus)是Cisco等厂商广泛使用的AAA协议,其用户数据库通常存储在:
- 本地设备Flash:通过
username命令写入running-config - 外部TACACS服务器:如Cisco ACS、FreeRADIUS、ISE,数据库可基于LDAP或SQL
关键差异:
脚本批量添加的方向不同,本文重点讲解第一种场景——通过脚本向网络设备本地配置注入用户,因为这是日常运维中最频繁的操作,第二种场景(修改TACACS服务器数据库)通常由安全团队通过API或SQL语句完成,更适合用Python结合Requests库操作。
脚本批量添加TACACS用户的四种方法
Expect脚本自动交互(适用于旧版设备)
#!/usr/bin/expect
set device "192.168.1.1"
set username "admin"
set password "cisco"
spawn ssh $username@$device
expect "Password:" { send "$password\r" }
expect "#" { send "config t\r" }
send "username user1 privilege 15 password 0 test123\r"
send "end\r"
send "write memory\r"
expect "#" { send "exit\r" }
缺点:每台设备需单独修改IP,且难以处理大量用户。
Bash+CSV文件批量生成配置(推荐)
#!/bin/bash
# prepare_users.csv格式: username,privilege,password
# 执行前先检测CSV文件是否存在
input_file="users.csv"
if [ ! -f "$input_file" ]; then
echo "错误:用户文件不存在"
exit 1
fi
# 循环读取每行,生成完整的配置块
while IFS=',' read -r user priv pass
do
# 添加权限检查
if [ "$priv" -lt 1 ] || [ "$priv" -gt 15 ]; then
echo "警告:$user 的权限值 $priv 不在1-15范围,已跳过"
continue
fi
echo "username $user privilege $priv password 0 $pass"
done < "$input_file" > output_config.txt
优点:生成纯配置文本,可手动复制粘贴或多设备批量推送。
Python + Netmiko库(多厂商兼容)
from netmiko import ConnectHandler
import csv
devices = [
{"device_type": "cisco_ios", "ip": "192.168.1.1", "username": "admin", "password": "cisco"},
# 可扩展多个设备
]
with open('users.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for device in devices:
connection = ConnectHandler(**device)
for row in reader:
config_commands = [f"username {row['username']} privilege {row['privilege']} password 0 {row['password']}"]
connection.send_config_set(config_commands)
print(f"已添加用户 {row['username']} 到 {device['ip']}")
connection.disconnect()
注意事项:需提前安装netmiko和paramiko库,且CSV文件首行必须包含username,privilege,password。
直接修改TACACS服务器数据库(如FreeRADIUS)
对于使用FreeRADIUS的企业,可以通过SQL语句批量插入:
INSERT INTO radcheck (username, attribute, op, value) VALUES
('user1', 'Cleartext-Password', ':=', 'pass123'),
('user2', 'Cleartext-Password', ':=', 'pass456');
此方法需要数据库权限,适合与内部HR系统对接的自动化场景。
实战案例:使用Python脚本批量添加500个用户
准备工作
- 生成500个用户的CSV文件(示例生成脚本):
for i in $(seq 1 500); do echo "user$i,15,random$(openssl rand -base64 8)" done > users.csv
- 安装依赖:
pip install netmiko
核心脚本(含错误处理)
from netmiko import ConnectHandler
import csv, logging, sys
logging.basicConfig(filename='tacacs_add.log', level=logging.INFO)
device_params = {
'device_type': 'cisco_ios',
'ip': '192.168.100.1',
'username': 'netadmin',
'password': 'cisco123',
'timeout': 30 # 增加超时时间
}
try:
conn = ConnectHandler(**device_params)
except Exception as e:
logging.error(f"连接失败: {e}")
sys.exit(1)
with open('users.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
# 检查用户是否已存在
check_cmd = f"show run | include username {row['username']}"
output = conn.send_command(check_cmd)
if row['username'] in output:
logging.warning(f"用户 {row['username']} 已存在,跳过")
continue
# 批量配置
cmd = f"username {row['username']} privilege {row['privilege']} password 0 {row['password']}"
conn.send_config_set([cmd])
logging.info(f"成功添加用户 {row['username']}")
conn.send_command('write memory')
conn.disconnect()
logging.info("所有用户添加完成")
验证结果
- 在设备上执行
show users | count可查看用户总数 - 日志文件
tacacs_add.log会记录每个用户的添加状态
安全与性能考量
| 安全维度 | 建议措施 |
|---|---|
| 密码加密 | 脚本中避免使用password 0,改用password 7或secret加密命令 |
| 传输加密 | 使用SSH而非Telnet连接设备 |
| 权限隔离 | 脚本运行账号应仅具有读写本地配置的权限 |
| 日志审计 | 每次执行记录操作时间、设备IP、执行人(通过系统环境变量) |
性能注意:如果网络设备数量超过50台,建议加入timeout=60参数,并分批执行(每批10台),避免单个设备配置延迟影响整体。
问答专区
Q1: 脚本添加用户后,是否需要重启TACACS服务?
不需要,网络设备(如Cisco IOS/ NX-OS)中的本地用户是实时生效的,无需重启任何服务,但如果修改的是外部TACACS服务器数据库(如FreeRADIUS),则需要重载radiusd -X服务或等待自动同步间隔。
Q2: 如何防止脚本重复添加已有用户?
建议在脚本中加入预检查逻辑(如案例中的show run | include username),或使用username add命令的唯一性检测,更严谨的做法是:在脚本启动时备份当前配置,一旦重复添加导致配置混乱,可一键回滚。
Q3: 脚本能否支持不同TACACS厂商(例如Cisco、Aruba、FreeRADIUS)?
完全可以,Netmiko库支持超过50种网络设备类型,只需在device_type参数中修改对应值:
- Cisco IOS:
cisco_ios - Aruba AOS:
aruba_os - FreeRADIUS服务器:需通过SQL API或
radclient工具(需单独编写调用库)
脚本设计时应将device_type和config_command作为外部变量传入,实现多厂商适配。
本文著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。