2012-03-29 52 views
0

我正在編寫我的第一個expect腳本來運行gvfs-mount。我希望期望的腳本回答「密碼:」的提示,讓我輸入密碼,然後切換回非交互模式完成。如何獲得「期望」切入和切出交互模式?

我希望由我來修改autoexpect產生稍微人格化這個腳本:

#!/usr/bin/expect -f 
set timeout -1 
spawn gvfs-mount {smb://[email protected]/my-userid$} 
match_max 100000 
expect -exact "Password required for share my-userid\$ on 10.253.x.y\r\nDomain \[WORKGROUP\]: " 
send -- "my-domain\r" 
expect -exact "my-domain\r\nPassword: " 
send -- "my-password\r" 
expect eof 

只是改變-exact第二發送到-i把整個腳本到一個狀態,其中它等待我輸入域但不讀取鍵盤或「發送」。我推測這與在後臺進程中產生的gvfs-mount沒有綁定到前臺stdin有關。

那麼如何切換一些「期望」的交互性?

謝謝。

回答

1

這就是我的做法。我避開交互並誘使用戶認爲他們正在輸入密碼,以便我可以將其存儲在變量中。

expect "*?assword:*" { 
    stty -echo 
    if {[string length $lpass] < 1} { 
    expect_user { 
     -re "(.*)\n" {set lpass "$expect_out(1,string)"} 
     timeout {exp_continue} 
    } 
    } 
    send -- "$lpass\r" 
} 
stty echo 

您也可以進入和退出的相互作用通過將返回塊內像這樣跳:

interact -nobuffer -re "goodbye\r" { 
    return 
} 
send_user -- "you're no longer interacting with the spawned process\n" 

這將退出交互語句時在告別一個用戶類型和命中進入。

+1

你可能想讓'stty -echo'在讓用戶輸入密碼(然後當然'stty echo'之後) – 2012-03-29 13:43:13

+0

@glennjackman很好的捕獲。謝謝 – resmon6 2012-03-29 13:53:49