脚本编程

bat/cmd批处理连接SqlServer数据库查询脚本

难得今天晚上9点前赶回家,而且最近草稿箱也压了不少“湿货”,就挑一篇发出来好了!不过在发文章之前先吐槽一下那个从昨天攻击张戈博客到现在还在继续的无聊蛋疼之人! 本来就算开启了云加速全缓存也是扛不住的,因为静态中混着动态请求,比如浏览计数。还好灵机一动,对这些动态做了点小手脚,现在基本毫无压力了!粗略分析一下这个攻击博客的小人,无外乎是2种人: ①、最近张戈博客流量大涨,估计遭人妒忌或者是挡人财路; ②、来张戈博客换友链被拒或被忽略的人,怀恨在心。 对于①:俗话说无人妒忌是庸才,那么无人妒忌的网站也不能算是优秀的网站。其实,你只闻到我的香水,却没看到我的汗水,你只看到了我的排名,却没看到我的用心。 建站一年多,或多或少对SEO有一些自己的见解。结合张戈博客的发展历程,我认为真正以用户体验、设身处地为用户着想的内容才是最好的“农家肥”,而不是那些短期就能看到成效的“化肥”!写文章时我会时刻想着用户是否看得懂,怎样写才能让用户更容易?总之,文章如果只是贴上你的测试过程,那这博客就真的只是印象笔记了! 所以,如果你是眼红而攻击我,那就继续吧,不把张戈博客打死你就是孬种。 对于②:怎么说呢,前面那篇文章已经说了张戈博客的友链要求,但还是有不少朋友热心的请求交换友链。可是你的网站确实还不够看,达不到我的要求,你要我怎么弄?如果都同意,那我首页不就变成导航了吗?如果是因为拒绝友链而攻击我,那么请继续,但千万别让我知道了是哪个网站,否则你懂的。。。 好了,废话说的够多的了,下面说正事。 前面也说了,我现在的新公司大部分服务器是Windows Server环境,前人都是用Python写的监控脚本,最近正好遇到了一个添加Zabbix监控项目的需求,我就琢磨着用我刚工作时拿手的bat批处理来完成这个项目。 不出意外,批处理果然可以胜任,不过要借助sqlserver命令行工具的帮助,代码如下: 使用方法: ①、验证执行:在CMD中执行【脚本.bat +  监控名】即可,比如:D:\>monitor1.bat  monitor1 ②、关联zabbix:zabbix中怎么设置我就不赘述了,注意下zabbix配置文件zabbix_command.conf如下添加: Ps:主要是注意,需要添加一个cmd /k前置,否则zabbix执行不了,也得不到数据。  最后附几个 osql.exe 命令的实用参数及相关下载地址:
阅读全文
脚本编程

grep无法查找shell传过来的变量?先注意一下文本格式吧!

昨天,同事告诉我发现一个诡异的问题,grep无法搜索shell中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行! 大概就是这样一个要求: ①、有个文本为userid.txt,里面每一行一个用户id,类似如下: ②、另外还有一个文本为record.txt,里面是所有用户的操作记录,一行一条,并且包含有id,类似如下: ③、现在他要求循环取出userid.txt中每一行ID值,然后去record.txt去查找并保存结果。 实现这个需求原本很简单,根本难不倒他,只要使用while read + grep 就能搞定。可问题是明明record.txt里面包含这些id,却无法输出结果?? 我顺便写了一个测试脚本测试了下: 发现脚本可以打印echo $userId,却无法grep到??而实际上record.txt里面是有这个id的!还真诡异! 先百度搜索了一下【grep 无法搜索变量】,还真有不少类似问题,比如:http://bbs.chinaunix.net/thread-123113-1-1.html 根据经验,对于这种诡异的问题,我首先会想到是不是系统有问题,要是系统有问题你怎么折腾都是错! 于是把他的文件拷贝到其他服务器,发现居然可以了!!!难道真是系统问题么? 第一台是SUSE Linux,第二台是Centos,难道和系统发行版有关系? 后来,同事在第二台服务器上完成了他的项目。但这个问题却一直留在我的脑子里,挥之不去。   今天,我决定再次研究下这个问题,看看是不是有其他原因。我先在那台SUSE Linux上,手工编写所需文件: # vim 1.txt # vim 2.txt # vim test.sh 结果,发现居然可以输出结果!证明这系统没有问题啊!于是再一次测试了一下昨天的脚本,发现还是无法输出。 于是使用 -x 参数 调试一下脚本: 先修改脚本代码: 然后,带 -x 参数执行: 难怪找不到,grep的变量已经变了!0001变成了 $'0001\r' ! 看到\r,立马想到是文本中的换行符,可为毛会输出换行符呢?想到博客以前写的《Linux终端:用cat命令查看不可见字符》,继续改了一下代码: 执行后恍然大悟: 原来是dos下的文本格式,问了下同事,他还真是从Windows下导过来的! — —|| 也就是说,userid.txt这个文本的换行符是Windows格式,在Linux下读取会带有^M。 所以解决上述问题,就很明了了,要么转换userid.txt的换行格式,要不就修改代码,去掉多余的字符! 试了下转换格式,发现居然转换不成功,可能是我没找对方法,暂时先不折腾了! 直接如下修改代码,就搞定了: 好了,搞了半天原来是dos和unix的换行符问题!o(︶︿︶)o 唉!还是经验不足啊! 网上那些问grep无法搜索变量的朋友,赶紧看看是不是文本格式造成的!现在,让我很纳闷的是,为毛在另一台centos系统可以直接grep??为什么在SUSE系统就不行? 如果和发行版没关系的话,那造成2个不同结果的原因就只有一个:在我用sz+rz命令将所有文本传送到centos的过程中,文件很可能被自动转格式了!好吧,具体就不深究了,有兴趣的可以试试看。
阅读全文
脚本编程

Linux系统防CC攻击自动拉黑IP增强版Shell脚本

最新更新:张戈博客已推出功能更强大的轻量级CC攻击防御脚本工具CCKiller==>传送门 前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存黑名单突然无法过滤后台,导致WordPress无法登录!虽然,可以通过修改本地hosts文件来解决这个问题,但是还是想暂时取消CDN加速和防护来测试下服务器的性能优化及安全防护。 前天写的Shell脚本是加入到crontab计划任务执行的,每5分钟执行一次,今天实际测试了下,可还是可以用的,但是感觉5分钟时间有点过长,无法做到严密防护。于是稍微改进了下代码,现在简单的分享下! 一、Shell代码 二、执行脚本 将以上代码保存为deny_blackip.sh之后,进入到脚本文件所在目录,然后使用如下命令后台执行脚本(后面的50表示并发数,可自行调整): 执行后会出现如下信息: 表示如果脚本产生输出信息,将会写入到nohup.out文件,可以看到当前目录已经生成了一个空的nohup.out: 好了,现在你执行执行ps aux 应该可以找到如下进程: 一切顺利!每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服务器虽说很少有人攻击,但是基本的安装防护还是必须要做的!希望本文对你有所帮助!
阅读全文
脚本编程

VPS/Linux系统防CC攻击带白名单过滤功能的Shell脚本

最新更新:张戈博客已推出功能更强大的轻量级CC攻击防御脚本工具CCKiller==>传送门 根据我个人VPS需求,并参考了余洪春前辈的《自动甄别黑白名单的iptables安全脚本》,编写如下Shell代码。 脚本名称:自动拉黑CC攻击者IP的Shell脚本 功能说明:通过netstat -an命令统计出当前请求并发大于100的IP,然后将不在白名单的IP自动加入DROP规则 使用说明: ①、在Linux系统下将以下代码保存为shell脚本,比如:deny_ip.sh,并执行chmod+x deny_ip.sh加执行权限 ②、如果有要排除的白名单IP,需要将这些IP加入到脚本同目录的white_ip.txt当中,一行一个 ③、最后使用crontab -e 将脚本加入到系统计划任务当中,每五分钟执行一次即可(最后的数值表示最大并发数): 注意事项: ①、该脚本对于使用了百度云加速或360网站卫士的网站无效,因为IP都已经变成了CDN节点了,请勿使用此脚本 ②、若不需要支持一个段为白名单,可自行修改24~27行的代码,更加准确的对应到每个IP ③、若发现和白名单同一个段IP出现在高并发列表,将不会直接拉黑,而是写入到recheck_ip.txt,如果有监控信息机制,可以在这个地方加入监控报警,告知管理员这个可疑的IP ④、脚本都有详细注解,就不罗嗦了,本身也没多做测试,有兴趣的可以看看。
阅读全文
脚本编程

Linux/vps本地七天循环备份和七牛远程备份脚本

博客前些时间分享过一次vps远程备份到七牛的工具,全傻瓜式交互操作,但也有一个很大的缺憾,那就是不够灵活,在无人干预的情况下,无法完成对多个站点的远程备份设置。 这次博客搬家到vps后,张戈花了点时间完善了下,实现了多站点,多数据库的本地七天循环备份和同步备份至七牛云存储的脚本。 一、类型说明 ①、七天循环备份 受服务器空间制约,我们不可能在VPS上每天都备份一份新的网站数据,一是没必要,二是占空间。我们折中一下,采用星期命名,每次备份将覆盖上星期同一天的文件。从而只备份7份数据,不至于占用特别大的空间。 如果,你的vps很小家子气或是网站数据太庞大,那还可以再折中一下,仅在星期二、四、六做备份,即总共三份数据。甚至还可以选一个星期的某一天做备份,即一周备份一次,也是可以的。 在空间允许的情况下,个人推荐做7天循环备份,在vps数据全部丢失的时候,能最大程度的容灾,恢复到丢失前一天,甚至是当天凌晨备份的所有数据,非常完美! ②、七牛远程备份 七牛远程备份就是将本地的7天备份的数据每天同步至七牛云存储私人空间,就算整台vps奔溃时,还能从容的恢复数据。相当于双保险,要知道七牛和你的vps同时宕机的几率是非常小的。 二、准备工作 ①、整理vps已有网站对应的数据库用户名和密码(如不清楚可直接用mysql的root帐号); ②、整理vps已有网站的根目录所在路径,比如 /home/wwwroot/zhang.ge ③、想好本地想要存放备份文件的路径,比如/home/wwwbackup ④、还没有七牛帐号的,点此注册一个,然后新建一个私人空间(为了数据安全,请勿使用公开空间,仅恢复数据时临时切换到公开状态即可),记录空间名以及帐号密钥: 三、本地七天备份 ①、登录VPS编写脚本 脚本代码如下: 使用说明: ②、将代码中的2处 mypassword 改成你自定义的压缩密码(确保数据安全),并保存为backup.sh之后,执行chmod +x backup.sh 赋执行权限。 为了避免复制转码问题,下文已打包分享 Ps:下载的代码包没有加密打包,请自行参考上述代码,自行加上【-P密码】参数。 ③、执行./backup.sh --help 可获得如下帮助说明: ④、备份数据库: 命令行示例如下: 命令参数说明: 参数1:db,设置备份类型为数据库 参数2:domain 网站域名,如zhang.ge,用于备份文件命名 参数3:dbname  要备份的数据库名次,如zhangge_db 参数4:mysqluser  mysql用户名,如不清楚可用mysql 的root帐号 参数5:mysqlpassword  mysql密码 参数6:back_path  备份文件存放路径 ⑤ 备份网站文件: 命令行示例: 命令参数说明: 参数1:file,设置备份类型为网站文件 参数2:domain 网站域名,如zgboke.com,同样用于备份文件的命名 参数3:site_path 网站文件的路径,如/home/wwwroot/zgboke.com 参数4:back_path 备份文件存放路径 Tips:为了方便后面的七牛同步,建议将备份文件存放到同一个上级目录,然后以网站域名来命名当前目录,比如,同一个vps的备份数据,我都放到/home/wwwbackup/,然后以各自的网站域名来命名,zhang.ge的数据库和文件我都统一存放到/home/wwwbackup/zhang.ge。 最新补充:2014/10/25日,手动执行命令检查时,发现报如下错误信息: Access denied for user 'dbuser'@'localhost' to database 'db' when using LOCK TABLES 即提示该用户不具备锁表权限,导致数据导出失败!这种情况一般发生在数据库正在执行某个查询动作,此时普通帐号是无法导出备份的! 解决办法: 方法①、修改上面的备份脚本,找到如下行 添加--skip-lock-tables参数即可,即不锁表导出(可能丢失某些正在更新的数据,当然凌晨时候几率很小)。 方法②、使用root帐号执行备份即可: 执行crontab -e 修改Linux计划任务,修改数据库备份计划命令行中的用户名为mysql的root帐号: 个人推荐方法②,最大限度的保证了数据备份的完整度! ⑥、建立七天备份的任务计划 I. 先执行crontab -l 看看命令是否存在,若不存在,请使用  yum -y install vixie-cron crontabs 安装crond II. 确认crond已存在后,请执行/etc/init.d/crond start 确保启动了crond服务,并执行chkconfig crond on设置为开机启动。 III. 执行crontab -e 建立任务计划,如下是我的vps的任务计划,请参考添加: 每个网站2行,第一行备份数据库,第二行备份网站文件。 crontab参数格式为 {分 时...
阅读全文
Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点 脚本编程

Shell+Curl网站健康状态检查脚本,抓出中国博客联盟失联站点

一开始搭建中国博客联盟,既有博友提醒我,做网址大全这类网站维护很麻烦,需要大量的精力去Debug一些已夭折的网站,更是拿松哥的博客大全举例。当然,我也是深以为然。前些时间,看到梦轩丽人的boke123网址大全的维护记录,好像是纯手工检查,张戈实在是佩服的五体投地,太有毅力了。 现在博客联盟也收录的博客也已破200了,全部来自自主提交,不管你是草博还是名博,张戈不会强买强卖。由于大部分都是建站不过半年的新站,半路放弃、提前太监的博客估计还是有的,于是我决定还是把站点维护这个工作做起来。 上午用PHP做了一个放到了京东云试了下,发现检测速度一般,要等上半天(我写的php太蹩脚,就不献丑了)。 随后,我在VPS上写了一个多线程的网站状态检测脚本,直接从数据库load站点地址,然后用curl去检测返回码,发现速度非常好,基本1分钟内就能出结果 以下是脚本代码: Ps:关于shell多线程脚本,后续文章会有一个详细说明,本文篇幅有限,就不多说了。 以下是中国博客联盟第一次成员站点存活检测的结果: ①、 非200返回码的异常站点: ②、脚本抓取的无法访问站点: 人工访问筛选结果: wangyingxue.net(王英学博客):无法访问,经确认处于备案中  √ www.tao0102.com(长江博客):可以访问  √ blog.hack7d.com(Mcdull技术博客):无法访问  × www.1992621.com(教师日记):可以访问  √ www.3miaotu.com(三秒兔):无法访问   × xiaoxiaomayi.com(小小蚂蚁博客):可以访问 √ www.awrui.com(李文栋博客):可以访问  √ Ps:脚本检测机制为:8s内未连通的判定为异常,并重试3次,最后输出结果,若三次均异常则为000。从图中和人工筛选可以看出,存在一些误杀,这个和8s的设定有一定关系。可以考虑设置为更长时间,得到更准确的结果,当然最终还是要结合人工确认的,所以也没多大关系。 后续,中国博客联盟会制订一个检查周期,最短每星期检查一次,最长一个月检查一次,争取让每个展示的站点都能正常访问。当然,我也会将每次检查的结果公布在中国博客联盟的站长资讯专栏,方便所有成员查看。 由于目前中国博客联盟部署在京东云擎,无法远程操控数据库,所以只好暂时用半自动的模式。等以后有时间搬到了阿里云等VPS上后,将会将脚本改成全自动状态,当有网站联系多次检测为失联状态时,将会暂时将其设置为隐藏状态。
阅读全文