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


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.