在 bash 中使用 expect 通过 SCP 更新 IOS

Updating IOS's via SCP in bash with expect

美好的一天。我正在尝试 create/run 一个脚本,该脚本允许我将更新的 IOS 从服务器发送到我的网络设备。当我在“:flash”命令之前输入手动 IP 地址时,以下代码有效。

 #!/user/bin/expect
 set IOSroot "/xxxxx/xxx/c3750e-universalk9-mz.150-2.SE10a.bin"
 set pw xxxxxxxxxxxxxxxxxxx

 spawn scp $IOSroot 1.1.1.1:flash:/c3750e-universalk9-mz.150-2.SE10a.bin

 expect "TACACS Password:"
 send "$pw\r"
 interact

那里的代码工作得很好,符合预期。当我尝试将名为 "ioshost" 的文件与 IP 列表一起使用并在此脚本中使用它来获得一些自动化时,问题就出现了。我已经尝试了各种方法来让它工作。其中一些如下:

设置变量

IPHosts=$(cat ioshost)

set IPHost 'cat ioshost'

在尝试使用 read/do 命令的同时...

while read line; do
spawn scp $IOSroot $line:flash:/c3750e-universalk9-mz.150-2.SE10a.bin
done < ioshost

None 这些似乎有效,我正在寻找指导。请注意,我知道设置密码不是最佳做法,但不允许像其他文章中提到的那样设置 RSA 密钥,所以我不得不这样做。

感谢您的宝贵时间。

您可以使用一个 Expect 脚本和一个 Bash 脚本。

首先稍微更新一下您的 Expect 脚本:

#!/user/bin/expect
set IOSroot "/xxxxx/xxx/c3750e-universalk9-mz.150-2.SE10a.bin"
set pw xxxxxxxxxxxxxxxxxxx

spawn scp $IOSroot [lindex $argv 0]:flash:/c3750e-universalk9-mz.150-2.SE10a.bin
#                  ^^^^^^^^^^^^^^^^

expect "TACACS Password:"
send "$pw\r"
interact

然后写一个简单的Bashfor循环:

for host in $(<ioshost); do
    expect /your/script.exp $host
done