예상: bash 서브루틴 내에서 예상 스크립트를 사용하는 방법

예상: bash 서브루틴 내에서 예상 스크립트를 사용하는 방법

예상대로 로그인 스크립트를 작성하고 싶습니다. 그러나 나는 이것이 다른 다른 스크립트에서 재사용되기를 원합니다. 모든 로그인 명령을 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을 인쇄합니다.

관련 정보