̃Gg[͂ĂȃubN}[Nɒlj

Unix :: コマンド / expect



コマンド説明
expect対話形式のコマンドを自動化する


インストール

sudo yum install expect


cron で expect が動作しない?

cron で expect が期待通りに動かない。それを解決した時のメモ。

  • やりたかった事
    • リモートサーバーの特定ディレクトリを丸ごと、ローカルサーバーに rsync したい。
    • rsync は cron で定期実行さたい。
  • 問題点
    • リモートサーバーに ssh するには、パスフレーズが必要である。
    • パスフレーズが空の鍵を作ることは出来ない。
  • ソリューション
    • cron で rsync(expectでパスフレーズを入力) を定期実行し、自動化する。
  • はまりポイント
    • interact命令では、cron で expect が期待通りに動かない。


  • 対処方法

下記のような shell スクリプトで、 cron + expect が正常に動作した。

#!/bin/sh

function do_rsync() {

    passwd=hogefuga

    expect -c "
    spawn $1

        expect \"Enter passphrase:\"
        send \"$passwd\n\"

        #interact
        expect eof
        exit
    "
    return 0
}

do_rsync 'rsync -av --delete -e "ssh -i /path/to/id_rsa" hoge@source_server:/path/to/source_dir/ /path/to/dest_dir/'
  • 説明

interact 命令を止めて、下記2行を採用した。

expect eof
exit
  • 解説

interact命令は、「制御をユーザに返す」ことを指示します。
そのため、cron の場合、制御を返されても引き継ぐユーザーがおらず、正常に動作していなかったようです。





unix/command/expect.txt