やる気がストロングZERO

やる気のストロングスタイル

expectでコマンドライン作業の自動化の検討

expectっていうのを使えばコマンドライン作業の自動化ができそうだったので試してみた。

参考)expectを使って自動化してみよう。 - Qiita

やりたいこと

定型の作業を秘伝のメモを見ながらコマンド入力して行っていたのを、スクリプトポチーで実行できるようにしたい。

スクリプト化しておくことで「実際に動く手順メモ」として利用したい。

定型手順

例: DBに接続して特定の指標データを取ってくる。

  1. 手元マシンからsshで踏み台に接続
  2. 踏み台からsshでDBサーバーに接続
  3. DBサーバーにてDBのクライアントを使ってDBにログイン
  4. SQLを実行して結果を出力

expectを使って自動化

expectのインストール

brew install expect

手順スクリプトを書く

get_db_data.tcl

# タイムアウト設定
set timeout 60

# 踏み台にsshする
spawn ssh 踏み台host

# $が表示されたことを確認する(ログイン成功)
expect "$"

# DBサーバーへsshする
send "ssh DBサーバーhost\n"

# $が表示されたことを確認する(ログイン成功)
expect "$"

# クライアントを使ってdbにログイン
send "psql -h localhost -p 5432 -U user名 -d データベース名\n"

# passwordが表示されたことを確認する(パスワードが求められている事を確認)
expect "password"

# 入力のために制御を一旦戻す。入力後制御がスクリプトに戻る
interact -nobuffer -re "(.*)\r" return

# #が表示されたことを確認する(DBログイン成功)
expect "#"

# クエリを流してみる
send "select count(1) from table;\n"

# 制御をこちらに戻して内容を確認する
interact

以下のように実行するとスクリプトが実行できる

$ expect get_db_data.tcl

このスクリプトはコンソール上で内容を確認しているが、ファイルに書き出してローカルまで持ってくるようにすることもできそう。

メモ: 変数も使えたりするらしい

set 変数名 値 # セット
$変数名 # 出力