我根据某人以前的工作编写了一个 bash 脚本,通过 SFTP 将文件发送到 Limoma GoAnywhere 应用程序。我不熟悉 bash 或 shell。不幸的是,我尝试通过 SFTP 将文件发送到的 GoAnywhere 应用程序一直将我的原始服务器的 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
答案1
这看起来真的很复杂。使用 sftp 代替 scp 有什么好处吗?
您应该能够通过一个连接访问所有文件
scp -p "${filearray[@]}" $FTPUSER@$FTPSERVER:$FILEPATH
这filearray
是要从脚本中传输的文件数组。它扩展为要传输的文件的名称。它扩展为
scp -p "${filearray[1]}" "${filearray[2]}" ... "${filearray[n]}" $FTPUSER@$FTPSERVER:$FILEPATH