如何在期望会话中使用 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_addr
从 shell 传递到 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
我尝试使用 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_addr
从 shell 传递到 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