期望命令在bash脚本中失败

时间:2016-05-23 23:03:04

标签: linux bash shell ssh expect

我一直在调整这个问题,而且我遇到了一个奇怪的输出流而没有结果。基本上,我试图在我们的扩展网络上找到具有特定密码和处理器的某些ssh设备。这是脚本:

#/bin/bash
for i in 54
do
  for j in 1 13 14 15
  do
    out=$(expect -c "spawn /usr/bin/ssh some_guy@10.2.$i.$j cat /proc/cpuinfo | grep MyString
      expect {
        -re \".*Are.*.*yes.*no.*\" {
        send \"yes\n\"
        exp_continue
        }

        \"*?assword:*\" {
        send \"mypasswd\"
        send \"\n\"
        exp_continue
        }
      }")
    if [["$out" != ""]]
    then
      echo "10.2.$i.$j" >> rpiout.txt
    fi
  done
done

ssh命令单独工作,很好。此外,期望脚本工作正常。如果我插入" echo $ out"就在["如果[[...]]"之前声明,我从SSH命令获得预期的输出。但是,尝试编写该文件时,我将此输出发送到命令行并且没有日志文件......:

./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.1 cat /proc/cpuinfo | grep MyString
some_guy:@10.2.54.1's password:
Permission denied, please try again.
some_guy:@10.2.54.1's password:
Permission denied, please try again.
some_guy:@10.2.54.1's password:
: No such file or directoryy,password).
./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.13 cat /proc/cpuinfo | grep MyString
some_guy:@10.2.54.13's password:
: No such file or directory
./check.sh: line 19: [[spawn /usr/bin/ssh some_guy:@10.2.54.14 cat /proc/cpuinfo | grep MyString
some_guy:@10.2.54.14's password:
: No such file or directory
: No such file or directoryawn /usr/bin/ssh some_guy:@10.2.54.15 cat /proc/cpuinfo | grep MyString

第一个要求密码3次的是正确的(因为它不是目标设备之一)。第二个是不存在的IP设备,但最后两个应该返回一个肯定的结果。

请注意"错误" " ./ check.sh:19行:[[spawn ...",第19行是以&#34开头的那个;如果[[..."。

非常感谢帮助我摆脱困境的任何帮助!!

1 个答案:

答案 0 :(得分:1)

bash [[中的

不只是语法,而是命令。与任何其他命令一样,它需要空格来将其与参数分开。

if [["$out" != ""]]

if [[ "$out" != "" ]]

if [[ -n "$out" ]]

此外,由于预期的方式会像您在终端上看到的那样回应命令,因此输出永远不会为空。尝试这样的事情:

out=$( expect <<END
    spawn -noecho /usr/bin/ssh some_guy@10.2.$i.$j sh -c {grep -q MyString /proc/cpuinfo || echo _NOT_FOUND_}
    expect {
        -re ".*Are.*.*yes.*no.*" {
            send "yes\r"
            exp_continue
        }
        "*?assword:*" {
            send "mypasswd\r"
            exp_continue
        }
        eof
    }
END
)

if [[ $out == *_NOT_FOUND_* ]]; then
    echo "MyString not found on host 10.2.$i.$j"
fi

其中_NOT_FOUND_是您在/ proc / cpuinfo

中看不到的字符串

-noecho对于保持“_NOT_FOUND_”超出$ out非常重要,除非你回应它。