Shebang导致脚本失败

时间:2014-04-01 07:31:42

标签: linux bash shell ssh

我在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

1 个答案:

答案 0 :(得分:2)

您正在混合使用bashexpect,这两种语言完全不同。您可能希望有一个bash包装器脚本,其中包含正确的选项处理(请参阅getopts),其中包含IP地址列表,并为传递给您{{{}的每个IP地址执行expect脚本。 1}} - 包装。如果您的bash脚本很小,您可能希望将其嵌入到shell脚本中,而不是将其嵌入到单独的文件中。

编辑:

expect