2012-08-15 104 views
0
VAR=$(expect -c ' 
spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB [email protected]$REMOTE_HOST_IP"' 
expect "*?assword:*" 
send "'"$REMOTE_HOST_PASSWD"'\r"; 
expect { 
"Permission denied, please try again."{ 
send user "Wrong pass" 
exit 5 
} 
} 
') 
echo "$VAR" 

UPDATE: 所以我需要退出条件当代码进入权限被拒绝block.I日上午在$找谁?如何设置的bash变量预期或返回变量期望从来砸

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

所以我需要在进入权限被拒绝块

回答

1

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

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

例子:

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

谢谢env设置标志。它只是“简单地思考” – barp 2012-08-16 05:42:07

0

在期待,你可以使用set env操作环境变量的整数返回值。 如果是一个数字,可以将期望的变量传递给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> 
1

期待开始自己的TCL外壳,所以你不能使用你的bash环境中定义的别名。

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

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

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

你可以做的是简单的:

$(expect -c ' 
    spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB [email protected]$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,编辑,SHELL,...)和 内部shell变量(BASH_VERSION,随机,...)是大写 大写。所有其他变量名称至少应包含一个小写字母 。由于变量名称区分大小写,因此这种约定避免了意外覆盖环境变量和内部变量。

EDIT(mpapis):还有其他使用案例:

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

EDIT(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" 
+0

@ twmb.I试图给退出状态作为出口5.但是当我运行命令 “$ VAR”,它是运行,$?会给出VAR的退出状态,所以它是0.是不是?我怎样才能处理退出值。这是我想要的绝对想法 – barp 2012-08-15 16:10:05

+0

你可以更新你的代码,以便我可以看到你现在在做什么? – twmb 2012-08-15 16:18:37

+0

好吧我正在更新 – barp 2012-08-15 16:19:51