如何在expect会话中使用shell变量?

时间:2016-11-02 09:36:54

标签: bash shell expect

我尝试在bash脚本中使用scp向多个服务器发送一些文件。 但我遇到了问题。

这是我写的shell脚本。

#!/bin/sh

IP_LIST=('127.0.0.x' '127.0.0.y' '127.0.0.z')

for ip_addr in "${IP_LIST[@]}"
do
        echo "$ip_addr"
expect << 'EOS'
        set timeout 10
        spawn scp -p /home/foo/bar/baz.txt user@"$ip_addr":/home/destdir
        expect "*password*"
        send "pasword\r"
        expect eos
        exit 0
EOS
done

我假设ip_addr中的每个元素都分配给变量ip_addr, 但是在expect会话中,列表中的元素没有被分配。

执行此脚本时,会出现此类错误消息。

can't read "ip_addr": no such variable  
    while executing
"spawn scp -p /home/foo/bar/baz.txt user@"$ip_addr":/home/destdir"

使用echo命令时显示(显示IP_LIST中的每个元素)。

有人知道一些好主意吗?

2 个答案:

答案 0 :(得分:3)

对于 shell << STRING语法,如果引用了STRING,则它不会展开变量,因此$ip_addr仍为$ip_addr Expect 脚本,但它没有在 Expect 中定义。您可以使用env var将ip_addr shell 传递到 Expect 。 E.g:

#!/bin/sh

IP_LIST=('127.0.0.x' '127.0.0.y' '127.0.0.z')

for ip_addr in "${IP_LIST[@]}"
do
    echo "$ip_addr"
    ip_addr=$ip_addr expect << 'EOS'
      set timeout 10
      spawn scp -p /home/foo/bar/baz.txt user@$::env(ip_addr):/home/destdir
      expect "*password*"
      send "pasword\r"
      expect eos; # do you mean `eof'?
      exit 0
EOS
done

答案 1 :(得分:-2)

希望这有帮助。

 IP_LIST=('127.0.0.x' '127.0.0.y' '127.0.0.z')

 for ip_addr in "${IP_LIST}"
 do
         echo "$ip_addr"
 expect << 'EOS'
         set timeout 10
         spawn scp -p /home/foo/bar/baz.txt user@"$ip_addr":/home/destdir
         expect "*password*"
         send "pasword\r"
         expect eos
         exit 0
 EOS
 done
相关问题