대화형으로 생성된 하위 프로세스에 응답

대화형으로 생성된 하위 프로세스에 응답

eb initAmazon Web Services에는 현재 작업 디렉터리를 elasticbeanstalk 애플리케이션으로 시작할 수 있는 명령이 있습니다 .

이 명령은 대화형입니다. 즉, eb init옵션 목록으로 응답합니다.

$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3):

맨 위는 region옵션, 두 번째는 옵션, 세 번째는 가능한(또는) 옵션 목록입니다 app.environmentenv

내가 찾고 있는 것은 명령을 래핑 eb init하고 스크립트 상호 작용을 우회할 수 있는 문자열을 전달할 수 있는 것입니다.

ebInit --region=eu-central-1 --app=my-app --env=my-app-live

이것을 구문 분석 stdout하고 줄을 분할하여 전달된 매개 변수 옵션에 해당하는 숫자를 가져와야 합니다. 옵션이 숫자를 이동할 수 있기 때문에 매우 간단합니다.

개념 증명으로 이와 같은 것을 해도 괜찮을 것 같습니다.

ebInit --region=5 --app=1 --env=1

이러한 대화형 명령이 블랙박스이며 프로그래밍 방식으로 상호작용할 수 없다는 사실이 믿기지 않습니다. node.js를 사용하여 이 작업을 시도했지만 응답하지 못했습니다. 여기 내 이전 stackoverflow 게시물이 있습니다."하위 프로세스를 통해 대화형 명령에 응답”라고 말했지만 사람들의 관심을 끌지는 못했습니다.

나는 이것이 유닉스/리눅스에서 가능한지, 만약 그렇다면 어떻게, 어떤 언어로 가능한지 묻기 위해 이 글을 게시합니다.

답변1

솔루션은 expect다음 라인을 따라 실행될 수 있습니다.

#!/usr/bin/env expect

# or instead figure out a TCL getopt library
if {[llength $argv] != 3} {
    puts stderr "Usage: $argv0 region app env"
    exit 64
}
set aws_region [lindex $argv 0]
set aws_app    [lindex $argv 1]
set aws_env    [lindex $argv 2]

spawn -noecho eb init

set get_regions 1
while {$get_regions} {
    expect {
        # look for the "1) us-east-1 : US East (N. Virginia)"
        # assign to what TCL calls an array
        -re {([0-9]+). ([a-z0-9-]+) :} {
            set region_to_num($expect_out(2,string)) $expect_out(1,string)
        }
        # how we break out of the loop, also array entry
        # for "default" region if need be
        -re {\(default is ([0-9]+)\)} {
            set region_to_num(default) $expect_out(1,string)
            set get_regions 0
        }
    }
}

# show what we got based on arguments and parse of eb output
puts "region=$aws_region region_num=$region_to_num($aws_region) env=$aws_env"

expect또는 JavaScript에서 유사한 라이브러리를 찾거나 작성할 수도 있지만 아마도 더 많은 작업이 필요할 것입니다. 당신이 좋아하는 것이 무엇이든 할 수 있습니다 ...

관련 정보