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

More than 3 years have passed since last update.

れれ?? Qiitaのフォント変わった?

さて、今日はexpectを使います。


expectコマンドとは

コマンドの返答を識別して次の入力を自動的に行うコマンドー

expect -c "

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

といった感じで使います。


実装例1:Linuxにユーザーを追加

利用するコマンド


  • expect

  • useradd

  • passwd

事前にexpectをインストール

yum install expect

シェルスクリプトを作成


set_user.sh

#!/usr/bin

useradd UserName
expect -c "
spawn passwd UserName
expect
\"New password:\"
send --
\"hogehoge\n\"
expect
\"Retype new password:\"
send --
\"hogehoge\n\"
expect
\"passwd: all authentication tokens updated successfully.\"
send --
\"exit\n\"
"


で、実行

$ chmod +x set_passwd.sh 

$ ./set_passwd.sh


実装例2:CSVのデータを元にLinuxにユーザーを追加

仕様


  1. [ユーザー名]と[パスワード]をCSVに記入

  2. csv内の値を引数に、useradd, passwdを順次実行

実装

ユーザーとパスワードをhoge.csvに記入

こんな時vim便利ね☆


hoge.csv

user1,hogehoge

user2,fugafuga
user3,hafuhafu
user4,puripuri

シェルスクリプトを作成


set_user.sh

#!/usr/bin/

csvfile=hoge.csv
for line in `cat ${csvfile} | grep -v ^#`
do
user=`echo ${line} | cut -d ',' -f 1`
pass=`echo ${line} | cut -d ',' -f 2`
useradd $user
expect -c "
spawn passwd
${user}
expect
\"New password:\"
send --
\"${pass}\n\"
expect
\"Retype new password:\"
send --
\"${pass}\n\"
expect
\"passwd: all authentication tokens updated successfully.\"
send --
\"exit\n\"
"

done

で、実行

$ chmod +x set_passwd.sh 

$ ./set_passwd.sh

以上


追記

本当はLinuxのユーザーのパスワードを200件ほど書き換えたくて効率的な方法を探していた。。

今回はexportを利用したが、記事を書き終えてすぐ chpasswdなるコマンドーの存在を知っていま絶望している........。。。。。

chpasswd < testpass.txt

参考:ユーザパスワード一括変更 ~Linux編~