나는 백업을 위해 아만다를 운영하고 있습니다. 날짜가 다른 여러 파일을 복구해야 합니다. 파일 이름이 동일하므로 여러 복구 세션을 수행해야 합니다. 그래서 이 글을 써야겠다고 생각했습니다. 이것은 내 스크립트입니다.
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]:
myrecover
chmod +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_Config
pty를 통해 명령에 연결한 다음 두 개의 프롬프트에 대한 입력을 듣습니다. 일반적인 amrecover>
프롬프트가 표시되면 스크립트의 표준 입력 expect
, 명령 세트에서 한 줄을 읽고 (파일 끝을 얻지 못한 경우) 개행 문자( \r
로 변환됨) 를 사용하여 해당 줄을 프로그램에 보냅니다. 이것). 이로 exp_continue
인해 명령이 다음 프롬프트와 일치하도록 다시 반복됩니다. 파일 끝에서 프로그램에 대한 연결을 닫고 프로그램이 종료될 때까지 기다립니다.
amanda
이런 식으로 실행하면 계속 프롬프트가 비정상적인 상황 등에 대한 것일 경우 혼란을 초래할 수 있습니다.
답변2
extract
다음과 같이 유틸리티에 입력을 제공합니다 heredoc
.
extract - <<\__DATA__
Y
__DATA__