Posted at

expectコマンドを使ったみた

More than 3 years have passed since last update.

コマンド操作していて対話式でやりとりするのが面倒なので、

自動化させるためにちょっと触ってみた。

-


1. expectコマンドとは

コマンドの返答を識別して、次の入力を自動的に対応してくれるもの。

シェル内部に組み込むことで、いろいろ自動化できて楽になる。

expectコマンドがインストールされていない場合は、

下記のコマンドを事項してインストール必要。

yum install expect

-


2. 実際にどんな感じに動くかためしてみた

対話式のコマンドをスクリプト化する方法

↑のサイトを参考に動かしてみることにします。

expect -c "

spawn [実行したいコマンド]
expect [コマンドの返答]
send -- [次のコマンド]
"

検証用に仮想マシンを作成しました。

kobito.1451455401.948283.png

★PW変更の場合

[root@localhost ~]# 

[root@localhost ~]# cat /etc/passwd | grep hoge
[root@localhost ~]#
[root@localhost ~]# useradd hoge
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | grep hoge
hoge:x:502:502::/home/hoge:/bin/bash
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# passwd hoge
Changing password for user hoge.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#
[root@localhost ~]#

[root@localhost ~]# cat passwd-test.sh 

#!/bin/sh

export LANG=C
pw="hom7fak8eUd2"

expect -c "
spawn passwd hoge
expect \"New password:\"
send -- \"${pw}\n\"
expect \"Retype new password:\"
send -- \"${pw}\n\"
expect \"passwd: all authentication tokens updated successfully.\"
send -- \"exit\n\"
"
[root@localhost ~]#
[root@localhost ~]# ./passwd-test.sh;echo $?
spawn passwd hoge
Changing password for user hoge.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.0
[root@localhost ~]#
[root@localhost ~]# exit
logout
[user@localhost ~]$