![](/img/trans.png)
[英]how to set bash variable in expect or return variable from expect to bash
[英]Passing variable to `expect` in bash array
我正在尝试使用FOR循环遍历IP地址(在bash数组中),登录,运行脚本然后退出。 该数组称为$ {INSTANCE_IPS [@]}。 但是,以下代码无法正常工作,因为expect
似乎无法接受$ instance变量。
for instance in ${INSTANCE_IPS[@]}
do
echo $instance
/usr/bin/expect -c '
spawn ssh root@$instance;
expect "?assword: ";
send "<password>\r";
expect "# ";
send ". /usr/local/bin/bootstrap.sh\r";
expect "# ";
send "exit\r" '
done
但是, expect
抱怨:
can't read "instance": no such variable
while executing
"spawn ssh root@$instance"
有在位于计算器另一个问题在这里 ,使用环境变量来实现这一点,但是它不允许像我可以在一个阵列我通过不同的IP地址进行迭代。
任何帮助表示赞赏。
干杯
问题在于报价。 围绕整个块的单引号不允许Bash扩展变量( $instance
)。
您需要切换到双引号。 但是然后,不允许在双引号内使用双引号(除非您将其转义),因此最好使用带有expect
字符串的单引号。
请尝试:
for instance in ${INSTANCE_IPS[@]}
do
echo $instance
/usr/bin/expect -c "
spawn ssh root@$instance;
expect '?assword: ';
send '<password>\r';
expect '# ';
send '. /usr/local/bin/bootstrap.sh\r';
expect '# ';
send 'exit\r' "
done
for instance in ${INSTANCE_IPS[&]} ; do
echo $instance
/usr/bin/expect -c '
spawn ssh root@'$instance' "/usr/local/bin/bootstrap.sh"
expect "password:"
send "<password>\r"
expect eof'
done
在ssh手册页中:
If command is specified, it is executed on the remote host instead of a login shell.
指定命令意味着期望不必等待#
执行程序,然后等待另一个#
仅发送命令exit
。 相反,当您指定要使用ssh的命令时,它将执行该命令。 完成后退出; 然后ssh自动关闭连接。
或者,将值放在环境中,并期望在那里找到它
for instance in ${INSTANCE_IPS[&]} ; do
echo $instance
the_host=$instance /usr/bin/expect -c '
spawn ssh root@$env(the_host) ...
旧线程,也是其中的一个,但我已经在expect
工作了几天。 对于遇到此问题的任何人,我相信我已经找到了一个可行的解决方案,可以解决在expect -c
脚本中传递bash
变量的问题:
#!/usr/bin/env bash
password="TopSecret"
read -d '' exp << EOF
set user "John Doe"
puts "\$user"
puts "$password"
EOF
expect -c "$exp"
请注意,转义引号通常是一个引用的问题(如上面的@Roberto Reale所述), 在将bash-variable-evaluated字符串传递给expect -c
之前 ,我已经使用heredoc
EOF
方法解决了该问题。 与转义引号相反, 所有本机的expect
变量都需要使用\\$
进行转义 (我不是在这里解决所有第一手问题,我的下午时间安排很挤),但这应该可以大大简化问题努力。 如果您对此概念证明有任何疑问,请告诉我。
tl; tr:一直在使用用户身份验证创建[ expect
]守护程序脚本,并且在我花了一整天时间创建单独的bash / expect脚本,并分别使用不同的/dev/random
salt加密提示的密码(通过bash) 后 ,才弄清楚了这一点迭代,将加密的密码保存到临时文件中,然后将salt传递给Expect脚本(强烈劝阻任何人不要通过ps
轻易地找到密码,但不能阻止,因为可以替换期望脚本)。 现在,我应该能够有效地将其保留在内存中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.