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
时我需要一个整数返回值答案 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>