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

how to use shell variable in expect session?

我尝试使用 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中的每个元素)。

有人知道一些好主意吗?

希望对您有所帮助。

 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

对于shell的<< STRING语法,如果引用STRING那么它不会扩展变量所以你的$ip_addr仍然是$ip_addr Expect 脚本,但未在 Expect 中定义。您可以使用环境变量将 ip_addrshell 传递到 Expect。例如:

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