我尝试在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
中的每个元素)。
有人知道一些好主意吗?
答案 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