標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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 だけではどうにもならない場合が多い。

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