예상대로 로그인 스크립트를 작성하고 싶습니다. 그러나 나는 이것이 다른 다른 스크립트에서 재사용되기를 원합니다. 모든 로그인 명령을 bash 서브루틴의 일부로 만들고 싶습니다. 즉 대신에
expect_login.sh
#!/bin/usr/expect -f
spawn ....
set ....
나는 이것을 원한다:
expect_login
{
# put some necessary command to initiate expect program
spawn ...
set ...
}
그래서 저는 이 서브루틴을 다양한 스크립트에서 재사용할 수 있는 하나의 파일/라이브러리에 배치하고 싶습니다.
어떻게 해야 합니까?
감사해요
추신: bash/expect의 부정확한 구문을 용서해 주세요. 나는 단지 의사 코드 방식으로 글을 쓰고 싶었습니다.
답변1
나는 2 부분 솔루션으로 갈 것입니다. 한 부분은 예상 스크립트이고 다른 부분은 셸 스크립트입니다.
예상 스크립트의 경우 입력을 받아들이고 출력을 생성하는 일반 스크립트여야 합니다.
이것은 호스트 이름과 비밀번호를 허용하고 서버의 vcprofile 이름을 생성하는 스크립트를 예상하는 예입니다.
[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
쉘 스크립트에서 예상 스크립트를 호출하고 여기에 변수(이 경우 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을 인쇄합니다.