Мне удалось написать сценарий 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