Tag: linux

微博作弊

鉴于某规定,微博需要考核。

作弊是肯定的,大部分都是这样,我也是。

注册用户这个比较难,我做不了。。。手工注册的。。。

注册马甲了以后,使用以下两条语句,就可以很方便地发推了。

curl -c cookie.txt -d ‘username=&password=’ https://reg.163.com/logins.jsp
curl -b cookie.txt -d ‘status=curl test’ http://t.163.com/statuses/update.do

作弊与否,其实也不管,需要的是一个数字,数字就是绩效。哼

done, that’s all . ok, KISS .

ubuntu 10.04 初体验

想当年,我用的第一个linux 桌面是 fedora 4 ,当时就觉得这个系统实在太爽了,桌面还可以旋转,还有几个很有趣的桌面效果,哈哈,当时的想法就是傻。以致于当时以土黄色为主色调的 ubuntu 6.04 完全不进入我的考虑范围内。但,现在。。。我已经转投 ubuntu 的怀抱了。。。呃。。。唉。。。

其实两者并没有太大的区别,主要就是包管理系统的不同而已,redhat 系和 debian 系,apt-get 的资源明显多于 yum 的资源,这是我背叛 fedora 的主因,其实 ubuntu 的桌面色调我仍然十分讨厌的。

4 月30号就出了,当天就修改源, apt-get dist-upgrade 了。但很不幸,失败了,很多套件使用起来都不正常。。。唉,看来这个跨版本的升级不太靠谱,我以前也失败过,即使成功,有很多东西都是不太稳定的。只好下一个完整的install cd ,刻盘重装吧,什么硬盘重装就不折腾了。

好了,说说 10.04 主要的改进吧,呃,不能说改进,只能说是改变。

1,主色调由土黄色变成了紫色。

本来的色调给人农气的感觉,现在的色调给人艳的感觉,是一种很不喜欢的艳。这个,有点无语,不知道他们怎么想的。。。

2,窗口按钮布局变成了 MAC 系统的布局

也就是,关闭,最大化,最小化,本来是在窗口的顶部右边的,现在位于顶部左边了。UI 设计者是 MAC 爱好者??幸好我本身对 MAC 也有爱。。。

3,默认im 和 9.10 一样,是 empathy

呃。。。这个不能说不喜欢,它的对话框十分有趣,好像是抄 iphone 的那种。但是,我个人还是比较习惯 pidgin 。。。

4,broadcast 客户端

我一看,傻眼了,都是一些我们国家禁止的互联网应用阿,twitter , facebook 等,哈哈。而且我也没发现它可以设置代理。。。难道要我挂着 vpn 来上么?

5,默认黑色 theme

这个好像 9.10 也是的了,难道。。。觉得黑色的 theme 有型一点?

6,gnome-terminal 透明

这点不错,让我知道知道后面的程序的情况,例如windows 有人联系我,im 工具在闪,呵呵

7,开机关机速度

开机速度据说是经过优化的了,个人感觉不大。新装的系统嘛,通常是比较快的。。。关机速度倒是不错,比我原来的关机快多了。。。当然,也有可能是我原来的系统载入了太多垃圾。。。

才试用了几天,就先说这些把。总的来说,10.04 还是不错的,哈哈。桌面来说,还是选择 ubuntu 吧!

可恨的chrome!

chrome 其实是一个挺好的浏览器来的,在 windows 上我经常使用它(但本人不是经常使用 windows )。但这两天它带给我很大的困扰,恨死它了!!!

chrome 有 linux 版,已经是很久以前的事了,我就 download 来玩玩,平时也很少用,恰好昨天有个东西要测试,要访问杭州的节点,于是我就拿它出来,并设了一下代理服务器,在杭州搭了个 squid ,就把代理服务器设到杭州了。

印象中,以前所谓的 linux 下的 chrome 是 chromium ,这个是无法配置代理服务器的,而 官方一点的 chrome ,已经具有这个功能了,options -> under the hood -> change proxy settings ,就可以设置代理服务器了。杯具就是这样产生的了!!

我用完代理后,就顺手把 chrome 给关了,proxy setting 当然是没有改回来。

然后,从昨天一直到现在,我使用起网络来,都是怪怪的!!如:

$ curl -I lady.163.com

HTTP/1.1 200 OK
Date: Thu, 15 Apr 2010 14:44:38 GMT
Server: Apache/2.2.11 (Unix) PHP/5.3.0
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: “2006c2a0-2c-3e9564c23b600″
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html

oh , my god !!

再来!

$ sudo apt-get update ;

Ign http://mirrors.163.com karmic Release.gpg
Ign http://mirrors.163.com karmic/main Translation-en_US
Ign http://mirrors.163.com karmic/restricted Translation-en_US
Ign http://mirrors.163.com karmic/multiverse Translation-en_US
Ign http://mirrors.163.com karmic/universe Translation-en_US
Ign http://mirrors.163.com karmic Release
Ign http://mirrors.163.com karmic/main Packages
Ign http://mirrors.163.com karmic/restricted Packages
Ign http://mirrors.163.com karmic/multiverse Packages
Ign http://mirrors.163.com karmic/universe Packages
Ign http://mirrors.163.com karmic/main Packages
Ign http://mirrors.163.com karmic/restricted Packages
Ign http://mirrors.163.com karmic/multiverse Packages
Ign http://mirrors.163.com karmic/universe Packages
Err http://mirrors.163.com karmic/main Packages
404  Not Found
Err http://mirrors.163.com karmic/restricted Packages
404  Not Found
Err http://mirrors.163.com karmic/multiverse Packages
404  Not Found
Err http://mirrors.163.com karmic/universe Packages
404  Not Found
W: Failed to fetch http://mirrors.163.com/ubuntu/dists/karmic/main/binary-i386/Packages.gz  404  Not Found

W: Failed to fetch http://mirrors.163.com/ubuntu/dists/karmic/restricted/binary-i386/Packages.gz  404  Not Found

W: Failed to fetch http://mirrors.163.com/ubuntu/dists/karmic/multiverse/binary-i386/Packages.gz  404  Not Found

W: Failed to fetch http://mirrors.163.com/ubuntu/dists/karmic/universe/binary-i386/Packages.gz  404  Not Found

E: Some index files failed to download, they have been ignored, or old ones used instead.

oh!! no !!!!
我一直百思不得其解!!但又太忙,就不管它了,不能curl ,就ssh 上随便一台服务器 curl 呗。而且,只要我 su 到 root ,就可以正常使用了!!我曾经怀疑,是有人黑了我的 curl 。。。还重装了 curl 呢。。。但还是出错,真是神奇了。。。

直到刚才,实在忍无可忍了!我决定彻查原因!!终于被我通过下面这条命令知道原因了!!

$ wget -S –spider lady.163.com
Spider mode enabled. Check if remote file exists.
–2010-04-15 22:48:01–  http://lady.163.com/
Connecting to 60.12.80.115:3128… connected.
Proxy request sent, awaiting response…
HTTP/1.1 200 OK
Date: Thu, 15 Apr 2010 14:48:01 GMT
Server: Apache/2.2.11 (Unix) PHP/5.3.0
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: “2006c2a0-2c-3e9564c23b600″
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html
Length: 44 [text/html]
Remote file exists and could contain further links,
but recursion is disabled — not retrieving.

fuck !! 60.12.80.115:3128 是我在杭州的代理!!原来修改 chrome 的 network 配置,还影响了我平时的网络使用!!fuck !!!

debian 下 ssh 更改 gnome-terminal 的 title

我的工作环境,一般在 rh 系和 debian 系中切换,毕竟是不同的产品,细微的不同很容易令到人昏头转向的。我的工作用机,ubuntu,gnome-terminal 就是我的日常必备工具了,而使用 gnome-terminal ssh 上rh 和 debian 的机器,就可以通过gnome terminal 的 title ,很快分辨出我登录的是哪个系统的机器了。

如:ssh rh 的机器,title 显示的是 ” lazybug@yz12-67 ~ ” ,这个是远程的系统信息。而登录 debian 的机器呢,显示 ” czbug@thinkpad-laptop: ~ “,无论登录哪台,都是一样的显示,因为这是本地的。

关键在于 shell 的一个变量,可以通过命令 set 看到(env 和 set 是有区别的,详情请 google ):

PROMPT_COMMAND=’echo -ne “\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007″‘

rh 是有上面这个变量的,而 debian 没有。

好了,如果我们想让 debian 也像rh 那样显示呢??加上这个变量呗,在 /etc/profile 里加上下面这段:

case $TERM in
(xterm*)
PROMPT_COMMAND=’echo -ne “\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007″‘
;;
esac
没有root 权限的话,加在 ~/.profile 也行

利用 piranha 快速搭建 lvs

最近为那个公司很重视的项目搭建 lvs ,在这里 log 一下吧。

利用red hat 提供的 piranha ,简单快捷。

我选择的是 centos 5.4 ,安装 piranha ,很简单

yum install piranha

此时,它还需要你安装 ipvsadm , php , php-cli , php-common , httpd ,piranha 是一个 web 管理的工具,没办法,虽然我不用web 界面,但这些在yum 下还是必须装上的。

装完以后,/etc/sysconfig/ha/lvs.cf 还是空的,我去抄一份过来。

serial_no = 1
primary = 60.12.227.1
service = lvs
backup_active = 1
backup = 60.12.227.2
heartbeat = 1
heartbeat_port = 10001
keepalive = 6
deadtime = 18
network = direct
debug_level = NONE
virtual vs[1] {
    active = 1
    address = 60.12.227.200 eth0:200
    vip_nmask = 255.255.255.0
    port = 80
    send = "GET / HTTP/1.0\r\n\r\n"
    expect = "HTTP"
    use_regex = 0
    load_monitor = none
    scheduler = wlc
    protocol = tcp
    timeout = 6
    reentry = 15
    quiesce_server = 0
    server rs[1] {
    address = 192.168.0.1
        active = 1
        weight = 2
    }
    server rs[2] {
    address = 192.168.0.2
        active = 1
        weight = 2
    }
}

到此,lvs 的 director 端,算是安装完成了。

有人会问了,为什么我没有修改 /proc/sys/net/ipv4/ip_forward 为1 。其实,这里我也还不是很懂,理论上,转发是必须设为1 的,但我发现,貌似不设,也可以正常工作,难道是 piranha 的关系??

然后就是配置 real server 端了。

我又抄一个shell 过来

#!/bin/sh
 
VIP=60.12.227.200
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
 
echo "1"  > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2"  > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1"  > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2"  > /proc/sys/net/ipv4/conf/all/arp_announce

由于我的director 端配置的是 dr 模式,所以必须关闭arp 响应。

执行一下这个shell,real server 端也算是完成了。

启动 director 端:

# /etc/init.d/pulse start
Starting pulse:                                            [  OK  ]

查看服务状态:

# ipvsadm -ln
 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  60.12.227.200:80 wlc
-> 192.168.0.1:80             Route   2      326        172
-> 192.168.0.2:80             Route   2      326        192

搭建完成了,算是比较快速的了,呵呵。还有一点知识点的,下回再说吧。

ssh-agent 的安全隐患

ssh 是SA 的一大利器,登录服务器、翻墙。。。ssh 通常都配合着 ssh-agent 来使用,ssh-agent 是个管理 private key 的 passphrase 的工具,启动 ssh-agent 后,执行一次 ssh-add ,此时需要输入一次 private key 的 passphrase ,输入正确后,passphrase 就归 ssh-agent 管理,往后的 ssh 操作,就不需要询问 passphrase 了。这里需要注意,ssh 必须开启了forwardagent ,一劳永逸的方法,就是在 /etc/ssh/ssh_config 中把#ForwardAgent no 去掉注释,并改为 ForwardAgent yes。

重点说说它的安全隐患。

ssh-agent 工作过程中会创建一个 socket 文件在 /tmp 目录里,如 /tmp/ssh-jlhtX14952/agent.14952 。我们需要使用 ssh-agent 时,运行一下 ssh-add ,把 private key 加入到 ssh-agent 中管理,此时,是需要输入一次 passphrase 的,当输入正确了以后,往后都不需要输入 passphrase 了。任何用户,只要连接上这个socket ,就可以使用已经加入到ssh-agent 管理的 private key 了,而且不需要输入 passphrase 。所以,这个 socket 的权限是 600 ,如:

srw——-  1 raymond raymond 0 May  1  2009 /tmp/ssh-jlhtX14952/agent.14952
但是。。。我们的 root ,是可以随意访问的。。。
这里演示一次!
1,用root 连接socket,这里很简单,就执行一句话
# SSH_AUTH_SOCK=/tmp/ssh-jlhtX14952/agent.14952; export SSH_AUTH_SOCK;

2, 查看此 socket 是否已经加入了 private key
# ssh-add -l
1024 fa:2d:87:1a:c5:a6:9d:7c:67:eb:51:a3:6a:7b:49:34 /home/raymond/.ssh/identity (RSA)
看,raymond 的 key 已经加入进去了

3,尝试登录raymond 的服务器,以root 的身份,但使用 raymond 的 key
# ssh raymond@220.181.xxx.xxx
Last login: Sat Mar  6 04:41:55 2010 from 220.181.xxx.xxx
[raymond@VM ~]$ whoami
raymond
看,此时,已经是以raymond 的身份登录的服务器了

pmap : 理解linux的进程内存占用

看了几篇文章,对linux的进程的内存占用,又有了一点认识,记录一下。

首先 ps 看一下我的系统跑着哪些process

$ ps aux
 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
czbug     1980  0.0  1.7 180472 34416 ?        Sl   Feb25   0:01 /usr/bin/yakuake
...

我拿 yakuake 这个小程序作例子。

其中,关于内存的是 VSZ 和 RSS 这两个

man ps 看看它们的含义:

rss       RSS    resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).

vsz       VSZ    virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).

简单一点说,RSS 就是这个process 实际占用的物理内存,VSZ 就是process 的虚拟内存,就是process 现在没有使用但未来可能会分配的内存大小。

其实这里的ps 出来的结果,是有点不正确的,如果把所有程序的 RSS 加起来,恐怕比你的实际内存还要大呢。为什么呢??因为 ps 的结果,RSS 那部分,是包括共享内存的。这里我用 pmap 来看看。

$ pmap -d 1980
 
1980:   /usr/bin/yakuake
Address   Kbytes Mode  Offset           Device    Mapping
00110000    2524 r-x-- 0000000000000000 008:00002 libkio.so.5.3.0
00387000       4 ----- 0000000000277000 008:00002 libkio.so.5.3.0
00388000      32 r---- 0000000000277000 008:00002 libkio.so.5.3.0
00390000      16 rw--- 000000000027f000 008:00002 libkio.so.5.3.0
00394000     444 r-x-- 0000000000000000 008:00002 libQtDBus.so.4.5.2
00403000       4 ----- 000000000006f000 008:00002 libQtDBus.so.4.5.2
00404000       4 r---- 000000000006f000 008:00002 libQtDBus.so.4.5.2
00405000       4 rw--- 0000000000070000 008:00002 libQtDBus.so.4.5.2
00407000     228 r-x-- 0000000000000000 008:00002 libkparts.so.4.3.0
00440000       8 r---- 0000000000039000 008:00002 libkparts.so.4.3.0
00442000       4 rw--- 000000000003b000 008:00002 libkparts.so.4.3.0
00443000    3552 r-x-- 0000000000000000 008:00002 libkdeui.so.5.3.0
007bb000      76 r---- 0000000000377000 008:00002 libkdeui.so.5.3.0
007ce000      24 rw--- 000000000038a000 008:00002 libkdeui.so.5.3.0
007d4000       4 rw--- 0000000000000000 000:00000   [ anon ]
....
mapped: 180472K    writeable/private: 19208K    shared: 20544K

我略去了一部分输出,都是差不多的,重点在最后那行输出。

linux 会把一些shared libraries 载入到内存中,在pmap 的输出中,这些shared libraries 的名字通常是 lib*.so 。如 libX11.so.6.2.0 。这个 libX11.so.6.2.0 会被很多process load 到自己的运行环境中,同时,ps 输出的RSS 结果中,每个process 都包含了这个libX11.so.6.2.0 ,而事实上它只被load 了一次,如果单纯把ps 的结果相加,这样就重复计算了。

而 pmap 的输出中,writeable/private: 19208K ,这个就是yakuake 这个程序真正占用的物理内存,不包含shared libraries 。在这里,它只有19208K,而ps 的RSS 是34416K。

————————————————————–

我在看这方面的资料时,还看到一些关于virtual memory 的,再记录下。

以下两个命令均可查看 vmsize 。

$ cat /proc/<pid>/stat | awk '{print $23 / 1024}'
$ cat /proc/<pid>/status | grep -i vmsize

一般来说,得出来的值,是和 ps 的 VSZ 是一样的,但有一种情况例外,就是查看X server 的时候。

举个例:

$ ps aux|grep /usr/bin/X|grep -v grep | awk '{print $2}'   # 得出X server 的 pid   ...
1076
 
$ cat /proc/1076/stat | awk '{print $23 / 1024}'
139012
 
$ cat /proc/1076/status | grep -i vmsize
VmSize:      106516 kB

而 ps 的 VSZ 为 106516 ,与后者是一致的。

据说是因为

VmSize = memory + memory-mapped hardware (e.g. video card memory).

这句话我不是很理解。。。就不作解释了。。。

对OS 的理解还很肤浅,还需努力啊。。。

ntpdate(no server suitable for synchronization found)

今天维护一个集群系统时,被人报障说集群的机器时间不对。。。我去看了一下,crontab 里有对时的命令啊。再手动执行一下,才发现,原来被我设的防火墙给墙住了。。。机器只允许特定的外网ip访问,内网无限制。。。所以ntpdate 外面一些对时服务器的时候,根本不会收到返回了。

话说这个防火墙,也是其它部门的同事建议我设的,本部门的程序员对安全这些事情好不上心的,专心于系统功能的开发,甚至连我多次建议的系统管理经验也不采纳。算了,none of my business 。

而他们说这个系统对时,很急,要不集群间的机器heartbeat 时间不对,就会以为对方挂了的了。

那我就马上在另一台对外网无限制的机器上搭一个ntpd ,就作为一个对时服务器的代理吧。

安装ntpd,这个很简单,那台机器是 centos 5,那就用yum。

#yum install ntp

装好还不能用呢,最快速度使用上的话,那就只修改一行配置,因为默认是只允许本地对时而已,我们必须加上内网都可以对时

#vi /etc/ntp.conf

把下面这行,取消注释,并加上自己网段的相关信息即可

#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

如:

restrict 10.100.20.0 mask 255.255.255.0 nomodify notrap

然后重启ntp

/etc/init.d/ntpd restart

重启成功后,如果你立刻想对时的话,是会报错的,如:

#ntpdate 10.100.20.59 # 就是我刚配的ntpd server
11 Feb 00:37:36 ntpdate[22276]: no server suitable for synchronization found

这种错误,应该是没有ntpd server 才会报的啊,究竟为什么呢??

原来,如果ntpd server 没有进行过对时的话,也是会报这个错的。。。很汗,为什么不写得明白一点呢??

好了,既然知道原因,只需要等待数分钟,让我的ntpd server 10.100.20.59 自己去对了一次时后,我们再操作,就会成功的了。

# ntpdate 10.100.20.59
11 Feb 00:41:30 ntpdate[22323]: adjust time server 10.100.20.59 offset -0.005792 sec

svn update 时出错(Valid UTF-8 data)

今天svn up的时候,发现一个报错:

#svn up
svn: Valid UTF-8 data
(hex:)
followed by invalid UTF-8 sequence
(hex: a1 b0)

突然爆出的错误。。。google 了一下,这个比较靠谱

http://ryanerwin.com/2007/04/09/valid-utf-8-data-hex-followed-by-invalid-utf-8-sequence/

大意是说,你的svn工作目录,有了一个不能由当前系统的字符集识别的文件。
解决方式是:删了这些文件。

ok,那我去删咯,确实有一个目录下,有一个?????????????? 的文件,gbk 编码的文件。。。

怎么出现的呢??不会是被某位大哥黑进来的吧,哈哈。

不追查了,就当是跑脚本失败生成的。删去,问题解决了!

nginx proxy_pass 里的”/”

见配置,摘自nginx.conf 里的server 段:

server {
listen 80;
server_name abc.163.com ;
location / {
proxy_pass http://ent.163.com/ ;
}
location /star/ {
proxy_pass http://ent.163.com ;
}
}

里面有两个location,我先说第一个,/ 。其实这里有两种写法,分别是:

location / {
proxy_pass http://ent.163.com/ ;
}
location / {
proxy_pass http://ent.163.com ;
}

出来的效果都一样的。

第二个location,/star/。同样两种写法都有,都出来的结果,就不一样了。

location /star/ {
proxy_pass http://ent.163.com ;
}

当访问 http://abc.163.com/star/ 的时候,nginx 会代理访问到 http://ent.163.com/star/ ,并返回给我们。

location /star/ {
proxy_pass http://ent.163.com/ ;
}

当访问 http://abc.163.com/star/ 的时候,nginx 会代理访问到 http://ent.163.com/ ,并返回给我们。

这两段配置,分别在于, proxy_pass http://ent.163.com/ ; 这个”/”,令到出来的结果完全不同。

前者,相当于告诉nginx,我这个location,是代理访问到http://ent.163.com 这个server的,我的location是什么,nginx 就把location 加在proxy_pass 的 server 后面,这里是/star/,所以就相当于 http://ent.163.com/star/。如果是location /blog/ ,就是代理访问到 http://ent.163.com/blog/。

后者,相当于告诉nginx,我这个location,是代理访问到http://ent.163.com/的,http://abc.163.com/star/ == http://ent.163.com/ ,可以这样理解。改变location,并不能改变返回的内容,返回的内容始终是http://ent.163.com/ 。 如果是location /blog/ ,那就是 http://abc.163.com/blog/ == http://ent.163.com/ 。

这样,也可以解释了上面那个location / 的例子,/ 嘛,加在server 的后面,仍然是 / ,所以,两种写法出来的结果是一样的。

PS: 如果是 location ~* ^/start/(.*)\.html 这种正则的location,是不能写”/”上去的,nginx -t 也会报错的了。因为,路径都需要正则匹配了嘛,并不是一个相对固定的locatin了,必然要代理到一个server。