expect for Command Prompt by GopherLua

コマンドプロンプト向けの expect を Go 言語で作った。

特徴

  • スクリプトLua で書く。GopherLua を使ったので、lua53.dll は不要
  • 画面のプロンプトを待つ except() 関数は、本家だと標準出力・標準エラーを監視するが、こちらは「現在カーソルがある行とその上の行」を0.1秒間隔で監視させている
    • git付属のOpenSsh のパスワード入力の際のプロンプトの出力先が標準出力・標準エラー出力のどちらでもないため、本方式を採用した。
    • kernel32.dll の ReadConsoleOutput という API を使ったが、これ、バッファの確保の仕方のルールが分からず、えらく苦労した。
  • コマンドに入力内容を送信する send() 関数は、本家だと標準入力に文字列を流し込むが、こちらはキーボードが叩かれたのコンソールイベントを発生させている

使用例

実装した関数は spawnexpectsendだけなんだけど、Lua なのでいろいろ柔軟なことが出来る。

if spawn([[c:\Program Files\Git\usr\bin\ssh.exe]],"foo@example.com") then
    expect("password:")
    send("PASSWORD\r")
    expect("~]$")
    send("exit\r")
end

作った感想

  • UNIX/Linux サーバ相手に本気で expect とかやりたい人は、TeraTerm マクロを使う
  • Windows での動作の自動化は Command Prompt だけではどうにもならない場合が多い。

使ってもらえるシーンないな!(まだ技術の無駄遣い)