Subject: How do I run ... interactive programs from a shell script ... ?
Date: Thu Mar 18 17:16:55 EST 1993

3.9) "passwd","ftp","telnet","tip" 等の対話形プログラムをシェルスクリプト やバックグラウンドで実行するには。

これらのプログラムは端末からのインターフェースを要求します。シェルはこ のような場合のことについては何も規定していません。だから、こういうプロ グラムはシェルスクリプトを使って自動化することはできません。

'expect' というプログラムが、このようなプログラムを自動で実行するための プログラム可能なインターフェースを提供してくれます。以下は expect スク リプトを使った非対話バージョンの passwd(1) の例です。

    
# 最初の引数がユーザー名、2番めがパスワード
set password [index $argv 2]
spawn passwd [index $argv 1]
expect "*password:"
send "$password¥r"
expect "*password:"
send "$password¥r"
expect eof
expect はちょっとした自動走行をするとき、特に telnet, rlogin, デバッ ガ、その他の組み込みのコマンド言語を持っていないプログラムを使う時に便 利です。プログラムの配布のなかには例として、ゲームプログラムの rogue を 良い初期値がでるまで再実行してくれるようなスクリプトが入っています。実 行後は、ゲームを楽しむためユーザーにコントロールが返されます。

さらに仮想端末を操作するために作られたプログラムもいくつかあり、スクリ プトの中にこのようなプログラムの並びを書いて実行することもできます。

expect を手に入れるには、"send pub/expect/expect.shar.Z" というメールを library@cme.nist.gov に出すか、同じようにして ftp.cme.nist.gov から anonymous ftp して下さい。

もう一つの方法が pty 4.0 を使う事です。これはプログラムを仮想端末セッ ションの基で走らせる comp.sources.unix の volume 25 に投稿されたもので す。 pty を基にし、名前付きパイプ (named pipes) を使って、上と同じこと をするとしたらこんな具合になるでしょう。

    
#!/bin/sh
/etc/mknod out.$$ p; exec 2>&1
( exec 4<out.$$; rm -f out.$$
<&4 waitfor 'password:'
    echo "$2"
<&4 waitfor 'password:'
    echo "$2"
<&4 cat >/dev/null
) | ( pty passwd "$1" >out.$$ )
ここで 'waitfor' は、入力の中から引数の内容を1文字ずつ探す、簡単な C のプログラムです。

pty を使ったさらに簡単な方法 ( passwd とは同期しない方法) は、次のよう になります。

    
#!/bin/sh
( sleep 5; echo "$2"; sleep 5; echo "$2") | pty passwd "$1"

UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや