프로그램/LINUX

linux expect 안에서 linux command 실행 + 로그 남기기

(주)CKBcorp., 2023. 2. 24. 16:51
반응형

말 그대로다.

예를 들어, 아래와 같은 구문이 있다고 치자.


spawn rsync /local/test1.txt user1@1.2.3.4:/local/text1.txt 
expect "password" 
send "PASS1234"
expect eof 

EOF

spawn rsync /local/test1.txt user1@1.2.3.4:/local/text1.txt 
expect "password" 
send "PASS1234"
expect eof 

EOF



/local/text1.txt 를 1.2.3.4 서버의 /local/text1.txt 에 동기화 하되, 
암호 입력을 기다렸다가
암호를 입력하고
진행해서 동기화하고 종료하는 코드다.


이때, 여러 이유로 로그를 남기고 싶을 때가 있다. 

linux expect 구문 안에서 로그를 남기는 명령어는 log_file 이다. 예를 들어, 위 명령을 

log_file logfile01.txt

spawn rsync /local/test1.txt user1@1.2.3.4:/local/text1.txt 
expect "password" 
send "PASS1234"
expect eof 

log_file 
EOF



와 같이 수정하면, stdout 이 로그 파일에 기록된다. 


만약. log 파일에 추가로 덧붙이고 싶은 내용이 있다면, shell command 를 실행하는게 필요하다. 
이 때는 exec 를 쓴다. 예를 들어, log파일에 시간 정보를 추가하고 싶다면 코드를 아래와 같이 추가하면 된다. 

log_file logfile01.txt

spawn rsync /local/test1.txt user1@1.2.3.4:/local/text1.txt 
expect "password" 
send "PASS1234"
expect eof 

ecec echo `(date)` >> logfile01.txt
log_file 
EOF


또한, 로그 파일의 경우 expect 안에서 남길 때 기본이 append 모드다. 즉 생성하는 족족 추가되는 것. 
이와 다르게 "expect 가 실행할 때 마다. 로그가 새 파일로 떨궈줬으면 좋겠다" 라면, --noappend 옵션을 추가한다. 

log_file -noappend logfile01.txt

spawn rsync /local/test1.txt user1@1.2.3.4:/local/text1.txt 
expect "password" 
send "PASS1234"
expect eof 

ecec echo `(date)` >> logfile01.txt
log_file 
EOF



참고 :
https://phoenixnap.com/kb/linux-expect

https://stackoverflow.com/questions/41282935/run-shell-commands-in-expect-script-as-reaction-to-spawned-action

끝.

반응형