我刚刚编写了一个脚本来自动将Cisco设备备份到指定的文件夹。 /家庭/名为myUsername /备份
我想要完成的是让脚本每周运行一次,将输出转储到Backups文件夹中,但不要覆盖它们,而是将旧配置存储在单独的目录中。如果可能的话,我们希望保留1个月的备份。当脚本运行并写入新输出时,先前的副本将沿文件树向下移动。文件树看起来像这样:
/Backups(newest backup)
--1_Week_Old
--2_Weeks_Old
--3_Weeks_Old
--4_Weeks_Old
以下是我编写的现有脚本的示例。它运作良好,但我知道它可以通过一些获得的经验缩短。我是脚本新手,所以很容易....
#!/usr/bin/expect
set timeout 20
# These are all the IP's:
set ip1 "X.X.X.X"
#These are all the hostnames:
set hostname1 "ASA_Firewall"
#These are the usernames
set username "RickyBobby"
# These are all the passwords:
set password "xxxxxxx"
set enableasa "xxxxxxxxx"
#This is the ASA Firewall - Point TFTP Directory to C:\cygwin\home\RickyBobby\Backups
spawn ssh $ip1
expect "password:"
send "$password\r"
expect ">" {
send "en\n"
expect "Password:"
send "$enableasa\r"
}
expect "#"
send "copy run tftp://X.X.X.X/Backups/$hostname1-confg\r"
expect "Source filename?"
send "\r"
expect "Address or name of remote host?"
send "X.X.X.X\r"
expect "Destination filename?"
send "\r"
expect "#"
send "exit\r"
我仍在学习中,所以任何帮助都会受到高度赞赏。谢谢!
答案 0 :(得分:0)
我会使用一系列目录重命名命令来完成此操作。假设您可以删除“第4周”目录中的任何内容:
cd /home/username/Backups
file delete -force ./4_Weeks_Old
file rename 3_Weeks_Old 4_Weeks_Old
file rename 2_Weeks_Old 3_Weeks_Old
file rename 1_Week_Old 2_Weeks_Old
# move files in Backups to 1 week dir
file mkdir 1_Week_Old
file rename -- {*}[glob -types f -- *] 1_Week_Old
如果您的expect版本的Tcl早于8.5版,则必须使用
移动文件for file [glob -types f -- *] {
file rename $f 1_Week_Old/$f
}
或丑陋的
set cmd [linsert [glob -types f -- *] 0 file rename --]
eval [lappend cmd 1_Week_Old]
如果恰好有以破折号开头的文件名,我会使用--
,因此该文件名将被视为文件名,而不是选项。
您的期望脚本看起来不错。一个提示:在开发一个期望脚本时,要么使用“expect -d”运行它,要么在开头附近添加这一行:exp_internal 1
- 这会打开详细的调试输出,这样你就可以看到你的模式是如何匹配的。 / p>