作者: 比尔盖子

用Python3模拟《侏罗纪公园》中的黑客入侵情节

在《侏罗纪公园》中,有这样一段情节:一位黑客打开一个终端机,试图猜测管理员的密码。失败三次以后,终端上就出现死循环,不停输出:”You didn’t said the magic word!”。而更给力的是,在Youtube上,这段情节视频有一段留言,支持率很高:“The magic word is sudo!”。

而比尔盖子想到,最近刚刚开始学习Python3,是否可以写一段代码来模拟其中的情节?

逻辑设计:
给用户三次输入密码的机会,如果在这三次中用户输入错误,则让用户再次输入并显示错误信息。用户输入了sudo,则显示成功的信息。
如果用户连续三次密码输入错误,则进入死循环,不停显示“You didn’t said the magic word!”。

经过苦思冥想,比尔盖子写出这样一段代码:

#Copyright: Biergaizi | GPL V3
#Developer: Biergaizi, 2011
error = 0
#声明error这个变量,表示用户输入错误的次数

hack = input("Auth_Username:")
#提示用户输入验证用户名,并传入hack这个变量

once = 1
#声明once这个变量是1,表示这是第一次运行程序

while hack != ("sudo"):
#当用户输入的内容不等于sudo时,将程序置于一个循环中

 if once == 1:
  error = error + 1
  print("Permission denied!")
  once = 0
#如果用户是第一次运行程序,则将错误次数增加1,
#显示错误信息,并将once声明为0,表示这已不是第一次运行。并重新执行while块

#因为这是一个循环,因此当用户再次输入错误时,还会进入其中。但是once已经为0,
#因此程序会跳过上面的if块,执行下面的部分:
 hack = input("Auth_Username:")
 error = error + 1
 print("Permission denied")
#再次让用户输入,如果仍输入错误,则再次将错误次数增加1,显示错误信息。并重新执行while块

 if error == 3:
   while hack != ("sudo"):
    print("You didn't said the magic word!")
#如果错误次数以达到3次,则进入死循环,不停输出"You didn't said the magic word"

print("Dear Administrator, welcome!")
exit()
#这也许是这段程序中比较巧妙的部分,只要用户有一次输入"sudo",
#则会被跳出循环,显示这里的成功信息。

但这段代码逻辑还是有些混乱,而且之前的一个版本还存在一个Bug,不画流程图居然都看不出来。
因此,比尔盖子换一种思路:把验证用户名与增加错误次数的这段代码单独提出,写成一个函数,有点类似Linux里的PAM模块。

最终,比尔盖子想方设法精简代码,还是避免不了多了几行代码的事实:

#Copyright: Biergaizi | GPL V3
#Developer: Biergaizi, 2011
error=0
restart=1
#声明两个变量:restart和error,restart为1,error为0

def auth():
  global success,error
#将success,error声明为全局变量,使模块中对这两个变量可以赋值

  if hack == ("sudo"):
   success=1
  if hack != ("sudo"):
   success=0
   error=error+1
#这个模块很好理解,不解释

while restart==1:
#如果restart为1就进入循环,目的是故意构造死循环,
#重复判断,需要跳出死循环时可用break

 hack=input("Auth_Username:")
 auth()
#要求输入用户名,并调用auth模块判断

 if success==1:
  break
#如果用户输入了正确的内容,则用break跳出循环

 if error==3:
  while restart==1:
   print("You didn't said the magic word!")
#如果错误次数等于3,则restart为1进入循环,
#目的同样是构造死循环,并不停输出"You didn't said the magic word!"

 print("Permission denid!")
#这个print是写在这两个if判断之后的,也就是当用户既没有输入正确的内容,
#也没有累计错误三次(即第一、二次输入错误)时,显示错误信息并重复执行while块

print("Dear administrator, welcome!")
exit()
#在第28行,当用户输入正确的内容时,会break跳出循环,则会执行以下内容
#输出成功信息,并退出程序

最近,比尔盖子再次优化该程序:

error=0
import time

def auth(username):
  global error
  if username == ("sudo"):
   return 1
  if username != ("sudo"):
   error=error+1
   return 0

while True:
 hack=input("Auth_Username:")

 if auth(username=hack)==1:
  break
#如果用户输入了正确的内容,则用break跳出循环

 if error==3:
  while True:
   print("You didn't said the magic word!")
   time.sleep(0.5)
#如果错误次数等于3,则进入死循环,并不停输出"You didn't said the magic word!"

 print("Permission denid!")
#这个print是写在这两个if判断之后的,也就是当用户既没有输入正确的内容,
#也没有累计错误三次(即第一、二次输入错误)时,显示错误信息并重复执行while块

print("Dear administrator, welcome!")
exit()
#在第28行,当用户输入正确的内容时,会break跳出循环,则会执行以下内容
#输出成功信息,并退出程序

这样,一个用Python3模拟《侏罗纪公园》中的黑客入侵情节的程序就基本完成了,如果改进建议(比尔盖子最希望再精简代码)和批评意见(代码极不规范,但比尔盖子不知道怎样才规范),欢迎留言指出!

根据过路网友的建议,又修改了一下。在这段时间,比尔盖子的编程风格有了明显变化,第一是自加自减,第二是完全遵守了PEP8的标准,语法检查器没有任何形式的Warning。最不爽的就是那个全局变量了,回头想办法避免,其实很简单。

#!/usr/bin/python3
import time
error = 0

def auth(username):
    global error
    if username == ("sudo"):
        return 1
    else:
        error += 1
        return 0

while True:
    #如果错误次数等于3,则进入死循环,并不停输出"You didn't said the magic word!",否则重复执行while块,继续验证。
    if error == 3:
        print("You didn't said the magic word!")
        time.sleep(0.5)
    else:
        hack = input("Auth_Username:")
        #如果用户输入了正确的内容,则用break跳出循环
        if auth(hack) == 1:
            break

        print("Permission denid!")
#这个print是写在这两个if判断之后的,也就是当用户既没有输入正确的内容,
#也没有累计错误三次(即第一、二次输入错误)时,显示错误信息并重复执行while块

print("Dear administrator, welcome!")
#在第16行,当用户输入正确的内容时,会break跳出循环,则会执行以上内容
#输出成功信息,并退出程序。

做了点小修改,全局变量被拿掉了!

#!/usr/bin/python3
import time

def auth(username):
    if username == ("sudo"):
        return 1
    else:
        return 0

error = 0
while True:
    #如果错误次数等于3,则进入死循环,并不停输出"You didn't said the magic word!",否则重复执行while块,继续验证。
    if error == 3:
        print("You didn't said the magic word!")
        time.sleep(0.5)
    else:
        hack = input("Auth_Username: ")
        #如果用户输入了正确的内容,则用break跳出循环
        if auth(hack) == 1:
            break

        error += 1
        print("Permission denid!")
#这个print是写在这两个if判断之后的,也就是当用户既没有输入正确的内容,
#也没有累计错误三次(即第一、二次输入错误)时,显示错误信息并重复执行while块

print("Dear administrator, welcome!")
#在第16行,当用户输入正确的内容时,会break跳出循环,则会执行以上内容
#输出成功信息,并退出程序。

在 2013 年写了更多面向对象程序后,再次重写此段代码。

#!/usr/bin/env python3
from time import sleep


class UsernameAuthenticator():

    def __init__(self):
        self.__error_count = 0

    @property
    def error_count(self):
        return self.__error_count

    def auth(self, username):
        if username == "sudo":
            return True
        elif username != "sudo" or self.__error_count > 3:
            self.__error_count += 1
            return False


if __name__ == "__main__":
    auth = UsernameAuthenticator()
    while True:
        if auth.error_count >= 3:
            print("You didn't said the magic word!")
            sleep(0.5)
        elif auth.auth(input("Auth_Username: ")):
            print("Dear administrator, welcome!")
            break
        elif auth.error_count < 3:
            print("Permission denid!")

在用户使用代理,或者服务器使用反向代理或CDN的情况下,获得访客的正确IP

这个方法既可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

由IP不正确想到的

最近,比尔盖子博客使用了Cloudflare的免费CDN服务来加速博客的访问,但是从昨天开始比尔盖子留意到这样一个问题:

由于Cloudflare CDN的本质是代理服务器(反向代理),因此,网站系统评论获取评论信息时,就会将用户的IP统统获取为CDN服务器的IP,导致了无法正确获得浏览者的IP。

 

因为比尔盖子常使用HTTP代理,所以对代理还是有一些了解的。

代理一般分为“透明代理、匿名代理、超级匿名代理”。如果使用透明代理,服务器将依旧可以通过一些方式来获取用户的真实IP;如果使用匿名代理,服务器可以通过一些方式发现用户可能在使用代理服务器,但无法确定用户的真实IP;使用超级匿名代理时,服务器无论如何也无法检测出用户使用了代理服务器。

那么,Cloudflare CDN的反向代理会不会也是一个透明代理呢?能否采用识别使用代理服务器用户真实IP的一般方法,来获取在服务器使用Cloudflare CDN或反向代理时获取正确的用户IP呢?

原理

在PHP中用户的IP有三个属性:HTTP_CLIENT_IP、
HTTP_X_FORWARDED_FOR、REMOTE_ADDR。

REMOTE_ADDR是和服务器连接时,服务器看到的IP地址(如果使用代理,就是最后一台代理的IP);HTTP_CLIENT_IP为代理服务器的IP,不使用代理就没数据;HTTP_X_FORWARDED_FOR是使用代理时,用户的真实IP,不使用代理就没数据(如果用户使用的多层代理,则 用户–> A –> B –> 网站,那么数据就为“用户IP,A的IP”,即最后一台代理服务器之前数据流经过的所有服务器的IP地址)。

这三个值均可伪造,不过如果不是匿名代理或超级匿名代理,是不会对其伪造的。

测试

因此,比尔盖子编写了一个PHP脚本来测试。这个脚本可以使用http://biergaizi.com/ipaddress.php访问。需要注意的是,为了知道Cloudflare CDN是不是透明代理,这个脚本也被CDN加速了,因此本质上是你是用一个代理访问的。

源码如下:

<?php

global $ip;
global $ip2;
global $ip3;
$ip = getenv("HTTP_CLIENT_IP");
$ip2 = getenv("HTTP_X_FORWARDED_FOR");
$ip3 = getenv("REMOTE_ADDR");

echo "HTTP_CLIENT_IP:     ","<br>",$ip,"<br><br>";
echo "HTTP_X_FORWARDED_FOR:     ","<br>",$ip2,"<br><br>";
echo "REMOTE_ADDR:     ","<br>",$ip3,"<br><br>";

?>

测试的结果是:REMOTE_ADDR是代理服务器的IP,HTTP_X_FORWARDED_FOR是访问者真实的IP!也就是说,Cloudflare CDN本质上是透明代理,可以用HTTP_X_FORWARDED_FOR来获得访问者真实的IP!但是唯一奇怪的是,HTTP_CLIENT_IP是没有数据的,请懂的同学解答一下。

实现

有了刚才测试的结果,实现起来就容易多了。

WordPress中获取IP是通过获取REMOTE_ADDR实现的。我们只需要修改Wordpress中获取访问者IP的函数,增加一个逻辑判断:如果HTTP_X_FORWARDED_FOR有数据,就用HTTP_X_FORWARDED_FOR代替REMOTE_ADDR,这样就实现了获得浏览者的正确IP。

但关键是找不到Wordpress获取IP的函数在哪个文件,因此又找到了这样一种方法:因为Wordpress的wp-config.php配置文件是一个公共文件,大部分文件都会调用它,所以只需要修改wp-config.php就行了。修改的方法也异常简单,只需要在wp-config.php开头加上

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}

就搞定了。这段代码的意思是:如果HTTP_X_FORWARDED_FOR有数据(那就肯定是用代理了),那么就用HTTP_X_FORWARDED_FOR里的IP替换REMOTE_ADDR的IP。这样真实IP就把代理服务器的IP替换掉了。

这个方法正如开头强调的,这个方法不仅可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

Linux小测试 | The Linux Pub Quiz 中文版 Chinese Version

本文由比尔盖子(http://biergaizi.info)从http://www.tuxradar.com/content/linux-pub-quiz转载并翻译。
转载时请保留本段文字!
翻译质量不高,主要是因为一开始使用的是OpenOffice翻译,然后粘贴到这里以后,出现了大量的控制格式的HTML代码,修改几个字整个版面就乱了,但仍欢迎从评论中指出翻译不到位的地方!

你对自由软件的人物、应用程序和命令了解多少? 请你用下面的题目做自我测试 – 我们不保证Linux之父林纳斯·托瓦兹(Linus Torvalds)也能做对所有的题……

主题一:人物

1) 谁绘制了Linux的吉祥物Tux的原型? (提示:他也绘制了Ximian猴子)

2) 谁编写了Vi编辑器的第一版?

3) 哪位主流Linux发行版的领导人,曾经去宇宙旅行了10天?

4) Python语言之父是谁?

5) 拉里·沃尔(Larry Wall,下图中穿着一件令人兴奋的T恤的人) 发明了哪种编程语言?

This is Larry Wall. The question is, which programming language did he invent?

这是拉里·沃尔。问题是:他发明了哪种编程语言?

 

6) 由Wietse Venema开发的,很流行的流行邮件服务器叫什么?

7) 谁编写了sendmail?

8) 谁编写了Minux, 并在1992年写了题目为“Linux是过时的?”的电子邮件,从而展开论战?

9) 谁编写了最初的Unix shell (就是广为人知的sh)?

10) GNU和自由软件基金会(Free Software Foundation, FSF)的领袖是谁?

主题二:系统管理

11) 你运行了一个命令

ls f*

得到了一行输出:

apple orange banana

这是怎么回事?

12) 在那个配置文件中你能找到以下内容:

%admin ALL=(ALL) ALL

13) 这个命令是关于什么程序的?

root (hd0,0)

14) 你能在那个目录中找到Linux的日志?

15) 按照Unix的传统,你编写的第一个程序应该是什么?

16) root(即管理员)用户的UID是多少?

17) SSH会默认监听哪个端口?

18) 你发现你有一个名为foo的文件,有两个链接,你如何找到其它的链接?

19) 密码配置文件(/etc/passwd)中缺少什么关键信息?

20) ext2和ext3文件系统最大的区别是什么?

主题三:命令

21)

shopt -s dotglob

在Bash中是干什么用的?

22) 如果系统报错:Error: Scanning of VESA modes failed, 你应该将这个问题报告给谁? (警告:这个问题难度极大!)

23) 你如何删除一个名为-r的文件?

24) 你对一个名为foo的文件执行命令

chmod 7000 foo

当你执行 ls -l foo的时候,请问你看到的字母权限(rwxr–r–的形式)是什么?

25) 在vi编辑器中, dd 命令是干什么用的?

26) 在Linux中,哪一个系统请求用来创建一个新进程?

27) 下面这两条命令有什么区别 (假设运行这两条命令之前,foo文件是不存在的)

su -c date > foo
su -c 'date > foo'

28) 哪条命令用来配置Linux数据包过滤器(译者提醒:即防火墙)?

29) init的配置文件是什么?

30) 如果你在屏幕上看到这样一行输出:

drwxr-xr-x 8 chris chris 4096 2007-08-02 12:03 tutorials

……请问tutorials文件夹中有几个子文件夹?

31) 哪条命令用于查找文件系统中所有名为 pipes (fifos) 的文件?

32) 你如何隐藏一条命令所产生标准输出(standard output)?

主题四:名称

33) Wireshark 以前叫什么?

34) Gnome 是一个流行的桌面环境。请问 ‘Gnome’ 的全称是什么?

35) ……还有 KDE 中的 ‘K’ 全称为?

36) 哪一个开放文档标准与英国一个摇滚乐队同名?

37) Awk 语言如何得名?

38) Linux使用一个名为 PAM 的认证模块. PAM 的全称是什么?

39) Ubuntu在2004年发布的首个版本,代号叫什么(Ubuntu的代号命名规则为:一个形容词+一个动物名称)

40) SUSE 是一个流行的Linux发行版. 请问 SUSE 的全称是?

41) 世界上一个基于CD的Linux发行版(就是现在的LiveCD),是以北欧神话中的生命树得名,请问这个发行版叫做?

42) Debian发行版的这个名字是怎么来的?

主题五:残缺的界面

你能说出这些截图来自哪些应用程序吗?

43)

43)

 

44)

44)

 

45)

45)

 

46)

46)

 

47)

47)

 

48)

48)

 

49)

49)

 

50)

50)

 

51)

51)

 

52)

52)

主题六:发行版

53) 想成为一名UCP (Ubuntu专业认证人员), 你必须通过那三项测试?

54) Linspire 以前叫做什么?

55) ……还有Mandriva 以前叫做什么?

What was Mandriva Linux called before it was called Mandriva?

现在它被成为Mandriva,在对用户友好方面有很高的美誉度。

 

56) SUSE的LOGO是个什么动物?

57) 华硕Eee PC上网本采用了哪个Linux发行版?

主题七:应用程序

58) Gnome的资源管理器叫什么?

59) Linux上最流行的Web服务器叫什么?

60) “zip” 文件(压缩文件) 如何得名?

这些软件是干什么的:

61) Bluefish?

62) FluxBox?

63) Joomla?

64) Kopete?

65) Mutt?

66) Stonith devices?

FluxBox is pretty, but what does it do?

FluxBox很漂亮,但究竟是干什么的?

 

LOGO的名称

请问下面这些LOGO属于哪些应用程序或者发行版?

67)

67)

 

68)

68)

 

69)

69)

 

70)

70)

 

71)

71)

 

72)

72)

主题九:零碎的问题

73) Tux有多少脚趾 (没什么用的提示:不是单数!)

74) Linux下的.NET兼容运行环境叫什么名字?

75) 林纳斯·托瓦兹在何年用电子邮件,公布了他新编写的,自由的Linux?

76) Linux 内核版本2.6.28中的C代码超过100万行,到底是几百万行?

77) 哪一部电影中有这样一句台词 “这是个Unix系统!我知道这个!(It’s a Unix system! I know this!)”?

78) 哪个公司拥有MySQL(流行的开源数据库)?

79) Barret和Silverman编写的SSH(全称Secure Shell,意为安全的Shell) 教材:O’Reilly textbook SSH封面上出现的动物是什么?

80) 一本O’Reilly 的教材以’骆驼书’ 广为人知,因为书的封面有一头骆驼。这本书是关于什么的?

What is this book about?

这本书是关于什么的?

81) 哪家Linux公司于1999上市并创华尔街有史以来上市首日的最大涨幅?

82) 哪个组织开发了SELinux?

主题10:领袖的名字

这些都是今天世界开源界的领袖 – 有多少你能叫出名字?

83)

83)

 

84)

84)

 

85)

85)

 

86)

86)

 

87)

87)

 

88)

88)

 

89)

89)

 

90)

90)

 

做完了?快快去这里对照答案,看看自己做对了几道题?

Linux小测试答案 | The Linux Pub Quiz Answer 中文版答案 Chinese Version

这是测试题答案,请先做测试题目,请点击这里查看题目

本文由比尔盖子(http://biergaizi.info)从http://www.tuxradar.com/linuxquiz-answers转载并翻译。
转载时请保留本段文字!
翻译质量不高,主要是因为一开始使用的是OpenOffice翻译,然后粘贴到这里以后,出现了大量的控制格式的HTML代码,修改几个字整个版面就乱了,但仍欢迎从评论中指出翻译不到位的地方!

这就是测试题答案了,赶快算出你的分数,并在页面底部看看你的Linux水平如何吧!

主题一:人物

1 – Larry Ewing
2 – William Nelson Joy(威廉·纳尔逊·乔伊),通常人们称作Bill Joy(比尔·乔伊)
3 – Mark Shuttleworth(马克·沙特尔沃思),他领导着Canonical和Ubuntu
4 – Guido van Rossum
5 – Perl
6 – Postfix
7 – Eric Allman
8 – Andy Tanenbaum(台湾译作:谭宁邦)。 他指出Linux系统采用了宏内核,而谭宁邦认为微内核才是未来的方向,引发了著名的塔能鲍姆-林纳斯辩论(维基百科)
9 – Stephen Bourne
10 – Richard Mathew Stallman(查理德·史托曼)

主题二:系统管理

11 – 你有一个目录以f开头,并有文件
apple, orange and banana
12 – /etc/sudoers(sudo配置文件)
13 – Grub引导配置文件 (可能在 /boot/grub/menu.lst)
14 – /var/log
15 – Hello World
16 – uid:0
17 – Port 22
18 – 运行ls -i foo 找出 inumber
[1]

(就说它是12345吧), 然后运行 find . -inum 12345
     使用连接符成为一条命令就像这样:
     find . -inum $(ls -i main.cf | cut -d' ' -f1) 

[1]inumber即inode编号,inumber和linode编号不是inode

19 - 密码配置文件里就是没有密码!为了安全,密码被哈希加密,并保存到 /etc/shadow
20 - ext3 是日志式文件系统, ext2 不是。

主题三:命令

21 - 这会告诉Shell在使用通配符时将以 '.' 开头的隐藏文件也包括进去。
22 - mj@ucw.cz (这是在是令人很晕, 看看Linux的内核你就知道了[2])
[2]比尔盖子查看了Linux内核,确实发现在video.s文件中存在
.ascii "Error: Scanning of VESA modes failed. Please "
.ascii "report to <mj@ucw.cz>“

23 - rm -- -r 

24 - 权限会显示成 --S--S--T
25 - 它会删除光标所在的那行
26 - clone() 。 如果你想的话,也可以记住 fork()这个函数 。
27 - 在第一个例子中, foo 的所有者将成为当前登录的用户。但在第二个例子中,foo的所有者将成为root。
28 - iptables
29 - /etc/inittab
30 - 六个 (在Linux系统的任何目录中存在两个其实并不存在的链接。“.”表示该目录本身,
“..”表示上一层目录。减去这两个链接,因此tutorials有六个子目录)
31 - find / -type p
32 - 用“>”将它重定向到 /dev/null

主题四:名称

33 – Ethereal
34 – GNU Network Object Model Environment
35 – 原本意思为 ‘Kool Desktop Environment’, 但是现在已经没有任何的实际意义。
36 – Oasis. 其实就是 ‘组织(Organisation)’ 的简写, for the Advancement of Structured Information Standards’, which is the name of the consortium that developed the standard
(这个不知怎么翻译好,如有建议,请留言评论).
37 – 这是它的三位开发者 Aho, Weinberger 和 Kernighan 名字的缩写
38 – 嵌入式认证模块(Pluggable Authentication Modules,PAM,这是一组Linux身份验证的API)
39 – Warty Warthog
40 – 德语叫法 ‘Software und System Entwicklung’ (Software and System Development).
You can have half a mark just      for knowing it was something in German (这个怎么翻译,如有建议,留言评论).
如果你只是知道是某些德语,你可以记半分。  
41 – Yggdrasil
42 – 从它的创始人Ian Murdoch, 和他的妻子Debra得名

主题五:残缺的界面

43 – Gimp
44 – OpenOffice.org
45 – CUPS的Webmin界面
46 – K3b
47 – KCalc
48 – KDE 主菜单标签烂 (在 OpenSUSE 10.3 中)
49 – KMail
50 – Rosegarden
51 – XChat
52 – GNU/Emacs

主题六:发行版

53 – LPI 101, LPI 102 and LPI 199
54 – Lindows
55 – Mandrake
56 – 一只变色龙
57 – Xandros

Round 7: Applications

58 – 鹦鹉螺(Nautilus)
59 – 阿帕奇(Apache)

60 – 被命名为Zip意味着它与同类压缩工具相比,压缩比最高,压缩所需的时间最短[3]
[3]英文中的“压缩”应为compression

61 – 用于编辑HTML和其他Web内容的一个文本编辑器
62 – 一个轻量级的窗口管理器 
63 – 一个开源的内容管理系统(CMS)
64 – 支持多协议的即时通讯软件
65 – 一个基于文本的用户邮件代理
66 – 一个可以通过软件打开和关闭其它计算机电源的设备. Stonith 表示 ‘shoot the other node in the head’ ,用于关闭一个集群中宕机的节点,从而保证集群的高可用性。

主题八:LOGO的名称

67 – Firefox
68 – Gnome
69 – Ubuntu
70 – Gimp
71 – Wireshark
72 – Debian

主题九:零碎的问题

73 – 六个
74 – Mono
75 – 1991 (准确的说是1991年8月25日)
76 – 七百万行 (准确的是7107577行)
我们使用了这个命令统计: find /usr/src/linux -name ‘*.c’ -exec cat {} \; | wc
77 – 侏罗纪公园
78 – Sun公司(也称升阳微系统公司,Sun Microsystems)
79 – 一只蜗牛 [因为蜗牛在一个安全的(Secure)外壳 (Shell)中!]
80 – Perl(比尔盖子:著名的骆驼书,相信大部分人是知道了)
81 – 红帽(Red Hat)
82 – 美国国家安全局(The US National Security Agency,NSA)

主题十:领袖

83 – Bruce Perens (开源倡导者)
84 – Guido van Rossum (Python创始人)
85 – 查理德·史托曼 (Richard Mathew Stallman,GNU和自由软件基金会,Free Software Foundation,FSF的领袖)
86 – Rasmus Lerdorf (PHP创始人)
87 – Jeremy Allison (因他为Samba所作的工作知名)
88 – Miguel de Icaza (一名Gnome, Mono还有其它软件的开发者)
89 – 温特·瑟夫(Vint Cerf,’因特网之父’)
90 – Alan Cox (一位知名的内核黑客,比尔盖子:传记http://news.csdn.net/n/20050908/26111.html)

你的水平

0-20: 你学习的道路还很漫长,我们祝你成功!

21-50: 你的学习已经取得了一些实质性的进展!你应该阅读技术文档,相关书籍,访问相关技术站点,学习更多内容。

51-70: 还不错!你应该对 RPM 是什么东西心中有数,修改xorg.conf配置文件对你来说也只是小儿科而已。

71-89: 疯狂的极客: 你是一位真正的Linux专家,你的引导菜单中可能存在六种不同的Linux发行版,并且都重新编译过内核,而且你正在计划将Linux安装到你的冰箱里。

90: 嗨,林纳斯!我们刚才说:“你也不一定全答对”,只是个玩笑而已,你懂的……

你的分数是多少呢?快快在评论中贴上你的分数与大家分享吧!

CentOS 6 LAMP搭建(服务器配置)

神马是LAMP?路灯?不对,是Linux+Apache+Mysql+PHP(或Perl、Python)。搭建LAMP就是配置Linux+Apache+Mysql+PHP(或Perl、Python)的Web服务器了。

而在这里,我们使用的是最新的CentOS 6。如果其它版本系统想要参考这个教程,对不起,由于软件源中软件版本低,因此不能参考。

LAMP各软件版本:
Linux:CentOS 6 Kernel 2.6.39.3
Apache:2.2.15
Mysql:5.1.52
PHP:5.3.2

和比尔盖子一起搭建LAMP

比尔盖子最近迁移网站到VPS,这正是制作LAMP教程的好机会,下面大家就跟我来吧!
(以下过程均使用管理员root操作)

 

#整个安装过程中可能需要输入y和回车来确定安装。

###准备工作

#安装“最快镜像源”插件,加速下载
yum install yum-plugin-fastestmirror.noarch

#升级系统
yum update

#安装两个软件源
rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/i386/epel-release-6-5.noarch.rpm
rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/i386/ius-release-1.0-8.ius.el6.noarch.rpm

###PHP安装与配置

#PHP安装与配置,Apache安装
#PHP依赖Apache,所以会自动安装哦!
yum install php-pear php php-cli php-common php-devel php-gd php-mbstring php-mcrypt php-mysql php-pdo php-soap php-xml php-xmlrpc php-bcmath php-pecl-apc php-pecl-memcache php-snmp

#修改配置文件
#找到short_open_tag = Off,将其改成short_open_tag = On
#vim用法:点一下键盘上的斜杠(/),输入要查询的内容(区分大小写),按回车即可搜索
#找到内容后按一下键盘上的“Insert”,就可以像记事本一样编辑了
#编辑完后,按"Esc",然后输入" :wq “就可保存退出。
vim /etc/php.ini

###Mysql安装与配置

#安装Mysql
yum install mysql mysql-server mysql-devel

#启动服务
service mysqld start

#修改Mysql root密码
/usr/bin/mysqladmin -u root password '新密码'

###Apache配置
#Apache已经被PHP依赖安装,因此我们已经安装好Apache,我们只需要配置一下

#让Apache支持.htaccess
#vim用法:点一下键盘上的斜杠(/),输入要查询的内容(区分大小写),按回车即可搜索
#找到内容后按一下键盘上的“Insert”,就可以像记事本一样编辑了
#编辑完后,按"Esc",然后输入" :wq “就可保存退出。

#查找Options FileInfo AuthConfig Limit
vim /etc/httpd/conf/httpd.conf

###Xcache模块优化性能(可不装)
#安装过程中如果提示“XX not fount",就yum install XX

#安装编译工具以编译
yum install gcc make

#下载Xcache
wget http://xcache.lighttpd.net/pub/Releases/1.3.2/xcache-1.3.2.tar.bz2

#解压缩Xcache
tar -xvf xcache-1.3.2.tar.bz2

#切换到Xcache目录
cd xcache-1.3.2

#根据php配置Xcache
phpize

#编译安装
mkdir ../xcache-build
cd ../xcache-build
~/xcache-1.3.2/configure -enable-xcache
make
make install

#新增Xcache.ini配置文件
vim /etc/php.d/xcache.ini
#增加内容:
[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php/modules/xcache.so
;; or install as extension, make sure your extension_dir setting is correct
; extension = xcache.so

[xcache.admin]
xcache.admin.auth = On
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""

[xcache]
xcache.shm_scheme =        "mmap"
xcache.size   =             32M
xcache.count =                 1
xcache.slots =             8K
xcache.ttl =              3600
xcache.gc_interval =       300

; Same as aboves but for variable cache
; If you don't know for sure that you need this, you probably don't
xcache.var_size   =          0M
xcache.var_count =          1
xcache.var_slots =          8K
xcache.var_ttl =          0
xcache.var_maxttl =       0
xcache.var_gc_interval =     300

; N/A for /dev/zero
xcache.readonly_protection = Off

xcache.mmap_path = "/dev/zero"

xcache.cacher =             On
xcache.stat =             On
###重启服务器

#重启服务器
reboot

 

 

最后说一下配置文件的路径:
PHP:  /etc/php.ini
Apache: /etc/httpd/conf/httpd.conf

iFaith备份证书卡住的解决方案

今天给一个iPhone 4备份SHSH证书,但是苹果已经停止对iOS4.3.3 SHSH证书的签发。因此使用iFaith V1.1 备份SHSH证书。

进入DFU模式后,开始备份SHSH。但是卡在了Detecting ECID的过程,1个小时也不见任何进展。最后无奈关闭了iFaith。

再使用Home+Power重启,进不去系统,进入连接iTunes恢复模式!

使用Tinyumbrella的Exit Recovery踢出恢复模式,就可以正常开机了。

搬迁网站到VPS的过程

写在前面的话

Written at the beginning

众所周知(如果不知道猛击这里),在2011年六月的最后一天,比尔盖子网站全部下线搬迁。

这一次,因为饱受Godaddy主机的折磨,比尔盖子在今年初就狠下心来决定:7月份一定要换个VPS(在今年1月的公告中透露过)
果然不出大家的所料,比尔盖子更换了主机。

比尔盖子为了选择一个价格公道,性能优良的VPS,艰难的百度和谷歌,最终选择了Linode主机。这个主机的机房位于硅谷,是中国连接美国速度最快的机房,而且在中国站长中口碑也是相当的好。

但是,出现了一点小意外,导致了信用卡不慎冻结。最终只能使用一家比较可靠的Linode支付宝代购系统用支付宝买下了Linode。这个代购虽然可靠、方便,但是,它是将广大代购用户当成系统编写者的子账户处理的。因此只能在这个Linode代购系统的简易控制面板中操作,像比尔盖子这种想要更换机房、更换内核的极客来说,实在是没有什么可折腾性。因此,比尔盖子的网站将在2011年7月27日时再度搬迁。

正文

一般来讲,搬迁网站的过程无非就是这样:

1.关闭网站访问
2.FTP下载所有文件到本地(聪明点的人会打包压缩,另一些人就直接FTP下载,效率不知有多底,可悲啊)
3.将Mysql数据库导出到本地
4.上传导出到本地的文件到新主机
5.导入本地的数据库到新主机
6.修改网站的配置文件,以便连接新的数据库
7.修改域名的指向,指向到新主机
8.最后的一点点排除故障工作,比如解决死链接

这样做,对比尔盖子这样有一点规模的网站来是相当不合适。因为本网站的数据量高到4GB,如果要采用以上的方法,就等于一共下载和上传了8GB的数据!而站长只拥有512K的ADSL连入互联网,如果按照以上步骤,48小时不关机连续作业也完成不了!这该如何是好呢?

话说天下无难事,只怕有心人。比尔盖子想到了自己曾经用SSH远程连接到服务器下载文件时,几乎每次都是瞬间完成,下载速度最快达到了8Mb/s。如果利用这伟大的美国网速,那么搬迁就快多了。话说得好听,那到底怎么利用美国充沛的带宽资源呢?首先我觉得应该先压缩我网站的所有数据。我来到了Godaddy的文件管理面版,悲剧的发现最大只能压缩20MB的数据!这该怎么办呢?

盖子突然想到,因为我的两个主机都可以通过SSH进行远程管理,因此这个过程可以在SSH上操作。立即输入

tar -jcvf website.tar.bz2 html

来压缩我Godaddy主机上的HTML目录,我所有的网站程序都在这个目录里,但是我发现,压缩用了相当长的时间,最后居然强行停止!经过查看记录,盖子的这个博客安装了一个缓存插件,而系统在压缩这个插件产生的缓存时用了相当长的时间。后来盖子进入这个目录查看,发现里面已经生成超过1000个文件,难怪压缩都强行中断了。

快快使用rm -r删除这个目录,结果,删除用时6分钟,最后还报错。这个缓存是在是太夸张了吧!最后,盖子又进入Godaddy的文件管理器,删除了几个残余文件,才算万事!再次尝试进行压缩,这回终于成功了。不过很奇怪,我的网站的数据量为4GB,但压缩完之后居然文件只有300多MB,以至于比尔盖子总是觉得一些文件在压缩时被丢掉了。

之后,比尔盖子登录了新的VPS,输入

wget http://biergaizi.con/html.tar.bz2

下载刚打包完的压缩文件,神速,2分钟搞定。然后使用

tar -jxvf html.tar.bz2

来解压缩,命令行飞速划过屏幕,解压缩完成了。接下来的一个难题,就是配置Web+PHP+Mysql服务器了。幸好比尔盖子平时就爱折腾以Fedora为主的Linux,你可以去看看 比尔盖子站长使用Linux的经历,就知道比尔盖子多么极客了。今天,平时折腾得到的经验总算用上了。这个VPS的系统是盖子亲自选的CentOS5.6,就是冲着Yum和Fedora一样才选择的CentOS,而不是Debian。

随着比尔盖子噼里啪啦的敲击yum install,yum update和service httpd restart,一个使用Apache+PHP5.3+Mysql5的Web服务器就这样完工了。
(具体的细节,我忘记了,会在本月的第二次搬家中详细写出来的)

最后安装了PHPMyAdmin来管理数据库,又安装了Zend和Xcache这一全新的服务器缓存插件。

 

随着一行reboot,比尔盖子的全新网站就正式运行了起来!

Thinkpad R61笔记本,Linux Ubuntu 11.04 系统下成功安装 安全气囊技术(APS)驱动和充电阀值驱动

安装APS驱动

目前,在多数IBM笔记本中,都应用了一种叫做 APS(Active Protection System,主动保护系统)的技术 ,而IBM官方有时把这种技术形象的称为 Airbag ,安全气囊

相信不少朋友已经知道这种技术的存在了。神马?你还不知道!好吧,这是一段摘录于互联网的介绍,不想看可以无视:

当笔记本电脑硬盘工作时,硬盘磁头在磁盘上方运动,进行数据读取,当撞击力在持续2毫秒内小于200G时,一般可以靠ThinkPad本本本身的外壳与防震设计来减震,避免对硬盘造成损害。而当撞击力在持续2毫秒内超过200G后,损害将会随着撞击能量的加大而加大。

硬盘处于非工作状态时,磁头处于停止区,硬盘在1毫秒内最大可以承受800G的冲击。当撞击超过800G/1毫秒后,损害将会随着撞击能量的加大 而加大(见图右边的函数图)。也就是说如果可以及时将硬盘磁头归位到停止区,则硬盘可以忍受比在工作状态下更大的冲击而不受损害。IBM APS技术就是基于上述原理,在预测到有可能发生撞击后,及时地将磁头移动到停止区以保护硬盘。

根据大量实际调查显示,笔记本电脑在工作状态下跌落的情况绝大部分是从桌面或膝盖上跌落,即从120cm以下高度跌落(通常人的膝盖高度为50cm,桌面高度为80cm),如何能在ThinkPad本本发生撞击之前就将磁头归位,成为了问题的关键所在。

1.磁头归位的时间问题

经测试,磁头的归位时间从接到控制信号到完成操作,根据磁头所处的磁道位置不同,大约为100毫秒到500毫秒。对于20cm高度内自由下落的情况,一般可以靠笔记本电脑的外壳与防震设计抵御撞击力,所以我们仅需要关注20cm以上的跌落情况。而笔记本电脑从20cm至120cm高度掉落下来的时间是202毫秒至495毫秒,再加上笔记本电脑掉落之前的短暂延迟时间,试验表明通常预计发生的时间会多于下跌时间。这就保证磁头能在笔记本电脑发生撞击之前及时归位,有效地保护磁盘。

2.冲击力问题

笔记本电脑要承受怎样的撞击,硬盘才会受到超过800G的冲击力呢?我们知道,硬盘受到的冲击力是由多项因素决定的。首先是笔记本电脑下落的相对高度与初始速率,而一般笔记本电脑在工作状态下跌落的情况绝大部分是从膝盖或桌面上跌落到地板上,相对高度不超过120cm,垂直方向的初始速率基本可以忽略不计;其次是笔记本电脑撞击的表面,硬质无弹性的表面(如水泥地板)可以造成更大的冲击力,软质有弹性的表面(如木地板或铺着地毯的地板)可以略微缓冲碰撞,从而造成较小的冲击;再次是笔记本电脑本身的外壳设计和防震设计。

为了量化在各种情况下硬盘受到的冲击力,IBM实验室特 别针对从膝盖上跌落和从桌面上跌落两种情景进行了大量的实际测试。相关实验数据显示,从膝盖高度(50cm)或从桌面高度(80cm)翻落到硬质无弹性的 水泥地板上,由于有外壳以及冲击吸收垫保护,硬盘受到的冲击力超过200G的几率约为50%,而超过800G的几率不超过2%。

3.规律性颠簸问题

APS功能一旦开启,就一直在监测ThinkPad本本的运动。但用户常常需要移动办公,如在汽车、火车或飞机等交通工具上使用笔记本电 脑,因此颠簸是在所难免的,这些震动要是常触发APS使磁头归位,则ThinkPad用户在使用本本时就会感到本本运行是断断续续的,影响了工作效率。不 过APS技术已经考虑到这个问题,它具有忽略重复震动的功能,能消除移动用户的顾虑。交通工具颠簸造成的冲击力一般并不足以损害硬盘,所以大多数的颠簸都 不会触发APS功能使磁头归位,从而有效保证了ThinkPad用户使用笔记本电脑的流畅性。

智能化的震动预测、有提前量的磁头归位操作,APS的这些重要特性都保证了ThinkPad本本的硬盘以及盘内数据不会轻易受到各种撞击的影响。

比尔盖子最近给一台Lenovo(其实就是IBM) Thinkpad R61安装了Ubuntu 11.04这个Linux发行版,却悲剧的发现APS不工作,后来经过一番疯狂的搜索,知道了以下事实:

在Linux系统中,IBM并没有提供相应的驱动程序让APS正常工作。曾经有一年,IBM宣称将把关于APS的硬件资料公布到开源社区,这听起来很不错,可实际情况是,开发者1年来都没有见到一页资料。后来,有牛人们通过逆向工程编写出了能在Linux下APS的驱动,这下众多Linux IBM笔记本使用者的硬盘才有了安全保证。

看来使用APS还是有戏的,又经过搜索,终于发现了实现方法:

第一步,打开终端,然后输入如下命令:(我是用的 sudo aptitude install,应该没有什么不同。)
sudo apt-get install tp-smapi-dkms
sudo apt-get install python python-gtk2 python-gnome2 hdapsd

第二步,在终端下输入如下命令:
sudo gedit /etc/modules
然后添加“tp_smapi “代码在最后,让它看得和下面的一样:
=====================================
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.
lp
tp_smapi
=====================================

第三步,重新启动,进行测试,看是否工作,在终端下输入如下命令
sudo find /

然后进行抖动你的笔记本,看看是否停止,如果停止了,就说明你成功了,

或者运行:

sudo hdapsd -d sda -s 15 -a -v -y

动动笔记本。看看坐标值在变化吗?

如何调整灵敏度,如下:

在终端下进行如下操作

$ sudo gedit /etc/default/hdapsd

找到如下位置:(默认安装是15, 您可按照自己要求修改,25 30….)

# sensitivity
SENSITIVITY=15

不过,我们还可以在完善APS:在Gnome2的面板上增加一个APS硬盘状态的通知图标,让我们得知硬盘目前是被APS停止还是正常运行。

wget http://www.zen24593.zen.co.uk/hdaps/gnome-hdaps-applet-20081204.tar.gz
 tar -zcvf gnome-hdaps-applet-20081204.tar.gz ./
 sudo apt-get install libpanel-applet2-dev
 cd gnome-hdaps-applet-20081204
 gcc $(pkg-config --cflags --libs libpanelapplet-2.0) -o gnome-hdaps-applet gnome-hdaps-applet.c
 sudo cp gnome-hdaps-applet /usr/bin/
 sudo mkdir /usr/share/pixmaps/gnome-hdaps-applet/
 sudo cp *.png /usr/share/pixmaps/gnome-hdaps-applet/
 sudo cp GNOME_HDAPS_StatusApplet.server /usr/lib/bonobo/servers/

然后,注销,再登录,这时右键点击Gnome面板,选择添加,你会发现多出了一个APS的插件!

这样,我们就完美的实现了APS!

设置电池充电阀值

无论你的笔记本电脑电池用去了多少电力,但连接电源适配器后总会充电至100%,即使你只是用了1%的电——这可不是什么好事!这样充电会缩短电池寿命,最好在电池电力在80%左右的时候再连接电源适配器充电。

但是,靠自己自觉做到这点,有点不靠谱吧。因此,IBM将大部分笔记本的电源管理功能中,增加了电池充电阀值这一功能,可以通过设置,在电池电力低于指定的百分比时开始充电和停止充电,但是在Linux又是没驱动,无法实现。所以我们需要自己安装。

首先,你必须依照本文的第一部分安装APS驱动,因为电池充电阀值和APS使用的是一个驱动。然后就可依照下面的命令设置了。

首先执行:

cat /sys/devices/platform/smapi/BAT0/*_charge_thresh

30 
#--> 低于30%开始充电
100 -
#--> 充电至100%后停止

查看当前的设置,你的和我的结果不一定相同哦!然后用下面的命令修改充电阀值。


sudo su
#切换到root身份
echo 80 > /sys/devices/platform/smapi/BAT0/start_charge_thresh
#低于80%开始充电
echo 100 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh
#充电至100%后停止

然后再次执行,果然成功了吧!

cat /sys/devices/platform/smapi/BAT0/*_charge_thresh

80
#--> 低于80%开始充电
100 -
#--> 充电至100%后停止

网站基本迁移完毕

网站基本迁移完毕,均已迁移到VPS上。但是,除博客外,比尔盖子的其它网站仍将下线改版。改版预告:

1.网站性能大幅度提升;
2.网站显示错乱的问题将彻底解决;
3.比尔盖子主站将搜集海量的IT咨询和新闻!

另外,关于这次迁移的细节,将在2011/07/03日或之前向大家公布,敬请期待!

信息:比尔盖子将提供可以出国的VPN,具体请发一封标题为VPN的邮件至biergaizi2009@gmail.com
禁止使用所有中国大陆的电子邮箱服务!

版权所有 © 2025 比尔盖子 博客

主题设计 Anders Noren返回顶部 ↑