파일 및 tty에서 입력을 리디렉션해야 합니다.

파일 및 tty에서 입력을 리디렉션해야 합니다.

나는 백업을 위해 아만다를 운영하고 있습니다. 날짜가 다른 여러 파일을 복구해야 합니다. 파일 이름이 동일하므로 여러 복구 세션을 수행해야 합니다. 그래서 이 글을 써야겠다고 생각했습니다. 이것은 내 스크립트입니다.

sethost myhost
setdisk /var
setdate 2017-03-25-01-30-01
cd log/httpd
ls
add ssl_request_log
extract

쉘 리디렉션을 사용하여 스크립트를 실행합니다.

amrecover my_Config < /home/me/thatScript

문제는 일단 amrecover가 보면정제명령이 나에게 확인을 요청했습니다.

Continue? [Y/n]:

"extract" 다음에 "Y"를 입력해도 아무런 효과가 없습니다. Amrecover는 내가 "Y"를 입력하기를 기다리고 있습니다. amrecover에는 stdin뿐만 아니라 tty의 입력이 필요한 것 같습니다.

나는 amrecover의 매뉴얼 페이지를 살펴보고 누군가가 이 문제를 해결했는지 알아보기 위해 구글링도 했습니다. 또한 코드가 컴파일되어 있어 확인을 기다리지 않고는 스크립트를 해킹할 수 없습니다.

스크립트에서 입력을 얻고 /dev/tty를 표준 입력으로 리디렉션하는 방법이 있습니까?

답변1

amrecover이는 대화형 스크립트로 제작되었으므로 일반적으로 이를 자동화하려면 를 사용합니다 expect. 이 유틸리티는 두 가지 유형의 프롬프트( 및 ) tcl에 대한 대화를 확인 하고 다양한 방식으로 응답할 수 있습니다. 예를 들어, PATH에 파일을 생성하고 실행 가능하게 만들고( ) 다음 내용을 그 안에 넣습니다.amrecover>Continue? [Y/n]:myrecoverchmod +x myrecover

#!/usr/bin/expect
spawn amrecover my_Config 
expect   -ex {Continue? [Y/n]:}  { send "y\r"; exp_continue } \
         -ex {amrecover>}        { gets stdin input; 
               if ![eof stdin] { send $input; send "\r"; exp_continue } }
close
wait

그런 다음 다음과 같이 실행하십시오.

./myrecover </home/me/thatScript

스크립트 expect는 명령을 분기하고 실행하고 amrecover my_Configpty를 통해 명령에 연결한 다음 두 개의 프롬프트에 대한 입력을 듣습니다. 일반적인 amrecover>프롬프트가 표시되면 스크립트의 표준 입력 expect, 명령 세트에서 한 줄을 읽고 (파일 끝을 얻지 못한 경우) 개행 문자( \r로 변환됨) 를 사용하여 해당 줄을 프로그램에 보냅니다. 이것). 이로 exp_continue인해 명령이 다음 프롬프트와 일치하도록 다시 반복됩니다. 파일 끝에서 프로그램에 대한 연결을 닫고 프로그램이 종료될 때까지 기다립니다.

amanda이런 식으로 실행하면 계속 프롬프트가 비정상적인 상황 등에 대한 것일 경우 혼란을 초래할 수 있습니다.

답변2

extract다음과 같이 유틸리티에 입력을 제공합니다 heredoc.

extract - <<\__DATA__
Y
__DATA__

관련 정보