如何在expect中设置bash变量或者从expect到bash返回变量

时间:2012-08-15 13:57:29

标签: linux bash shell

 VAR=$(expect -c ' 
 spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP"' 
 expect "*?assword:*" 
 send "'"$REMOTE_HOST_PASSWD"'\r"; 
 expect {
 "Permission denied, please try again."{ 
 send user "Wrong pass" 
 exit 5
 }
 }
 ')
 echo "$VAR"

更新: 因此,当代码进入Permission denied块时,我需要退出条件。我正在看$?

但它是0,因为“$ VAR”成功运行。

所以当它进入Permission denied block

时我需要一个整数返回值

3 个答案:

答案 0 :(得分:1)

Expect启动自己的tcl shell,因此不能使用bash环境中定义的别名。

Expect确实有变量$env(YOURBASHVARIABLE),它允许Expect获取环境变量,但Expect只能在脚本内部修改它们。但是,一旦期望脚本完成,您将不会保留对变量所做的任何修改。

如果flag将是一个数字,您可以使用退出状态(例如exit 5),然后在脚本中使用$?来获取退出状态。

根据您的更新 expect脚本不返回任何内容,只是设置退出代码。

你能做的只是:

$(expect -c ' 
  spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP"' 
  expect "*?assword:*" 
  send "'"$REMOTE_HOST_PASSWD"'\r"; 
  expect {
    "Permission denied, please try again."{ 
      send user "Wrong pass" 
      exit 5
    }
  }
'); var=$?

这样,var将设置为您的退出状态。

另外,你应该注意到这一点:

  

按照惯例,环境变量(PATH,EDITOR,SHELL,......)和   内部shell变量(BASH_VERSION,RANDOM,...)是完全的   资本化。所有其他变量名称应至少有一个   小写字母。由于变量名称区分大小写,因此   公约避免意外地压倒环境和内部   变量

编辑(mpapis):还有其他用例:

if output="$(expect ...)"
then
  echo "it worked: $output"
else
  result=$?
  echo "it failed($result): $output"
fi

编辑(twmb)

对于最后一个用例,你必须小心你要返回的内容。它将把所有输出发送给用户。除非您关闭了日志记录(使用log_user 0)并且您正在控制期望脚本中将要输出的内容,否则您可能会获得比所需更多的信息。

下面的评论中显示了另一个拖累;

returned="$(expect -c '
  log_user 1  ;# turn to 0 and use send_user to control the exact output
  spawn bash
  expect "\\$"
  send "echo hello\r"
  send_user "this will be returned"
  expect "\\$" ;# without this line, the script would exit too fast 
               ;# for the "echo hello" to be sent to stdout by bash
               ;# and thus wont be recorded
  exit 6
  '
  )"; var=$?
echo "var: $var"
echo "returned: $returned"

答案 1 :(得分:1)

在这种情况下,VAR包含命令的output

您必须使用$?,其中包含执行的最后一个命令的退出状态。设置变量不会改变$?,因此它仍将包含子shell $(...)的退出状态。

示例:

x=$(expect -c 'send "hello"; exit 5;')
echo $?; echo $x
5
hello

答案 2 :(得分:0)

期望您可以使用set env来操纵环境变量。 如果是数字,则可以将变量从expect传递给bash thanx以退出命令。 我们来看一个例子:

~/Desktop> cat test.exp
puts "From shell: FLAG=$env(FLAG)"
set env(FLAG) 22
puts "Set by expect: FLAG=$env(FLAG)"
exit $env(FLAG)
~/Desktop> export FLAG=0
~/Desktop> expect test.exp 
From shell: FLAG=0
Set by expect: FLAG=22
~/Desktop> echo $?
22
~/Desktop>