我在bash上非常糟糕,我尝试使用openSSH创建一个连接所有交换机的脚本,以便进行一些配置。
我创建了一个包含所有25个交换机的数组,然后我使用了一个循环来打开每个交换机的SSH连接。
当我在Windows上使用bash时,我刚刚安装了Cygwin。
然而,我不得不使用expect并以纯文本写密码,因为交换机非常差,这对我来说是最好的方式(我不会手动将RSA密钥放在每个交换机上,因为它会我花了很多时间在每个开关上手动编写配置。)
我使用shebang#!/ usr / bin / expect -f使bash识别expect。当我这样做时,期望语法(spawn,expect,interact)工作得很好,但我的数组不起作用。
我收到以下错误消息:
关闭引用后的额外字符 执行" arrayname =(" 172.21.21.20"" 172.20.55.55" ..."
当我更改shebang并使用#!/ bin / bash时,不再找到expect:
./ stationsnmp.sh:line 20:spawn:找不到命令无法读取 ./stationsnmp.sh:line 24:send:找不到的命令无法读取 file" assword ":没有这样的文件或目录./stationsnmp.sh:27行: 发送:找不到命令./stationsnmp.sh:line 28:interaction: 命令未找到
我真的不是bash的专业人士,这说明我无法解决这个小问题......欢迎提供一些帮助。
编辑:以下是我的代码的一部分
#!/bin/bash
switch=("172.20.0.229" "172.20.0.232" "172.20.0.233" "172.21.0.15" "172.21.0.16" "172.21.2.1" "172.20.2.250" "172.21.3.1" "172.20.3.250" "172.21.4.1" "172.20.4.250" "172.21.6.1" "172.20.6.250" "172.21.7.1" "172.20.7.250" "172.21.8.1" "172.20.8.250" "172.20.9.250" "172.21.9.1" "172.21.10.1" "172.20.10.250" "172.21.11.1" "172.20.11.250" "172.21.12.1" "172.21.12.250")
nmb=`echo ${#switch[@]}`
set timeout 3
for ((ii=0; ii<=$nmb; ii++))
#for ii in {0..${#switch[@]}}
do
if [ ${switch[$ii]:5:1} -eq 1 ]
then
ipdc=`echo ${switch[ii]} | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.'`"10"
spawn ssh admin@switch[$ii]
expect "*assword*"
send "PASS\r"
interact
exit
fi
done
答案 0 :(得分:2)
您正在混合使用bash
和expect
,这两种语言完全不同。您可能希望有一个bash
包装器脚本,其中包含正确的选项处理(请参阅getopts
),其中包含IP地址列表,并为传递给您{{{}的每个IP地址执行expect
脚本。 1}} - 包装。如果您的bash
脚本很小,您可能希望将其嵌入到shell脚本中,而不是将其嵌入到单独的文件中。
编辑:
expect