2012-08-15 100 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