Назад | Перейти на главную страницу

Bash SFTP Script - слишком много попыток входа в систему похоже на DOS-атаку.

Мне удалось написать сценарий bash, основанный на чьей-то предыдущей работе, для отправки файлов через SFTP в приложение Limoma GoAnywhere. Я плохо владею bash или шеллом. К сожалению, приложение GoAnywhere, которое я пытаюсь сохранить в файлах SFTP, продолжает заносить в черный список IP-адрес моего исходного сервера.

Мне удалось получить ответ от человека, работающего с системой, который сказал мне, что существует ограничение в 60 попыток входа в систему, прежде чем он будет рассматривать это как атаку DOS. Я не уверен, что это за период времени.

Проблема с приведенным ниже сценарием заключается в том, что он выполняет вход в систему для каждого отправляемого файла. Мне нужно, чтобы вход был выполнен один раз перед циклом for, а затем отправил десятки файлов, прежде чем он закрыл соединение. Это будет контролироваться с помощью задания cron и выполняться примерно раз в час. Может ли кто-нибудь помочь переписать это, чтобы сделать одно соединение, а не несколько?

#!/bin/bash


today=`date +'%k:%M:%S-%m.%d.%Y'`
nowdate=`date +'%d%H%M'`

xferhome="/home/somefolder"
recdir="$xferhome/fax_incoming_prod"
procdir="$xferhome/fax_processed_prod"

# log stuff..
logfile="$xferhome/log/fax_xfer_prod.log"

# clean up log file @ beginning of every month..
if [ $nowdate -eq "091200" ]; then
        rm $logfile
fi

cd ${recdir}

# start
{

filearray=($(ls -ltr *.{pdf,fmi} 2>/dev/null | awk '{print $9}'))
idx=$((${#filearray[*]} - 1))

if [ $((${#filearray[*]})) -eq 0 ]; then
    echo "${today} Nothing found.."
    exit 2
fi

echo "${today} - send"

for ((i=0;i<=${idx};i++)); do
    echo "SFTP'ing .pdf file: ${filearray[${i}]}"
    fname=${filearray[${i}]}
    export fname
    expect <<'END'

        # Expect Variables

        set FTPUSER someusername
        set FNAME $env(fname)
        set FTPSERVER some.server.net
        set FILEPATH Fax_Queue_Prod
        set FTPPASS somepassword

        spawn /usr/bin/sftp -v -oPort=22 $FTPUSER\@$FTPSERVER
        expect "password:"
        send "$FTPPASS\n"
        expect "sftp>"
        send "cd $FILEPATH\n"
        expect "sftp>"
        send "put $FNAME\n"
        expect "sftp>"
        send "quit\n"

END
    echo "Moving ${filearray[${i}]} to processed directory"
    mv ${filearray[${i}]} ${procdir}/.
done

# logit all.. :)
} >>$logfile 2>>$logfile

Это кажется действительно сложным. Есть ли польза от использования sftp вместо scp?

Вы должны иметь возможность работать со всеми файлами в одном соединении с

scp -p "${filearray[@]}" $FTPUSER@$FTPSERVER:$FILEPATH

В filearray - это массив файлов, которые вы хотите передать из вашего скрипта. Он расширяется до имен файлов, которые вы хотите передать. Он расширяется до

scp -p "${filearray[1]}" "${filearray[2]}" ... "${filearray[n]}" $FTPUSER@$FTPSERVER:$FILEPATH