bash 스크립트 루프에서 Expect 스크립트 호출

bash 스크립트 루프에서 Expect 스크립트 호출

예상 스크립트를 통해 사이트 목록을 반복하려고 합니다. 이 루프는 내 목록을 가져와 한 줄씩 읽고 디렉터리를 사이트 이름의 폴더로 변경한 다음 사이트 이름을 예상 스크립트에 전달합니다.

쿵쿵 스크립트:

#!/bin/bash
sites="/home/user/sites.cfg"

while read site; do
  cd /home/user/$site
  pwd
  echo $site
  ./base.sh
done < $sites

예상 스크립트:

#!/usr/bin/expect

set site [lindex $argv 0]
set timeout 3

logfile services
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null user@$site
expect "password" { send mypassword\r }
expect "#"
send environment\ no\ more\n
expect "#"
send show\ service\ service-using\n
expect "#"
send logout\n

결과:

user@myserver:~$ sh show-database.sh
/home/user/site-01
site-01
show-database.sh: 11: show-database.sh: ./base.sh: not found
/home/user/site-02
site-02
show-database.sh: 11: show-database.sh: ./base.sh: not found

모든 사이트의 모든 폴더에서 services라는 파일을 보고 싶습니다. 다음 명령을 실행할 수 있으며 CLI에서 작동하지만 디렉터리는 변경되지 않습니다. 이는 루프에서 더 많은 작업을 수행하는 더 큰 스크립트의 시작일 뿐입니다. 이제 이것이 제가 테스트하고 싶은 것입니다.

./base.sh site-01

감사해요!

답변1

bash 래퍼 스크립트가 전혀 필요하지 않습니다. 모든 것을 처리할 수 있을 것으로 기대합니다.

#!/usr/bin/expect
set timeout 3

set rootdir /home/user
set sites [file join $rootdir sites.cfg]
set fh [open $sites r]

while {[gets $fh site] != -1} {
    set dir [file join $rootdir $site]
    if { ! [file isdirectory $dir]} {
        puts "*** error: $dir does not exist"
        continue
    } 

    cd $dir
    puts [pwd]
    puts $site

    log_file services

    spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null user@$site
    expect "password" 
    send "mypassword\r 
    expect "#"
    send "environment no more\r"
    expect "#"
    send "show service service-using\r"
    expect "#"
    send "logout\r"
    expect eof

    log_file
}

관련 정보