2020.12.11 sftp shell script expect automation
expect [ -dDinN ] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
script 파일에 포함할 때 위 구문으로 시작
/usr/local/bin/expect에는 expect가 설치된 정확한 위치 지정.
- -c : script 실행전에 수행해야할 command 지정
- -d :
- -D : 디버그 모드 실행.
- -f : 파일로 부터 실행 구문을 읽어들임.
- -i : expect shell(? prompt방식). 나갈때는 exit
- -v : 버전 정보
expect 명령어 사용
keyword
spawn : 명령어 실행
expect “특정문자열” : “if 특정 문자열이 나타나면” 의미
send “보낼문자열\r” : 문자열을 전송한다. \r은 엔터키를 의미한다.
interact : 이제는 expect를 끝내고 사용자에게 제어권을 넘긴다.
set 변수 [lindex $argv 0] : 0번째 명령행 인자를 변수에 지정한다.
send “$변수” : 변수에 저장된 문자열을 전송한다.
expect eof : expect 종료
재정리
- expect: 패턴이 일치한 경우 실행 .
- send: 프로세스를 통해 원격 서버에 문자열 전송
- spawn: 프로그램을 실행하여 새로운 프로세스를 생성
- send_user: stdout을 사용자에게 전송 . (send → remote, send_user → local)
- interact: 프로세스를 제어하여 상호 작용할 때 사용을하며 사용자에게 제어권을 넘김
- log_user: 기본적으로 stdout 표시 stdout을 제외하려면 0으로 설정 . (log_user 0)
- exp_internal: expect 디버그 로그
- set: 변수를 설정하는 방법
- close: 프로세스 연결을 종료
option
-nocase : 대소문자 구별안함
실행시키는 방법
sh sample.exp port targetId targetIp targetPass worksPath targetPath
=======================sample.exp=====================
#!/sh/expect
toDay=todayValue= `date +%Y%m%d`
#하루전
yesterdayValue= `TZ=KST+15;date +%Y%m%d`
#하루전 + 24시간
yesterdayValueAddOneDay= `TZ=KST+39;date +%Y%m%d`
port=$1
hostId=$2
hostIp=$3
targetPass=$4
worksPath=$5
targetPath=$6
expect -c "
spawn sftp -oPort=$port BatchMode=\"no\" $hostId@$hostIp
expect -nocase \"*password:\" { send \"targetPass\r\"; }
expect -nocase \"sftp>\" { send \" get $targetFileName \r\"; }
expect -nocase \"sftp>\" { send \" exit \r\"; interact }
"
exit
cd $worksPath
mkdir $targetPath/$todayValue
mv $worksPath/* $targetPath/$todayValue/
==================================================