2012-03-29 10 views
0

gvfs-mountを実行するための私の最初のexpectスクリプトを書いています。 wcriptがプロンプトに「Password:」に応答するようにしたいと思います。パスワードを入力してから、非対話モードに戻って終了してください。インタラクティブモードで「期待する」と「する」を切り替えるにはどうすればよいですか?

私はautoexpectので生成され、このスクリプトを変更したいと少し私がdepersonalized:

#!/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をフォアグラウンドの標準に縛られていないバックグラウンドプロセスで生成させることと関連があると推測しています。

どのようにして「期待している」インタラクティブ機能を切り替えるにはどうすればよいですか?

ありがとうございました。

答えて

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 

また、このようなブロック内でreturnを入れてにし、相互作用の外にジャンプすることができます:

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

ユーザーさよなら内の型とヒットが入力したとき、これが対話文を終了します。

+1

ユーザーにパスワードを入力させる前に 'stty -echo'したがっているかもしれません(そしてその後は' stty echo'それ以降)。 –

+0

@glennjackman良いキャッチです。ありがとう – resmon6

関連する問題