명령 행에 입력을 자동으로 입력


141

각 작업에서 'y'를 입력하도록 요청하는 스크립트를 실행 중이며 $ ./script < echo 'yyyyyyyyyyyyyy'모든 입력을 한 번에 전달하는 것과 같은 솔루션을 찾고 있습니다.


때로는 -f옵션이 특정 명령과 잘 작동합니다.
iammilind

답변:


257

이 경우를 위해 특별히 작성된 명령이 있습니다. yes

$ yes | ./script

이것이하는 일은의 출력 yes을의 입력에 연결하는 것 입니다 ./script. 따라서 ./script사용자 입력을 요청하면 대신의 출력을 얻습니다 yes. 출력은 yes끝없는 스트림과 y개행 문자입니다. 따라서 기본적으로 사용자가의 y모든 질문에 입력하는 것처럼 ./script.

nyes ( y) 대신 no ( ) 라고 말하면 다음과 같이 할 수 있습니다.

$ yes n | ./script

일부 도구에는 항상 yes답변으로 가정 할 수있는 옵션이 있습니다. 예를 들어 여기를 참조하십시오 : 'apt-get upgrade'에서 yes / no 프롬프트를 무시하십시오 .


입력을 입력하는 다른 방법 :

y스크립트가 얼마나 많은지를 정확히 알고 있다면 다음 과 같이 할 수 있습니다.

$ printf 'y\ny\ny\n' | ./script

줄 바꿈 ( \n)은 Enter 키입니다.

printf대신에 사용하면 yes더 세밀한 입력 제어가 가능합니다.

$ printf 'yes\nno\nmaybe\n' | ./script

드문 경우이지만 명령에서 문자 다음에 Enter 키를 누르지 않아도됩니다. 이 경우 개행을 생략하십시오.

$ printf 'yyy' | ./script

완전성을 위해 here 문서를 사용할 수도 있습니다 .

$ ./script << EOF
y
y
y
EOF

또는 쉘이 here 문자열을 지원하면 :

$ ./script <<< "y
y
y
"

또는 한 줄에 하나의 입력으로 파일을 만들 수 있습니다.

$ ./script < inputfile

명령이 충분히 복잡하고 위의 방법으로 더 이상 충분하지 않으면 expect 를 사용할 있습니다.

다음은 매우 간단한 expect 스크립트의 예입니다.

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

기술적 인 nitpick :

귀하의 질문에 제시 한 가상 명령 호출이 작동하지 않습니다.

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

쉘 문법은 명령 행 어디에서나 경로 재 지정 연산자를 허용하기 때문입니다. 쉘에 관한 한 가상 명령 줄은 다음 줄과 같습니다.

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

./script, 인수 'yyyyyyyyyyyyyy'와 함께 호출되며 stdin은이라는 파일에서 입력을받습니다 echo. 그리고 파일이 존재하지 않기 때문에 bash는 불평합니다.


1
나는을 얻는다 cannot enable tty mode on non tty input. 이에 대한 해결 방법을 알고 있습니까?
bmpasini

설치 프로세스를 자동화 해야하는 파일로 printf트릭을 시도하면 run오류 메시지가 표시 Warning: Tried to connect to session manager, None of the authentication protocols specified are supported되고 스크립트가 새 터미널에서 열리고 평소처럼 입력을 수동으로 입력하라는 메시지가 표시 됩니다. 그건 그렇고 데비안에서 일어나고 있습니다. 어떤 제안?
DavidB

자세한 내용이 필요합니다. 댓글이 너무 큽니다. 모든 세부 사항을 가진 새로운 질문을하십시오. 여기에 링크를 넣을 수 있습니다.
lesmana

centos에서 'vagrant destroy'와는 아무 것도 작동하지 않습니다
Drew

쉽게 악! Google Cloud Beta SQL 데이터 가져 오기에서 작동합니다! 매우 감사!
G_Style

11

다음 명령을 사용하십시오 yes.

yes | script

매뉴얼 페이지에서 발췌 :

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

9

apt-get예를 들어 어떤 것들은 자동 모드로 실행하기 위해 특수 플래그를 허용하고 기본값을 허용합니다. 년 apt-get의 경우, 당신은 단지 그것을 통과 -y플래그를. 이것은 스크립트에 완전히 의존합니다.

더 복잡한 것들이 필요한 경우 스크립트를 expect 스크립트로 묶을 수 있습니다. expect를 사용하면 출력을 읽고 입력을 보낼 수 있으므로 다른 스크립팅에서 허용하지 않는 매우 복잡한 작업을 수행 할 수 있습니다. 다음 은 Wikipedia 페이지의 예제 중 하나입니다 .

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof

.sh쉘 스크립트 와 함께 사용할 수 없습니다 . 아니면 방법이 있습니까?
Shayan

7

쉘 스크립트에서는 다음과 같은 스폰 생성, 예상 및 전송 트릭을 사용할 수도 있습니다.

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

그러나 위의 scenerio에서 더 많은 예제를 위해 스크립트를 실행하는 동안 얻을 것으로 예상되는 문구를 제공해야합니다. 다음 링크로 이동하십시오.

배쉬 내에서 기대


2

좋아, 이것은 매우 우아한 해결책은 아니지만 옵션을 별도의 파일로 작성한 다음 스크립트의 입력으로 전달하면 잘 작동합니다. 따라서 모든 옵션으로 새 파일을 만들면 (이 파일을 'options.in'이라고 함) 스크립트를 쉽게 실행 ./script.sh < options.in하고 다른 옵션 파일을 적절하게 편집 / 생성 할 수 있습니다 .


options.in파일을 어떻게 작성해야 합니까? 예를 들어 줄 수 있습니까?
Shayan

0

Dialog로 bash 스크립트를 작성 중이며 자동으로 발생해야했습니다. 나는 이것을했고 매력처럼 일했다.

# -Wy force signaturewipe (if exists)
echo "y" | sudo lvcreate -W y -n $lvName -L "$lvSize"G /dev/"$svg" >> $nfsUtilLog

-1

cat다음과 bash같이 텍스트 파일에서 스크립트로 파이프 된을 사용하여 스크립트에 사용자 입력을 제공 할 수 있습니다 .

cat input.txt | bash your_script.sh

y, n, 숫자, 문자열 등 원하는 답변을 원하는 사용자 입력을 input.txt 파일에 넣으십시오.



@muru 나를 위해, 당신이 언급 한 솔루션이 효과가 없으므로 내 자신을 발명해야합니다.
WebComer

있을 것 같지 않게. 둘 다 같은 것을 설명합니다.
muru

@muru (몇 가지 방법으로 수행 할 수있는) 파일의 공급 답변에 대한 아이디어는 같지 않으며, 다른 방식으로 달성되었습니다. 당신은 그것을 볼 수 있어야합니다. 당신이 지적한 해결책이 저에게 효과적이라면, 나는 오늘 바퀴를 재발 명하는 데 시간을 소비하지 않을 것입니다. 당신은 당신을 위해 일하는 모든 것을 사용할 수 있습니다.
WebComer

@muru 나는 대답에 설명 된 일부 둘 사이의 차이가 여기에서 말하는이 생각 askubuntu.com/questions/172982/... . 예를 들어, 출력이 파일로 리디렉션되는 경우 내 코드는 왼쪽에서 오른쪽으로 자연스럽게 흐르는 것처럼 보입니다. 결국, 당신처럼 잘 작동하는 솔루션을 downvoting한다고해서 사람들이 여기에서 그들의 솔루션을 공유하도록 자극하지는 않습니다. 나는 downvoting을 제거하기에 충분하다고 생각합니다.
WebComer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.