대화 형 프로그램에 비대화 형으로 인수 전달


114

read예 / 아니오 옵션과 같이 대화식으로 명령에 대한 인수를 읽는 명령을 사용하는 bash 스크립트가 있습니다. 기본 옵션 값을 인수로 전달하는 비대화 형 스크립트에서이 스크립트를 호출하는 방법이 있습니까?

대화 형 스크립트에 전달해야하는 옵션이 아닙니다.


2
stdin에서 읽는 경우 입력
lc를

4
이 질문은 중복되는 질문이 많으므로 대화 형 프로그램이 어떤 언어로 작성되었는지는 중요하지 않다는 점을 지적 할 가치가 있습니다. 표준 입력을 읽는 C 프로그램이나 Erlang 응용 프로그램 등이 될 수 있습니다. 명령 줄에서 실행되고 불쾌하게 대화 형 입력을 요구하는 무언가가 있으며이를 자동화하고 싶습니다.
tripleee

물론 유해한 응용 프로그램을 제어 할 수있는 경우 구성 파일, 명령 줄 옵션 등을 통해 응답을 비대화 형으로 읽을 수 있도록 다시 작성하십시오. 이것은 대화 형 질문의 순서 나 표현을 변경하는 것에 대해 훨씬 더 안정적이고 강력합니다.
tripleee

답변:


46

더 복잡한 작업에는 expect( http://en.wikipedia.org/wiki/Expect )가 있습니다. 기본적으로 사용자를 시뮬레이션하고 특정 프로그램 출력 및 관련 항목에 반응하는 방법을 스크립트로 코딩 할 수 있습니다.

이것은 ssh암호를 파이핑하는 것을 금지하는 경우에도 작동 합니다.


8
... SSH의 경우 적절한 솔루션은 공개 키 인증으로 전환하는 것입니다.
tripleee

154

여러 가지 방법

입력 파이프

echo "yes
no
maybe" | your_program

파일에서 리디렉션

your_program < answers.txt

here 문서를 사용 하십시오 (이것은 매우 읽을 수 있습니다)

your_program << ANSWERS
yes
no
maybe
ANSWERS

용도 여기에 문자열을

your_program <<< $'yes\nno\nmaybe\n'

5
이것은 프로그램이 표준 입력을 읽는 경우에만 작동한다는 것을 지적합니다. 일부 프로그램은 표준 입력이 파이프 인 경우에도 대화식으로 암호를 읽는 방식을 벗어납니다. 암호의 경우 이것은 보안상의 이유로 의미가 있습니다. 일부 대화 형 프로그램은 단순히 잘못 설계되었습니다.
tripleee

@tripleee 당신이 말한 내용에 따라 스크립트는 stdin의 영향을받지 않는 암호를 어떻게 읽습니까? 나는 당신이 readstdin을 잡는 데 사용할 수 있다는 것을 알고 있습니다. 당신이 설명한대로 어떤 기능을 사용할 수 있습니까?
flow2k

이 경우 상호 작용하려는 프로그램에 입력을 보내는 특별한 방법 (예 : sshpass, ssh-agent)이 있는지 확인하거나 expect을 사용하여 상호 작용을 스크립팅해야합니다.
glenn jackman

2
Expect와 같은 프로그램은 다른 쪽 끝에 터미널과 키보드가있는 사용자가있는 것처럼 클라이언트가 보이는 가상 tty에서 클라이언트를 실행합니다. 일반 파이프로는 할 수 없습니다.
tripleee

중요 공지. 제공된 명령에 공백을 추가하면 작동하지 않습니다.
71GA

13

데이터를 파일에 넣고 다음과 같이 리디렉션 할 수 있습니다.

$ cat file.sh
#!/bin/bash

read x
read y
echo $x
echo $y

스크립트 데이터 :

$ cat data.txt
2
3

스크립트 실행 :

$ file.sh < data.txt
2
3

7

한 가지 더 추가하고 싶습니다. 다른 곳에서 찾았고 아주 간단합니다. "execute_command"명령에 대한 명령 줄의 모든 프롬프트에 대해 yes를 전달하고 싶다고 말하면 간단히 yes를 파이프합니다.

yes | execute_command

모든 예 / 아니오 프롬프트에 대한 대답으로 예를 사용합니다.


1

printf를 사용하여 입력을 스크립트로 파이프 할 수도 있습니다.

var=val
printf "yes\nno\nmaybe\n$var\n" | ./your_script.sh

0

anothe ralternative는

echo "something" | tee /path/to/file

tee 명령은 수신 한 입력을 화면에 인쇄하고 동시에 파일에 저장합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.