繁体   English   中英

在bash数组中将变量传递给`expect`

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM