简体   繁体   English

尝试使用此 bash 脚本从 ssh 登录到远程 ftp 并删除超过 N 天的文件

[英]Trying to use this bash script to login to a remote ftp from ssh and delete files older than N days old

I am trying to use the following bash script to login to a remote ftp and delete files older than N days old.我正在尝试使用以下 bash 脚本登录到远程 ftp 并删除超过 N 天的文件。 Script says it is working and does not give an error - but files are not being deleted.脚本说它正在工作并且没有给出错误 - 但文件没有被删除。 What am I missing?我错过了什么? Or is there a better way to do this?还是有更好的方法来做到这一点? Keep in mind this is only a remote FTP and not SSH so I can NOT use the mtime function is why I am trying to do this.请记住,这只是一个远程 FTP 而不是 SSH 所以我不能使用 mtime function 是我尝试这样做的原因。 Can anyone help?任何人都可以帮忙吗?

The usage is all commands - here is what I am using via ssh to run the script用法是所有命令 - 这是我通过 ssh 使用的运行脚本

./ftprem.sh -s ftp.server.com -u myusername -p mypassword -f /directory -d 3 ./ftprem.sh -s ftp.server.com -u myusername -p mypassword -f /directory -d 3

    #!/bin/bash

PROGNAME=$(basename $0)

OUTFILE="/tmp/ftplist.$RANDOM.txt"
CMDFILE="/tmp/ftpcmd.$RANDOM.txt"
ndays=14

print_usage() {
    echo ""
    echo "$PROGNAME - Delete files older than N days from an FTP server"
    echo ""
    echo "Usage: $PROGNAME -s -u -p -f (-d)"
    echo ""
    echo "  -s  FTP Server name"
    echo "  -u  User Name"
    echo "  -p  Password"
    echo "  -f  Folder"
    echo "  -d  Number of Days (Default: $ndays)"
    echo "  -h  Show this page"
    echo ""
    echo "Usage: $PROGNAME -h"
    echo ""
    exit
}

# Parse parameters
options=':hs:u:p:f:d:'
while getopts $options flag
do
    case $flag in
        s)
            FTPSITE=$OPTARG
            ;;
        u)
            FTPUSER=$OPTARG
            ;;
        p)
            FTPPASS=$OPTARG
            ;;
        f)
            FTPDIR=$OPTARG
            ;;
        d)
            ndays=$OPTARG
            ;;
        h)
            print_usage
            ;;
        \?)
            echo "Invalid option: -$OPTARG" >&2
            exit 1
            ;;
        :)
            echo "Option -$OPTARG requires an argument." >&2
            exit 1
            ;;
    esac
done 

shift $(($OPTIND - 1))

if [[ -z "$FTPSITE" || -z "$FTPUSER" || -z "$FTPPASS" || -z "$FTPDIR" ]];
then
    echo "ERROR: Missing parameters"
    print_usage
fi


# work out our cutoff date
TDATE=`date --date="$ndays days ago" +%Y%m%d`

echo FTP Site: $FTPSITE
echo FTP User: $FTPUSER
echo FTP Password: $FTPPASS
echo FTP Folder: $FTPDIR
echo Removing files older than $TDATE

# get directory listing from remote source
ftp -i -n $FTPSITE <<EOMYF > /dev/null
user $FTPUSER $FTPPASS
binary
cd $FTPDIR
ls -l $OUTFILE
quit
EOMYF

if [ -f "$OUTFILE" ]
then

    # Load the listing file into an array
    lista=($(<$OUTFILE))

    # Create the FTP command file to delete the files
    echo "user $FTPUSER $FTPPASS" > $CMDFILE
    echo "binary" >> $CMDFILE
    echo "cd $FTPDIR"  >> $CMDFILE

    COUNT=0

    # loop over our files
    for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do
        # month (element 5), day (element 6) and filename (element 8)
        FMM=${lista[`expr $FNO+5`]}
        FDD=${lista[`expr $FNO+6`]}
        FYY=${lista[`expr $FNO+7`]}

        if [[ $FYY == *\:* ]]
        then
            FDATE=`date -d "$FMM $FDD" +'%Y%m%d'`
        else
            FDATE=`date -d "$FMM $FDD $FYY" +'%Y%m%d'`
        fi

        # echo $FDATE
        # check the date stamp
        if [[ $FDATE -lt $TDATE ]];
        then
            echo "Deleting ${lista[`expr $FNO+8`]}"
            echo "delete ${lista[`expr $FNO+8`]}" >> $CMDFILE
            COUNT=$[$COUNT + 1]
        fi
    done
    echo "quit" >> $CMDFILE


    if [[ $COUNT -gt 0 ]];
    then
        cat $CMDFILE | tr -d "\r" > $CMDFILE
        ftp -i -n $FTPSITE < $CMDFILE > /dev/null
    else
        echo "Nothing to delete"
    fi

    rm -f $OUTFILE $CMDFILE
fi

If this helps your debugging...如果这有助于您的调试...
In the # Parse parameter section of the script, the options variable your have just before the case block has value options=':hs:u:p:f:d:' instead of options=':h:s:u:p:f:d:'在脚本的# Parse parameter部分中,您在case块之前的options变量具有值options=':hs:u:p:f:d:'而不是options=':h:s:u:p:f:d:'
I thought i should point that out.我想我应该指出这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM