需求
大致需求是登录一个新的命令行,然后批量执行命令,但ip不同。本来打算用python写的,但是登录新的命令行需要安装pexpect包,由于需要在设备上跑,所以采用expect命令来实现登录功能,但是使用shell脚本配合expect命令登录传参特别不方便。每次下发命令需要重复登录,很麻烦,查资料得知expect脚本是采用的tcl脚本语言编写,因此我们采用tcl来写这个脚本
实现
#!/usr/bin/expect
#起始ip地址
set start_ip [lindex $argv 0]
#运行次数
set run_time[lindex $argv 1]
#数字转ip
proc num2ip {num} {
set a [expr $num>>24&0xff;]
set b [expr $num>>16&0xff;]
set c [expr $num>>8&0xff;]
set d [expr $num&0xff;]
return $a.$b.$c.$d
}
#ip转数字
proc ip2num(ip) {
set num 0
set tmp_obj [lreverse [split $ip .] ]
for {set i 0} {$i < 4} {incr i} {
set num [expr {256 ** $i * [lindex $tmp_obj $i]} + $num]
}
return $num
}
#通过传递的起始ip地址计算出对应的num
set start_num [ip2num $start_ip]
#计算循环的边界
set end_num [expr $run_time + $start_num]
#登录程序
spawn /usr/bin/login root
#输入密码,这块的Password需要根据弹出的东西来填写
expect {
"Password:" {send "root\n"}
}
for {set i $start_num} {$i < $end_num} {incr i} {
set ip [num2ip $i]
#这里只是举个例子,命令自己组织
set cmd "route add $ip\n"
#跟输入密码处同理,需要根据自己环境来配置
expect {
"#" {send $cmd}
}
}
运行
chmod 777 demo.sh
./demo.sh 1.1.1.1 1000
总结
第一次写tcl脚本,网上资料很少,有很多坑,比如{的左边要有空格,}的右边要有空格,希望有需要的同学可以开箱即食。