
나는 백업을 위해 Amanda를 운영하고 있습니다. 다른 날짜의 여러 파일을 복원해야 합니다. 파일 이름이 동일하므로 여러 복원 세션을 수행해야 합니다. 그래서 저는 그 일을 대본으로 작성해야겠다고 생각했습니다. 내 스크립트는 다음과 같습니다.
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의 매뉴얼 페이지를 보았고 누군가가 이것을 알아냈는지 알아보기 위해 Google을 검색했습니다. 그리고 코드가 컴파일되어 있어 확인을 기다리지 않고 스크립트를 해킹할 수 없습니다.
스크립트에서 입력을 받아 /dev/tty를 stdin으로 리디렉션하는 방법이 있습니까?
답변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
는 command 를 분기하고 실행하여 amrecover my_Config
pty를 통해 연결한 다음 입력을 듣고 두 개의 프롬프트를 찾습니다. 일반적인 amrecover>
프롬프트가 표시되면 스크립트의 표준 입력, 즉 명령 세트에서 한 줄을 읽고 (파일 끝을 얻지 못한 경우) 개행 문자( 변환됨 expect
)를 사용하여 해당 줄을 프로그램에 보냅니다. \r
이에). exp_continue
다음 프롬프트 일치를 위해 명령 루프를 다시 만듭니다 . 파일 끝에서 프로그램에 대한 연결을 닫고 프로그램이 종료될 때까지 기다립니다.
amanda
계속 프롬프트가 일부 예외적인 조건 등에 대한 것일 경우 이런 방식으로 실행하면 혼란이 발생할 수 있다는 점에 주의하십시오 .
답변2
extract
다음과 같이 유틸리티 에 입력을 제공합니다 heredoc
.
extract - <<\__DATA__
Y
__DATA__