![expect: bash サブルーチン内から expect スクリプトを使用する方法](https://rvso.com/image/617806/expect%3A%20bash%20%E3%82%B5%E3%83%96%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3%E5%86%85%E3%81%8B%E3%82%89%20expect%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
私はexpectでログインスクリプトを書きたいと思っています。しかし、これを他のさまざまなスクリプトで再利用したいのです。すべてのログインコマンドをbashサブルーチンの一部にしたいのです。つまり、
expect_login.sh
#!/bin/usr/expect -f
spawn ....
set ....
これ欲しい:
expect_login
{
# put some necessary command to initiate expect program
spawn ...
set ...
}
したがって、このサブルーチンを 1 つのファイル/ライブラリに配置し、さまざまなスクリプトで再利用できるようにしたいと考えています。
どうやってやるの?
ありがとう
PS: bash/expect の構文が不正確であることはご容赦ください。疑似コード形式で書きたかっただけです。
答え1
私は 2 部構成のソリューションを採用します。1 つは expect スクリプト、もう 1 つはシェル スクリプトです。
expect スクリプトの場合、入力を受け入れて出力を生成する汎用スクリプトである必要があります。
これは、ホスト名とパスワードを受け入れ、サーバーのvcprofile名を生成するサンプルのexpectスクリプトです。
[user@server ~]$ cat getvcprofile.expect
#!/usr/bin/expect
set timeout 2
set host [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh "ADMIN\@$host"
expect_after eof { exit 0 }
expect "yes/no" { send "yes\r" }
expect "assword" { send "$password\r" }
expect "oa>" { send "show vcmode\r" }
expect "oa>" { send "exit\r" }
exit
シェルスクリプトでは、expectスクリプトを呼び出して変数(この場合はvcsystemのホスト名)を指定します。パスワードは実際にはホスト名OA@XXXXに従ったパターンです。ここで、XXXXはサーバーの最後の4桁の数字です。
[user@server ~]$ cat getvcprofile.sh
#/bin/bash
# get VC profile for a host
host=$1
#get the blade enclosure
enclosure=`callsub -enc $host |grep Enclosure: | cut -d" " -f2`
if [ ! -z $enclosure ]; then
#get the last 4 digit of the enclosure
fourdigit=${enclosure: -4}
domain=`./getvcprofile.expect ${enclosure}oa OA@${fourdigit} |grep Domain|awk '{print $NF}'`
echo $domain
else
echo "None"
fi
この 2 部構成のソリューションを使用すると、次のようなことが可能になります。
for X in `cat serverlist.txt`; do echo -n $X": "; ./getvcprofile.sh $X; done
そして、ファイルserverlist.txt内の各サーバーのvcprofileを出力します。