expectの使い方メモ

ftpしか使えないサーバーがあって、しかもユーザー名に@が入ってたりとかパスワードに:が入ってたりとかして嫌がらせのように一行のエイリアスが作れなかった。もしかしたら一行で接続する方法あるのかもしれないが知識不足でできなかった。ので、expectを書くことにした。

#!/usr/bin/expect

set NAME "hogehoge@hogehoge"
set PASSWORD "fugafuga:piyopiyo"

set timeout 5

spawn env LANG=C ftp example.com
expect {
    "Name" {
        send ${NAME}\n
        exp_continue
    }
    "Password:" {
        send ${PASSWORD}\n
        exp_continue
    }
}

expect {
    "ftp>" {
        interact
        exit 0
    }
}

シェルでexpectごとスクリプト化して書く方法もあるみたいだけど、複数のプロンプトだと途中で何故かとまる。書き方が悪いのだろう。
結局expectで書いて解決した。

env LANG=C というのはプロンプトをデフォルトの言語(英語)で出させるという意味らしい。

ネタ元: Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編-