A sample script that ties up things using the information discussed.
1. minimize code changes to delivered script & call custom code in separate script
:::::cd ${PS_HOME}/bin# source my sftp script . my_sftp_script ftp_cmd_file=$1 :::::: :::::: echo "about to submit ftp -vin $1"# $FTP_CMD -vin < $1 my_sftp_function break ;; esac :::::::: 2. my_sftp_script:
##################################################### # # My SFTP function # ##################################################### function my_sftp_function { #singal handler trap "cleanup" 0 trap "echo Cancelled; cleanup;" 1 2 3 15 err=0 feedback=1 SFTP_CMD="/usr/bin/sftp" sftp_cmd="h_sftp_cmd."$$ sftp_tmp="h_sftp_tmp."$$ sftp_log="h_sftp_log."$$ dev=me@some.place.com user=/somehost/somedir/user_list ##### sftp messages --change text as needed SFTP_LOGIN_ERR="Permission denied (publickey,password,keyboard-interactive)" SFTP_NO_FILE="No such file or directory" ##### ftp messages & codes --change text as needed FTP_NO_FILE="A file or directory in the path name does not exist." FTP_LOGIN_ERR="Login incorrect." FTP_MAX_SIZE="Exceeded storage allocation" FTP_DEL_NOFILE_CD=532 FTP_LOGIN_ERR_CD=530 FTP_MAX_SIZE_CD=552 FTP_GET_NOFILE_CD=550 FTP_PUT_OK="226 Transfer complete." FTP_GET_OK="226 Transfer complete." FTP_DEL_OK="250 DELE command successful." ############### # get ftp xfer command, remote dir, remote file name cmd='' r_file=`grep ^put $ftp_cmd_file | awk '{print $3}' | tr '\"' '\0'` if [ ${r_file:-none} == 'none' ]; then r_file=`grep ^get $ftp_cmd_file | awk '{print $2}' | tr '\"' '\0'` if [ ${r_file:-none} == 'none' ]; then r_file=`grep ^delete $ftp_cmd_file | awk '{print $2}' | tr '\"' '\0'` if [ ${r_file:-none} != 'none' ]; then cmd=delete fi else cmd=get fi else cmd=put fi r_dir=`grep ^cd $ftp_cmd_file | awk 'BEGIN{var=""} {if ($2!="/") var=var"/"$2; else var=var$2; } END{print var}' | sed 's/\/\//\//g'` #echo "!sleep 500" > $sftp_cmd # convert ftp to sftp commands grep -e ^lcd -e ^cd -e ^put -e ^delete -e ^get -e ^quit $ftp_cmd_file | sed s/^delete/rm/ | awk '!/^rm/ {print $0} /^rm/ {print $0"\""}' > $sftp_cmd echo 'sftp commands---------------' > $sftp_log cat $sftp_cmd >> $sftp_log echo '\nsftp log--------------------' >> $sftp_log # run sftp command batch file $SFTP_CMD -b $sftp_cmd `grep ^user $ftp_cmd_file|awk '{print $2}'`@`grep ^open $ftp_cmd_file|awk '{print $2}'` 1>>$sftp_log 2>&1 err=$? if [ $err -ne 0 ]; then grep -qi $SFTP_LOGIN_ERR $sftp_log if [ $? -eq 0 ]; then echo $FTP_LOGIN_ERR_CD" "$FTP_LOGIN_ERR else grep -qi $SFTP_NO_FILE $sftp_log if [ $? -eq 0 ]; then if [ $cmd = 'delete' ]; then echo $FTP_DEL_NOFILE_CD" "$FTP_NO_FILE else echo $FTP_GET_NOFILE_CD" "$FTP_NO_FILE fi else grep -qi $FTP_MAX_SIZE $sftp_log if [ $? -eq 0 ]; then echo $FTP_MAX_SIZE_CD" "$FTP_MAX_SIZE fi fi fi else # check sftp results echo '\nverifying results------------' >>$sftp_log chk_results err=$? if [ $err -eq 0 ]; then if [ $cmd = 'get' ]; then echo $FTP_GET_OK else if [ $cmd = 'put' ]; then echo $FTP_PUT_OK else echo $FTP_DEL_OK fi fi fi fi # send feedback if [ $err -ne 0 ] && [ $feedback -eq 1 ]; then echo $cmd' failed.' >> $sftp_log echo '\nftpunx log------------------' >> $sftp_log echo ${ftp_cmd_file%.*}".log:" >> $sftp_log cat `echo ${ftp_cmd_file%.*}".log"` >> $sftp_log echo '\nEnd: '`date` >> $sftp_log if [ -f $user ]; then mailx -s"My SFTP failed" `cat $user` < $sftp_log else mailx -s"My SFTP failed" $dev < $sftp_log fi fi return $err } ################################################ # # check SFTP results # ################################################ function chk_results { case $cmd in put | get) # compare file sizes echo " `grep ^cd $ftp_cmd_file` ls -l "$r_file" quit " > $sftp_cmd $SFTP_CMD -b $sftp_cmd `grep ^user $ftp_cmd_file|awk '{print $2}'`@`grep ^open $ftp_cmd_file|awk '{print $2}'` 1>$sftp_tmp 2>&1 if [ $? -ne 0 ]; then return 1 fi # get temp local file name if [ $cmd = 'put' ]; then l_file=`grep ^lcd $ftp_cmd_file | awk 'BEGIN{var=""} {if ($2!="/") var=var"/"$2; else var=var$2; } END{print var}' | sed 's/\/\//\//g'`/`grep ^put $ftp_cmd_file | awk '{print $2}' | tr '\"' '\0'` else l_file=`grep ^lcd $ftp_cmd_file | awk 'BEGIN{var=""} {if ($2!="/") var=var"/"$2; else var=var$2; } END{print var}' | sed 's/\/\//\//g'`/`grep ^get $ftp_cmd_file | awk '{print $3}' | tr '\"' '\0'` fi l_file_size=`ls -l $l_file | awk '{print $5}'` r_file_size=`grep -v ^sftp $sftp_tmp | grep $r_file | awk '{print $5}'` if [ $l_file_size -ne $r_file_size ]; then echo 'file size different:' >> $sftp_log echo 'local file size='$l_file_size' ('$l_file')' >> $sftp_log echo 'remote file size='$r_file_size' ('$r_dir'/'$r_file')' >> $sftp_log return 1 fi break ;; delete) # DELETE - verify file does not exist; use subshell so sftp does not error off ( echo " `grep ^cd $ftp_cmd_file` ls -l "$r_file" quit " ) | $SFTP_CMD `grep ^user $ftp_cmd_file|awk '{print $2}'`@`grep ^open $ftp_cmd_file|awk '{print $2}'` 1>$sftp_tmp 2>&1 if [ $? -ne 0 ]; then return 1 fi grep -q "$2 not found" $sftp_tmp if [ $? -ne 0 ]; then cat $sftp_tmp >> $sftp_log return 1 fi break ;; esac return 0 } function cleanup { rm $sftp_tmp 2>/dev/null rm $sftp_cmd 2>/dev/null rm $sftp_log 2>/dev/null } Change Peoplesoft FTP to SFTP - Part3