Note that it does not copy the new files into /tmp, just downloads and checks them. I don't want to accidentally wreck your data with code I have no way to test.
I ran below
HOST=''
ftpuser=''
ftppass=''
FILE='XXXX.YYMMDD'
NOW=$(date +"%m-%d-%Y")
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir='G:\KKKK'
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST <<EOF
quote user $ftpuser
quote pass $ftppass
hash
prompt off
cd $SrcDir
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit
fi
# Get the remote file
ftp -nvd $HOST << EOF >/tmp/ftp.$NOW.log
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
cd $SrcDir
lcd /tmp/$$
bin
mget $FILE
bye
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't retrieve $FILE" >&2
exit
fi
OLDIFS="$IFS" # Special IFS variable controls splitting of unquoted variables
IFS="/"
for FILE in /tmp/$$/*
do
if [ ! -f "$FILE" ]
then
echo "No files retrieved" >&2
exit 1
fi
set -- $FILE # Splits /path/to/file into $1="", $2="path", $3="to", $4="file"
shift $(( $# - 1 )) # $1="file", all the rest disappears
if [ "$(wc -c < "${DstDi}/$1")" -ne "$(wc -c < "/tmp/$$/$1")" ]
then
echo "Sizes of original and new file differ" >&2
exit
fi
done
IFS="$OLDIFS"
.................................................
after run
./ftp1.sh: line 44: warning: here-document at line delimited by end-of-file (wanted `EOF')
./ftp1.sh: line 45: syntax error: unexpected end of file
You changed an <<EOF
into an << EOF
, try removing the space.
Now the Code look like below
exec >>/tmp/log
exec 2>&1
HOST=''
ftpuser=''
ftppass=''
NOW=$(date +"%m-%d-%Y")
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST <<EOF
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
mget $FILE
bye
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't retrieve $FILE" >&2
exit
fi
OLDIFS="$IFS" # Special IFS variable controls splitting of unquoted variables
IFS="/"
for FILE in /tmp/$$/*
do
if [ ! -f "$FILE" ]
then
echo "No files retrieved" >&2
exit 1
fi
set -- $FILE # Splits /path/to/file into $1="", $2="path", $3="to", $4="file"
shift $(( $# - 1 )) # $1="file", all the rest disappears
if [ "$(wc -c < "${DstDi}/$1")" -ne "$(wc -c < "/tmp/$$/$1")" ]
then
echo "Sizes of original and new file differ" >&2
exit
fi
done
IFS="$OLDIFS"
You have not defined the value of FILE.
exec >/tmp/log
exec 2>&1
HOST=''
ftpuser=''
ftppass=''
NOW=$(date +"%m-%d-%Y")
FILE="XXXX.$(date +%y%m%d)"
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST <<EOF
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
get $FILE
bye
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't retrieve $FILE" >&2
exit
fi
OLDIFS="$IFS" # Special IFS variable controls splitting of unquoted variables
IFS="/"
for FILE in /tmp/$$/*
do
if [ ! -f "$FILE" ]
then
echo "No files retrieved" >&2
exit 1
fi
set -- $FILE # Splits /path/to/file into $1="", $2="path", $3="to", $4="file"
shift $(( $# - 1 )) # $1="file", all the rest disappears
if [ "$(wc -c < "${DstDi}/$1")" -ne "$(wc -c < "/tmp/$$/$1")" ]
then
echo "Sizes of original and new file differ" >&2
exit
fi
done
IFS="$OLDIFS"
Found my mistake.
exec >/tmp/log
exec 2>&1
HOST=''
ftpuser=''
ftppass=''
NOW=$(date +"%m-%d-%Y")
FILE="XXXX.$(date +%y%m%d)"
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST <<EOF
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
get $FILE
bye
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't retrieve $FILE" >&2
exit
fi
OLDIFS="$IFS" # Special IFS variable controls splitting of unquoted variables
IFS="/"
for FILE in /tmp/$$/*
do
if [ ! -f "$FILE" ]
then
echo "No files retrieved" >&2
exit 1
fi
set -- $FILE # Splits /path/to/file into $1="", $2="path", $3="to", $4="file"
shift $(( $# - 1 )) # $1="file", all the rest disappears
if [ $(wc -c < "${DstDi}/$1" ) -ne $(wc -c < "/tmp/$$/$1" ) ]
then
echo "Sizes of original and new file differ" >&2
exit
fi
done
IFS="$OLDIFS"
HOST=''
ftpuser=''
ftppass=''
NOW=$(date +"%m-%d-%Y")
FILE="XXXX.$(date +%y%m%d)"
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST 2>&1 <<EOF | tee $NOW
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit 1
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
get $FILE
bye
EOF
if [ "$?" -ne 0 ] || [ ! -f /tmp/$$/$FILE ]
then
echo "Couldn't retrieve $FILE" >&2
exit 1
fi
FTPSIZE=$(awk '$NF==FILE { print $(NF-1) }' FILE="$FILE" "$NOW")
LOCALSIZE=$(wc -c < /tmp/$$/$FILE)
if [ "$FTPSIZE" -ne "$LOCALSIZE" ]
then
echo "File differs from remote size" >&2
exit 1
fi
# File has successfully transferred, move it from /tmp/$$ into /tmp
mv /tmp/$$/$FILE /tmp
NOW=$(date +"%m%d%Y")
FILE="XXXXX.TXT"
#I add below for changing the file name with below format
filename=YYYYL.$(date --date="-1 day" +"%Y%m%d").001
exec > $NOW.log
exec 2>&1
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST 2>&1 <<EOF | tee $NOW
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit 1
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
get $FILE
bye
EOF
if [ "$?" -ne 0 ] || [ ! -f /tmp/$$/$FILE ]
then
echo "Couldn't retrieve $FILE" >&2
exit 1
fi
FTPSIZE=$(awk '$NF==FILE { print $(NF-1) }' FILE="$FILE" "$NOW")
LOCALSIZE=$(wc -c < /tmp/$$/$FILE)
if [ "$FTPSIZE" -ne "$LOCALSIZE" ]
then
echo "File differs from remote size" >&2
exit 1
fi
#I add below for copy file from tmp and save the file as specific name
cp -p /tmp/$$/$FILE /tmp/$filename
# File has successfully transferred, move it from /tmp/$$ into /tmp
mv /tmp/$$/$FILE /tmp
echo "SUCCESSFULLY RETRIEVED $FILE & RENAME AS $filename" >&2
NOW=$(date +"%m%d%Y")
FILE="XXXXX.TXT"
#I add below for changing the file name with below format
filename=YYYYL.$(date --date="-1 day" +"%Y%m%d").001
DATEFILE="/tmp/datefile"
exec > $NOW.log
exec 2>&1
if ! mkdir /tmp/$$
then
echo "Couldn't create /tmp/$$" >&2
exit 1
fi
echo "Storing into /tmp/$$" >&2
SrcDir="FTP"
DstDi='/tmp/'
trap "rm -Rf /tmp/$$" EXIT # Clean up temp folder when the script quits by any means
# Check if you can connect.
ftp -nvd $HOST 2>&1 <<EOF | tee $NOW
quote user $ftpuser
quote pass $ftppass
hash
prompt off
ls
EOF
if [ "$?" -ne 0 ]
then
echo "Couldn't connect" >&2
exit 1
fi
# Get the remote file
ftp -nvd $HOST <<EOF
quote USER $ftpuser
quote PASS $ftppass
hash
prompt off
lcd /tmp/$$
bin
get $FILE
bye
EOF
if [ "$?" -ne 0 ] || [ ! -f /tmp/$$/$FILE ]
then
echo "Couldn't retrieve $FILE" >&2
exit 1
fi
FTPSIZE=$(awk '$NF==FILE { print $(NF-1) }' FILE="$FILE" "$NOW")
LOCALSIZE=$(wc -c < /tmp/$$/$FILE)
if [ "$FTPSIZE" -ne "$LOCALSIZE" ]
then
echo "File differs from remote size" >&2
exit 1
fi
NEWDATE=$(awk 'NR==1 { print substr($1, 9) }' /tmp/$$/"$FILE" )
if [ -f "$DATEFILE" ]
then
read OLDDATE < "$DATEFILE"
if [ -z "$OLDDATE" ] || [ -z "$NEWDATE" ] || [ "$OLDDATE" = "$NEWDATE" ]
then
echo "old=$OLDDATE, new=$NEWDATE, error" >&2
exit 1
fi
fi
echo "$NEWDATE" > "$DATEFILE"
#I add below for copy file from tmp and save the file as specific name
cp -p /tmp/$$/$FILE /tmp/$filename
# File has successfully transferred, move it from /tmp/$$ into /tmp
mv /tmp/$$/$FILE /tmp
echo "SUCCESSFULLY RETRIEVED $FILE & RENAME AS $filename, new date is $NEWDATE" >&2
The ls format for Microsoft's FTP server appears to be like this:
---------- 1 owner group 1803128 Jul 10 10:18 source.zip
d--------- 1 owner group 0 May 9 19:45 upload
so I believe size should be $(NF-4):
FTPSIZE=$(awk '$NF==FILE { print $(NF-4) }' FILE="$FILE" "$NOW")
I've added the script into shell script menu. After run the menu option it not showing any msg but the log files generated properly in specified location also written the error msg to log..But i need to show the error msg or successful msg after executing the script through menu.
Show your menu script.
Show what it's doing.
Show what you want it to do.
function main_menu()
{
while :
do
echo
clear
echo "------------------------------------------------------------------------------------"
echo ""
echo " ABC System Limited"
echo " MAIN MENU"
echo "------------------------------------------------------------------------------------"
echo
echo " Before"
echo
echo " 1.Retrieve & Transfer Files"
echo
echo " Start"
echo
echo " 2.start Batch run"
echo " 3.Generate Report & Monitor log"
echo
echo " After"
echo
echo " 4.Retrieve & Transfer sys Files"
echo " 5.Retrieve & Transfer DB & log files"
echo
echo " 99.Quit"
echo""
echo "--------------------------------v1.0-------------------------------------------------"
echo ""
read -p "Select from 1-7 or 99 to Exit: " m_choice
echo
case "$m_choice" in
1) incoming
echo
;;
2) outgoing
echo
;;
3) backup
;;
99) exit 0
;;
*) echo "Bad Option"
echo
;;
esac
done
}
function incoming()
{
while :
do
echo
clear
echo "------------------------------------------------------------------------------------"
echo ""
echo " ABC System Limited"
echo " Support Team"
echo "------------------------------------------------------------------------------------"
echo
echo " Retrieve & Transfer files"
echo
echo " 11. Retrieve & Transfer files1"
echo " 12. Retrieve & Transfer files2"
echo " 13. Retrieve & Transfer file3"
echo " 14. Retrieve & Transfer file4"
echo
echo " 00. Retrieve all"
echo ""
echo " 99. Exit"
echo ""
echo "--------------------------------v1.0-------------------------------------------------"
echo ""
read -p "Selct From 1-4 or Select All: " s_choice
echo
case "$s_choice" in
11) /tmp/menu45.sh [run the script]
;;
12) echo "Sub-Menu Option 2"
echo
;;
13) echo "Sub-Menu Option 3"
echo
;;
14) echo "Sub-Menu Option 4"
echo
;;
97) echo "Sub-Menu Option 5"
echo
;;
99) main_menu
;;
*) echo "Bad Option"
echo
;;
esac
done
}
main_menu
exit 1
if successfull below mess will show
Following file has been Retrieved from FTP
filename here
Renamed as
renamed filename
if error
file size mismatch
Expected file was not in location
expected filename ""
file indicator problem
And Transfer to server
function main_menu()
{
while :
do
echo
clear
echo "------------------------------------------------------------------------------------"
echo ""
echo " ABC System Limited"
echo " MAIN MENU"
echo "------------------------------------------------------------------------------------"
echo
echo " Before"
echo
echo " 1.Retrieve & Transfer Files"
echo
echo " Start"
echo
echo " 2.start Batch run"
echo " 3.Generate Report & Monitor log"
echo
echo " After"
echo
echo " 4.Retrieve & Transfer sys Files"
echo " 5.Retrieve & Transfer DB & log files"
echo
echo " 99.Quit"
echo""
echo "--------------------------------v1.0-------------------------------------------------"
echo ""
read -p "Select from 1-7 or 99 to Exit: " m_choice
echo
case "$m_choice" in
1) incoming
echo
;;
2) outgoing
echo
;;
3) backup
;;
99) exit 0
;;
*) echo "Bad Option"
echo
;;
esac
done
}
function incoming()
{
while :
do
echo
clear
echo "------------------------------------------------------------------------------------"
echo ""
echo " ABC System Limited"
echo " Support Team"
echo "------------------------------------------------------------------------------------"
echo
echo " Retrieve & Transfer files"
echo
echo " 11. Retrieve & Transfer files1"
echo " 12. Retrieve & Transfer files2"
echo " 13. Retrieve & Transfer file3"
echo " 14. Retrieve & Transfer file4"
echo
echo " 00. Retrieve all"
echo ""
echo " 99. Exit"
echo ""
echo "--------------------------------v1.0-------------------------------------------------"
echo ""
read -p "Selct From 1-4 or Select All: " s_choice
echo
case "$s_choice" in
11) /home/maruf/menu45.sh
printf "Hit enter to return to menu"
read REPLY
;;
12) echo "Sub-Menu Option 2"
echo
;;
13) echo "Sub-Menu Option 3"
echo
;;
14) echo "Sub-Menu Option 4"
echo
;;
97) echo "Sub-Menu Option 5"
echo
;;
99) main_menu
;;
*) echo "Bad Option"
echo
;;
esac
done
}
main_menu
exit 1