我有一个文件转发系统,其中一堆文件被下载到目录,解复用并复制到各个机器。 主服务器接收文件时会转发文件。文件通常以突发方式到达。 (通过ssh密钥验证)
此脚本创建sftp会话,并使用管道来监视fifo管道的头部。
HOST=$1
pipe=/tmp/pipes/${HOST%%.*}
ps aux | grep -v grep | grep sftp | grep "user@$HOST" > /dev/null
if [[ $? == 0 ]]; then
echo "FTP is Running on this Server"
exit
else
pid=`ps aux | grep -v grep | grep tail | tr -s ' ' | grep $pipe`
[[ $? == 0 ]] && kill -KILL `echo $pid | cut -f2 -d' '`
fi
if [[ ! -p $pipe ]]; then
mkfifo $pipe
fi
tail -n +1 -f $pipe | sftp -o 'ServerAliveInterval 60' user@$HOST > /dev/null &
echo cd /tmp/data >>$pipe #Sends Command to Host
echo "Started FTP to $HOST"
更新:我最终更改了清理代码以使用“ps aux”来查看ftp会话是否正在运行,以及随后尾部-f是否仍在运行。 grep by user @ host和管道名称。这是在调用脚本时完成的,每当我尝试上传文件时都会调用脚本 IE:
FILENAME=`basename $1`
function transfer {
echo cd /apps/data >> $2 # For Safety
echo put $1 .$FILENAME >> $2
echo rename .$FILENAME $FILENAME >> $2
echo chmod 0666 $FILENAME >> $2
}
./ftp.sh host
[ -p $pipedir/host ] && transfer $1 $pipedir/host
主服务器上接收的文件被Incron捕获,它将put命令和可用文件的位置写入fifo管道,由sftp发送(还要重命名)。
我的问题是,这样安全吗?这可能会导致ftp错误/事件崩溃。并不担心登录错误 目标是减少ftp登录次数。单个会话/分钟(或更多)间隔 并允许文件在收到时转发。动态命令。 如果可能的话,我更愿意使用标准的ubuntu库。
编辑:经过测试并解决了一些问题后,服务器只需运行
[[ -p $pipe ]] && echo FTP is Running on this Server
ln -s $pipe $lock &> /dev/null || (echo FTP is Running on this Server && exit)
[[ ! -p $pipe ]] && mkfifo $pipe
( tail -n +1 -F $pipe & echo $! > $pipe.pid ) | tee >
( sed "/tail:/ q" >/dev/null && kill $(cat $pipe.pid) |& rm -f $pipe >/dev/null; )
| sftp -i ~/.ssh/$HOST.rsa -oServerAliveInterval=60 user@$HOST &
rm -f $lock
它相当简单,但效果很好。
答案 0 :(得分:1)
您可能对建立更简单(且更强大)的同步化基础架构感兴趣: 如果文件到达时给定的主机没有连接......它永远不会收到它(如果我理解你的代码)
我会做类似
的事情 rsync -a -e ssh user@host:/apps/data pathToLocalDataStore
在客户端计算机上定期或按事件... rsync智能地按文件的时间戳和大小同步文件(-a contains -t)
事件将是一些进程终止,如: 客户端(在主机的〜/ .ssh / config中配置私钥使用):
#!/bin/bash
while :;do
ssh user@host /srv/bin/sleepListener 600
rsync -a -e ssh user@host:/apps/data pathToLocalDataStore
done
在服务器上
/srv/bin/sleepListener
是/bin/sleep
的符号链接
收到新文件后的服务器:
killall sleepListener
注意:每10分钟执行一次全面检查......如果节点离线/在线,则无关紧要......