手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表全部文章

网站挂了半天

其实从昨天晚上11点多开始就挂了。VPS提供商对我说,他们遭受攻击了。他们旗下的几台服务器,全部被攻击,导致无法正常使用。已经联系了美国机房那边

 
有时候想想,技术何苦为难技术,MD,都是吃这碗饭的人,何苦呢。
所幸,中午的时候,恢复了。总算没有达到24小时。和VPS提供商扯了扯皮,继续使用。
 
突然间,我想起我一年前想的,多站互为镜像 之类的想法,然后写个脚本,用来监控,一旦发现有问题了,立刻调用dnspod的接口,更新数据信息
 
不过,人有点懒了,想找个人一起做做事。

linux 批量重命名文件

 其实说白了就是利用sed,但怎么个用法,确实是有点想法,毕竟sed的功能实在太强了。

单一文件重命名就太简单了,mv一下就全来了。批量怎么办?
OK,一句话:
XML/HTML代码
  1. for i in `ls`; do mv -f $i `echo $i | sed 's/????/?????/'`; done  
看到没。其实就是一个for in,然后 mv 一下。只是mv的蚨,用sed进行了改名,用上了管道,echo 等。
 
接着来:
1、改文件的首字母为a:
如果是前两个字母,就是^..
  1. for i in `ls`; do mv -f $i `echo $i | sed 's/^./a/'`; done  
2、改文件的末字母为a
 如果是后几个字母就是..$
  1. for i in `ls`; do mv -f $i `echo $i | sed 's/.$/a/'`; done    
3、文件名加前缀:
XML/HTML代码
  1. for i in `ls`; do mv -f $i `echo "prefix_"$i`; done  
4、文件名小写变大写
XML/HTML代码
  1. for i in `ls`; do mv -f $i `echo $i | tr a-z A-Z`; done  
顾名思议,大写变小写就是将A-Z和a-z换一个位置
5、改指定字符为其他(如后缀名)
XML/HTML代码
  1. for i in `ls`; do mv -f $i `echo $i | sed 's/.html/.php/'`; done  
更多技巧,请参考sed的用法

Tags: sed, 重命名

php能做什么?

 最近好象关于PHP能做什么的话题又出来了。其实说白了,PHP啥都能做,进可攻退可守。有人说,PHP没有多线程,没有这没有那。其实很多人都用PHP实现了这些功能。

先说其他的,上次thinkinlamp聚会的时候,一位台湾朋友就展示了php用来做类似单片机功能的事情。也从侧面证明了,PHP可以搞类似驱动的事情(也只能在linux下面,毕竟linux下面任何东西都是文件)
 
PHP还能做什么?有人用php来自己做Web服务器。或许有人说了,PHP自带不是有PHP -S xxx:81吗?其实是很多人用socket自己实现了webserver。
 
还有人说PHP没有多线程,但PHP在linux下面fork进程后,也能算是当成多线程了吧。
 
只是目前可能是异步在实现上没有那么好吧。
有些项目大家可以看看的,先不谈有人直接用C实现PHP的框架,这没意思,为了提升性能,这些代码我们都看不到了。
不过,有些纯用PHP实现的玩意可以学习一下。这些代码,也不错,思路更不错
1、reactphp
2、aopphp
3、国内的swolephp
这些都是改变思路的程序,如果你要学多进程,其实,你可以看APNSPHP,即能用来当成apns server,你也可以照着学多进程的程序。

转:如何封杀尝试Raspberry Pi SSH密码的来源IP

标题是标题,但其实讲的内容当然是不一定只是在树梅的设备上用的。不要太纠结于表面,我不改标题是为了尊重原作者

原文来自于hugo zhu的网站:http://hugozhu.myalert.info/2013/03/08/block_failed_ssh_attempts_with_iptable.html,看了他的名字,你也可以猜出他的微博定就是http://weibo.com/hugozhu。OK,不扯蛋,上原文:

Raspberry Pi整天开着,如果用缺省SSH端口对外开放,就会经常遇到扫描SSH密码的肉鸡。虽然密码不是很简单,但还是感觉很不安全的。

系统的ssh登录日志文件在:/var/log/auth.log,登录失败时会记录以下格式的日志:

  1. Mar 7 10:31:51 raspberrypi sshd[24510]: Failed password for root from 221.8.19.129 port 4066 ssh2
  2. Mar 7 10:31:55 raspberrypi sshd[24514]: Failed password for root from 221.8.19.129 port 4079 ssh2
  3. Mar 7 10:31:56 raspberrypi sshd[24518]: Failed password for sshd from 221.8.19.129 port 4080 ssh2
  4. Mar 7 10:32:26 raspberrypi sshd[24522]: Failed password for sshd from 221.8.19.129 port 4149 ssh2

用最简单的Shell脚本来解决这个问题:

guard.sh

  1. #!/bin/bash
  2.  
  3. last_ip=""
  4. tail -f /var/log/auth | while read LINE; do
  5. {
  6. if [[ "${LINE}" =~ "Failed" ]]; then
  7. ip="$(echo ${LINE} | awk '{print $(NF-3)}')"
  8. if [[ "$last_ip" == "$ip" ]]; then
  9. echo "block $ip"
  10. #curl -s --data-ascii "uuid=<my iphone's uuid>" --data "body=${LINE}" http://raspberrypi/pushme
  11. iptables -A INPUT -s "$ip" -j DROP
  12. fi
  13. last_ip=$ip
  14. echo $LINE
  15. fi
  16. }
  17. done

用root用户执行以下命令,也可以放到启动脚本里:/etc/rc.local

  1. nohup /root/bin/guard.sh > /var/logs/guard.log 2>&1 &

如果连续两次输错密码,那ip就会被封,我另外加了一个报警,会通知到我的手机,这下感觉安全了些。

登录Pi用iptables -L可以看到被封杀的IP列表,如果需要解封这些IP,可以用命令iptables -F,也可以用crontjob每天定时运行一次iptables -F来清除

脚本还很简单,还可以有不少改进,可以在评论里讨论。

---EOF---

越来越发现,sablog需要改版了。再不改。alexa排名下降不说,最关键的是,代码的显示不爽了。只是想到改版后有几千篇的文字需要一一调整就痛苦。

getPageRank for golang

 不多说了。其实这是一个复刻版,原来的PHP代码就在注释里面。在google play上面已经存了代码了。如果你觉得我这里的代码看起来不方便,可以移步play.golang.org。

XML/HTML代码
  1. package main  
  2.   
  3. import (  
  4.     "fmt"  
  5.     "io/ioutil"  
  6.     "net/http"  
  7.     "net/url"  
  8.     "strings"  
  9.     "unicode/utf8"  
  10. )  
  11.   
  12. /**  
  13. //https://github.com/phurix/pagerank/blob/master/pagerank2.php  
  14. function GetPageRank($q,$host='toolbarqueries.google.com',$context=NULL) {  
  15.     $seed = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.";  
  16.     $result = 0x01020345;  
  17.     $len = strlen($q);  
  18.     for ($i=0; $i<$len; $i++) {  
  19.         $result ^= ord($seed{$i%strlen($seed)}) ^ ord($q{$i});  
  20.         $result = (($result >> 23) & 0x1ff) | $result << 9;  
  21.     }  
  22.     if (PHP_INT_MAX != 2147483647) { $result = -(~($result & 0xFFFFFFFF) + 1); }  
  23.     $ch=sprintf('8%x', $result);  
  24.     $url='http://%s/tbr?client=navclient-auto&ch=%s&features=Rank&q=info:%s';  
  25.     $url=sprintf($url,$host,$ch,$q);  
  26.     @$pr=file_get_contents($url,false,$context);  
  27.     return $pr?substr(strrchr($pr, ':'), 1):false;  
  28. }  
  29. */  
  30.   
  31. func main() {  
  32.     fmt.Println(getPageRank("http://neaststudio.com"))  
  33. }  
  34.   
  35. func getPageRank(urlstring string) string {  
  36.     seed := []byte("Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.")  
  37.     seedlen :len(seed)  
  38.     result :0x01020345  
  39.     q := []byte(urlstring)  
  40.     qlen :len(q)  
  41.     for i :0; i < qlen; i++ {  
  42.         seedmod :i % seedlen  
  43.         seed_ascii, _ :utf8.DecodeLastRuneInString(string(seed[seedmod]))  
  44.         q_ascii, _ :utf8.DecodeLastRuneInString(string(q[i]))  
  45.         result ^= int(seed_ascii ^ q_ascii)  
  46.         result = ((result >> 23) & 0x1ff) | result<<9  
  47.     }  
  48.     result = -(^(result & 0xffffffff) + 1)  
  49.     ch :fmt.Sprintf("8%x", result)  
  50.     u, _ :url.Parse("http://toolbarqueries.google.com/tbr")  
  51.     uq :u.Query()  
  52.     uq.Set("client", "navclient-auto")  
  53.     uq.Set("ch", ch)  
  54.     uq.Set("features", "Rank")  
  55.     uq.Set("q", "info:"+string(q))  
  56.     u.RawQuery = uq.Encode()  
  57.     resp, err :http.Get(u.String())  
  58.     if nil != err {  
  59.         return err.Error()  
  60.     }  
  61.     defer resp.Body.Close()  
  62.     body, err :ioutil.ReadAll(resp.Body)  
  63.     if nil != err {  
  64.         return err.Error()  
  65.     }  
  66.     //pagerank只有一位,所以可以直接取最后一位。。。免去正则  
  67.     if len(body) <= 0 {  
  68.         return "error"  
  69.     }  
  70.     pagerankbody :strings.TrimSpace(string(body[:]))  
  71.     return pagerankbody[len(pagerankbody)-1:]  
  72. }  

play.golang的地址是:http://play.golang.org/p/uACC-1rdF3

不过,在网页上执行会报错的,说是没有权限。。本地测试成功

 

Tags: pagerank