2013-07-16 1 views
0

expect/SH 스크립트에서 SFTP를 수행하기 때문에이 사이트에 잠시 동안 숨어있었습니다. SSH keygen은 우리가 원격 서버에 액세스 할 수 없기 때문에 옵션이 아니므로 SFTP에 암호 인수를 제공 할 것으로 기대하고 있습니다.expect에서 sucessful 인 경우 SFTP 전송을 캡처하는 방법

여기에 제가 작업하고있는 스크립트가 있습니다. 전송 ("mput")이 성공적으로 완료되면 출력 파일에 캡처하거나 로그하려는 경우를 제외하고는 모든 것이 여기에서 작동합니다. 이후에 expect_out (버퍼)을 추가하면 "mput"뒤에 오는 코드에 대한 조언이 실패합니다.

#!/bin/ksh 

    DIRROOT=/apps/gen/e2k/sys/bpp 
    COPYDIR=$DIRROOT/SENT 
    FILEHASH=TEST.SOME.FILE.* 

if [ ! -f $COPYDIR/$FILEHASH ]; then 
    echo "No File" 
fi 

# New FTP credential from GIC 
    FTPSERV=********** 
    FTPUSER=********** 
    FTPPWD=********** 
    FTPDIR=/to-scs 

/usr/local/bin/expect -f - <<EOFEXPECT1 
#exp_internal 1 
set timeout -1 
set log [open "/dir/dir1/dir2/MIKETEST.txt" w] 
spawn sftp -oPort=10022 [email protected]$FTPSERV 
expect "password:"      
send "$FTPPWD\r"; 
expect "sftp> " 
send "lcd $COPYDIR \r"; 
expect "sftp> " 
send "cd /recipient \r"; 
expect "sftp> " 
send "mput TEST.SOME.FILE.*\r"; 
put $log $expect_out(buffer) 
close $log 
expect "sftp> " 
send "bye\r"; 
expect eof 
EOFEXPECT1 

if [ $? -eq 0 ] 
then 
echo "success" 
else 
echo "fail" 
fi 

답변

0

put 대신 puts를 사용해야하며 오류 검사를 위해 $ expect_out (버퍼)에 의존하지 않아야합니다. 오히려 중첩 된 expect 문을 사용하여 일반적인 SFTP 시나리오/오류를 잡아냅니다.

set timeout -1 
send "mput TEST.SOME.FILE.*\r"; 
expect { 
    #Check for progress, note does not work with all versions of SFTP 
    #If a match is found restart expect loop 
    -re "\[0-9]*%" { 
     set percent $expect_out(0,string) 
     puts $logf "File transfer at $percent, continuing..." 
     exp_continue 
    } 

    #Check for common errors, by no means all of them 
    -re "Couldn't|(.*)disconnect|(.*)stalled" { 
     puts $logf "Unable to transfer file" 
     exit 1 
    } 

    #OK continue 
    "sftp>" { 
     puts $logf "File transfer completed" 
    } 
} 

마지막으로, 나는 조만간 붙어 과정으로 이어질 것이 -1 (결코)의 타임 아웃을 사용하지 않는 것이 좋습니다. 오히려 timeout 값을 만들고 expect 블록에서 타임 아웃이 발생할 가능성을 잡아라.

set timeout 60 
expect { 
    #Process timed out 
    timeout { 
     puts $logf "File transfer timed out" 
    } 
}