how to use shell variable in expect session?

假如想象 提交于 2021-02-08 11:57:21

问题


I try so send some files toward multiple servers using scp in bash script. But I encountering problem.

here is the shell script I wrote.

#!/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

I assume each element in ip_addr is assigned to the variable ip_addr, but in expect session, element in the list doesn't assigned.

When I execute this script, such error message appear.

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

It works when use echo command(displays each element in IP_LIST).

anybody know some good idea?


回答1:


For shell's << STRING syntax, if STRING is quoted then it'll not expand variables so your $ip_addr is still $ip_addr to the Expect script but it's not defined in Expect. You can pass the ip_addr from shell to Expect with the env var. 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



回答2:


Hope this helps.

 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


来源:https://stackoverflow.com/questions/40376587/how-to-use-shell-variable-in-expect-session

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!