显示自七月 2008以来最新的 4 个帖子(共 11 个)。显示较早的帖子
显示自七月 2008以来最新的 4 个帖子(共 11 个)。显示较早的帖子

2008年7月30日

vim中快速转换大小写

平时在写程序时经常会遇到大小写转换的问题,vim中提供了很多非常方便的大小写转换命令,可以快速的进行字母、单词、任意行的大小写转换,可以和vim的光标移动指令组合使用。

~          将光标下的字母改变大小写

3~ 将光标位置开始的3个字母改变其大小写

g~~ 改变当前行字母的大小写

U 将可视模式下选择的字母全改成大写字母

u 将可视模式下选择的字母全改成小写

gUU 将当前行的字母改成大写

3gUU 将从光标开始到下面3行字母改成大写

guu 将当前行的字母全改成小写

gUw 将光标下的单词改成大写。

guw 将光标下的单词改成小写。

更多技巧可以查看文档

:h ~


阅读全文

2008年7月29日

Linux一句话精彩问答

2007/12/12版
1 系统设置篇
1001 修改主机名(陈绪)
vi /etc/sysconfig/network,修改HOSTNAME一行为"HOSTNAME=主机名"(没有这行?那就添加这一行吧),然后运行命 令"hostname 主机名"。一般还要修改/etc/hosts文件中的主机名。这样,无论你是否重启,主机名都修改成功

1002 修改linux启动方式(文本方式或xwindow方式)(陈绪)
vi /etc/inittab,找到id:x:initdefault:一行,x=3为文本方式 x=5为xwindow方式,重启机器即可生效

1003 linux的自动升级更新问题(hutuworm,NetDC,陈绪)
对于redhat,在www.redhat.com/corp/support/errata/找到补丁,6.1以后的版本带有一个工具up2date,它能够测定哪些rpm包需要升级,然后自动从redhat的站点下载并完成安装。
升级除kernel外的rpm: up2date –u
升级包括kernel在内的rpm: up2date -u –f
最新的redhat和fedora可以使用yum命令或者yumex图形前端来升级更新。

Gentoo升级方法
更新portage tree: emerge –sync
更新/安装软件包: emerge [软件包名] (如安装vim: emerge vim)

Debian跟别的发行版还是有很大的差别的,用Debian做服务器维护更加方便。Debian下升级软件:
apt-get update
apt-get upgrade
前提:配置好网络和/etc/apt/sources.list,也可以用apt-setup设置。

1004 windows下查看linux分区的软件(陈绪,hutuworm)
Paragon.Ext2FS.Anywhere.2.5.rar和explore2fs-1.00-pre4.zip
现在不少Linux发行版安装时缺省基于LVM建分区,所以explore2fs也与时俱进地开始支持LVM2:
http://www.chrysocome.net/downloads/explore2fs-1.08beta9.zip

1005 mount用法(sakulagi,sxsfxx,aptkevin)
fat32分区 mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
ntfs分区 mount -t ntfs -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
iso文件 mount -o loop /abc.iso /mnt/cdrom
软盘 mount /dev/fd0 /mnt/floppy
usb mount /dev/sda1 /mnt/cdrom
cd光驱 mount -t iso9660 -o iocharset=cp936,ro /dev/cdrom /mnt/cdrom
dvd光驱 mount -t iso9660 -o iocharset=cp936,ro /dev/dvd /mnt/cdrom或mount -t udf /dev/dvd /mnt/cdrom
注意:dvd的格式一般为iso9660或udf之一
在有scsi硬盘的计算机上,应该先用fdisk -l /dev/sd? 来看看到底usb闪存盘是在哪个设备下(通常会是sdb1或者sdc1)。
所有/etc/fstab内容 mount –a,此命令还可以指定文件格式"-t 格式", 格式可以为vfat, ext2, ext3等
例如,要自动将windows的d盘挂到/mnt/d上,用vi打开/etc/fstab,加入以下一行
/dev/hda5 /mnt/d vfat defaults,codepage=936,iocharset=cp936 0 0
注意,先得手工建立一个/mnt/d目录

1006 访问远程共享的目录(陈绪)
将如下的行放到/etc/fstab中:
//ip/share1 /mnt/d smbfs defaults,auto,username=name,password= pass 0 0
其中ip是远程机器的ip地址,是share1该机器共享目录的共享名,/mnt/d是要将该分区mount到本地linux的目录,name和pass是可以访问该共享目录的用户名和密码。

1007.a 删除名为-a的文件(陈绪)
1 rm ./-a
2 rm -- -a,--告诉rm这是一个选项,具体参见getopt
3 ls -i 列出inum,然后用find . -inum inum_of_thisfile -exec rm '{}' \;

1007.b 删除名为\a的文件(陈绪)
rm \\a

1007.c 删除名字带的/和‘\0'文件(陈绪)
这些字符是正常文件系统所不允许的字符,但可能在文件名中产生,如unix下的nfs文件系统在Mac系统上使用
1 把nfs文件系统在挂到不过滤'/'字符的系统下,删除含特殊文件名的文件;
2 将错误文件名的目录其它文件移走,ls -id 显示含该文件目录的inum,umount 文件系统,clri清除该目录的inum,fsck,mount,检查lost+found目录,将其中的文件更名。
另外,可以通过windows ftp过去删除任何文件名的文件

1007.d 删除名字带不可见字符的文件(陈绪)
列出文件名并转储到文件:ls -l > del.sh
然后编辑文件的内容加入rm命令使其内容成为删除上述文件的格式:
vi del.sh
rm -rf *******
执行sh del.sh

1007.e 删除文件大小为零的文件(陈绪)
1 rm -i `find ./ -size 0`
2 find ./ -size 0 -exec rm {} \;
3 find ./ -size 0 | xargs rm -f &
4 for file in * #自己定义需要删除的文件类型
do
if [ ! -s ${file} ]
then
rm ${file}
echo "rm $file Success!"
fi
done

1008 redhat设置滚轮鼠标(mc1011)
1 进入x后,选择鼠标的配置,选择wheel mouse (ps/2)就可以了,如果鼠标表现异常,重启计算机即可;
2 直接su, vi /etc/X11/XF86Config, 把PS/2改成ImPS/2

1009 加装xwindow(陈绪)
用linux光盘启动,选择升级,然后单独选择包,安装即可

1010 删除linux分区(陈绪)
1 做一张partition magic的启动软盘,启动后删除;
2 用win2000的启动光盘启动,然后删除

1011 如何退出man(陈绪)
q

1012 不编译内核,mount ntfs分区(陈绪,hutuworm)
找到对应内核版本(uname -a)的ntfsrpm,安装即可。
以原装rh8为例,未升级或编译内核
1. 上google.com搜索并下载 kernel-ntfs-2.4.18-14.i686.rpm
2. rpm -ivh kernel-ntfs-2.4.18-14.i686.rpm
3. mkdir /mnt/c
4. mount -t ntfs /dev/hda1 /mnt/c

Read only: http://linux-ntfs.sourceforge.net/
Read/Write: http://www.jankratochvil.net/project/captive/

1013 tar分卷压缩和合并(WongMokin,Waker)
以每卷500M为例
tar分卷压缩:tar cvzpf - somedir | split -d -b 500m (-d不是split的选项,是shell的选项,表示将tar命令的输出作为split的输入)
tar多卷合并:cat x* > mytarfile.tar.gz

1014 使用lilo/grub时找回忘记了的root口令(陈绪)
1.在系统进入单用户状态,直接用passwd root去更改;
2.用安装光盘引导系统,进入linux rescue状态,将原来/分区挂接上来,命令如下:
cd /mnt
mkdir hd
mount -t auto /dev/hdaX(原来分区所在的分区号) hd
cd hd
chroot ./
passwd root
这样可以搞定;
3.将本机的硬盘拿下来,挂到其他的linux系统上,采用的办法与第二种相同
以rh8为例,演示第1种方法如下:
一. lilo
1 在出现 lilo: 提示时键入 linux single
画面显示 lilo: linux single
2 回车可直接进入linux命令行
3 vi /etc/shadow
将第一行,即以root开头的一行中root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
4 reboot重启,root密码为空
二. grub
1 在出现grub画面时,用上下键选中你平时启动linux的那一项(别选dos),然后按e键;
2 再次用上下键选中你平时启动linux的那一项(类似于kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/),然后按e键;
3 修改你现在见到的命令行,加入single,结果如下:
kernel /boot/vmlinuz-2.4.18-14 single ro root=LABEL=/
4 回车返回,然后按b键启动,即可直接进入linux命令行
5 vi /etc/shadow
将第一行,即以root开头的一行中root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
6 reboot重启,root密码为空

1015 使ctrl+alt+del失效(陈绪)
vi /etc/inittab
将ca::ctrlaltdel:/sbin/shutdown -t3 -r now这行注释掉

1016 查看redhat的版本号(hutuworm)
cat /proc/version或cat /etc/redhat-release或cat /etc/issue

1017 查文件属于哪个rpm(无双)
上www.rpmfind.net上搜,或者rpm -qf 文件名得到

1018 将man或info的信息存为文本文件(陈绪)
以rpm命令为例:
man rpm | col -b > rpm.txt
info rpm -o rpm.txt –s

1019 利用两个现存文件,生成一个新的文件(陈绪)
1. 取出两个文件的并集(重复的行只保留一份)
cat file1 file2 | sort | uniq
2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
cat file1 file2 | sort | uniq -d
3. 删除交集,留下其他的行
cat file1 file2 | sort | uniq –u

1020 设置com1口,让超级终端通过com1口进行登录(陈绪)
第一步:确认有/sbin/agetty,编辑/etc/inittab,添加
7:2345:respawn:/sbin/agetty /dev/ttyS0 9600
9600bps是因为连路由器时缺省一般都是这种速率,也可以设成
19200、38400、57600、115200
第二步:修改/etc/securetty,添加一行:ttyS0,确保root用户能登录
第三步:重启机器,就可以拔掉鼠标键盘显示器(启动时最好还是要看看输出信息)了

1021 删除内有文件和子目录的目录(陈绪)
rm -rf 目录名

1022 查看系统信息(陈绪)
cat /proc/cpuinfo - CPU (i.e. vendor, Mhz, flags like mmx)
cat /proc/interrupts - 中断
cat /proc/ioports - 设备IO端口
cat /proc/meminfo - 内存信息(i.e. mem used, free, swap size)
cat /proc/partitions - 所有设备的所有分区
cat /proc/pci - PCI设备的信息
cat /proc/swaps - 所有Swap分区的信息
cat /proc/version - Linux的版本号 相当于 uname -r
uname -a - 看系统内核等信息

1023 去掉多余的回车符(陈绪)
sed 's/^M//' test.sh > back.sh, 注意^M是敲ctrl_v ctrl-m得到的
或者 dos2unix test.sh

1024 切换X桌面(lnx3000)
如果你是以图形登录方式登录linux,那么点击登录界面上的session(任务)即可以选择gnome和kde。如果你是以文本方式登录,那执行switchdesk gnome或switchdesk kde,然后再startx就可以进入gnome或kde。
(或者vi ~/.xinitrc,添加或修改成exec gnome-session 或exec startkde,然后用startx启动x)

1025 通用的声卡驱动程序(lnx3000)
OSS www.opensound.com / ALSA www.alsa-project.org/

1026 改变redhat的系统语言/字符集(beming,mc1011)
修改 /etc/sysconfig/i18n 文件,如
LANG="en_US",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
还有一种方法
cp /etc/sysconfig/i18n $HOME/.i18n
vi $HOME/.i18n 文件,如
LANG="en_US",xwindow会显示英文界面,
LANG="zh_CN.GB18030",xwindow会显示中文界面。
这样就可以改变个人的界面语言,而不影响别的用户

1027 把屏幕设置为90列(陈绪)
stty cols 90

1028 使用md5sum文件(陈绪)
md5sum isofile > hashfile
md5sum文件与hashfile文件的内容比对,验证hash值是否一致
md5sum –c hashfile

1029 一次解压多个zip文件(陈绪)
unzip "*",注意引号不能少

1030 看pdf文件(陈绪)
安装Acrobat Reader

1031 查找权限位为S的文件(陈绪)
find . -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;

1032 装中文输入法(陈绪,hutuworm)
以redhat8为例,xwindow及其终端下的不用说了,缺省就安装了,用ctrl-space呼出。
现在讨论纯console,请到http://zhcon.sourceforge.net/下载zhcon-0.2.1.tar.gz,放在任一目录 中,tar xvfz zhcon-0.2.1.tar.gz,cd zhcon-0.2.1,./configure,make,make install。安装结束后,要使用zhcon,请运行zhcon,想退出,运行exit

1033 把弹出的光盘收回来(beike)
eject –t

1034 cd光盘做成iso文件(弱智,grub007)
cp /dev/cdrom /tmp/xxx.iso 或 dd if=/dev/cdrom of=/tmp/xxx.iso

1035 快速观看开机的硬件检测(弱智)
dmesg | more

1036 查看硬盘的使用情况(陈绪)
df -k 以K为单位显示
df -h 以人性化单位显示,可以是b,k,m,g,t..

1037 查看目录的大小(陈绪)
du -sh 目录名
-s 仅显示总计
-h 以K、M、G为单位,提高信息的可读性。KB、MB、GB是以1024为换算单位
-H 以1000为换算单位

1038 查找或删除正在使用某文件的进程(wwwzc)
fuser filename
fuser -k filename

1039 安装软件(陈绪)
rpm -ivh aaa.rpm
tar xvfz aaa.tar.gz; cd aaa; ./configure; make; make install

1040 字符模式下设置和删除环境变量(陈绪)
bash下
设置:export 变量名=变量值
删除:unset 变量名
csh下
设置:setenv 变量名 变量值
删除:unsetenv 变量名

1041 ls如何看到隐藏文件(即以.开头的文件)(双眼皮的猪)
ls –a 或 l. (适用于redhat)

1042 查看rpm中文件的安装位置(陈绪)
rpm -qpl aaa.rpm

1043 使用src.rpm编译出二进制rpm(陈绪)
rpmbuild --rebuild *.src.rpm

1044 设置vim中显示或不显示字体颜色(陈绪)
首先确保安装了vim-enhanced包,然后,vi ~/.vimrc; 如果有syntax on,则显示颜色,syntax off,则不显示颜色

1045 linux是实时还是分时操作系统(陈绪)
标准的内核是分时的,但是有些厂商也改造出了实时linux系统

1046 make bzImage -j的j是什么意思(wind521)
-j主要是用在当你的系统硬件资源比较足的时候,用改选项可以加快编译速度,如-j 3

1047 如何安装内核源码包(陈绪)
把你光盘上的内核源码包装上即可,rpm -i *kernel*source*.rpm

1048 修改系统时间(陈绪,laixi781211,hutuworm)
1 设置你的时区: timeconfig里选择Asia/Shanghai (如果你位于GMT+8中国区域)
2 与标准时间服务器校准: ntpdate time.nist.gov
当然,如果你是李嘉诚,也可以跟自己的手表校准: date -s STRING (STRING格式见man date),修改后执行clock -w 写到CMOS
date -s “2003-04-14 cst”,cst指时区,时间设定用date -s 18:10
3. 将当前软件系统时间写入硬件时钟: hwclock –systohc

1049 把命令结果传给一个变量(陈绪)
aa=`grep _GQAdd $1`,注意这个`是反引号

1050 linux怎么用这么多内存(陈绪)
为了提高系统性能和不浪费内存,linux把多的内存做了cache,以提高io速度

1051 /etc/fstab配置项里最后两个数字是什么意思(lnx3000)
第一个叫fs_freq,用来决定哪一个文件系统需要执行dump操作(dump执行ext2的文件系统的备份操作),0就是不需要;
第二个叫fs_passno,是系统重启时fsck程序检测磁盘(fsck检测和修复文件系统)的顺序号,0表示该文件系统不被检测,1是root文件系统,2是别的文件系统。fsck按序号检测磁盘

1052 让用户的密码必须有一定的长度,并且符合复杂度(eapass)
vi /etc/login.defs,修改PASS_MIN_LEN

1053 翻译软件(陈绪,hutuworm)
星际译王 xdict
console下还有个dict工具,通过DICT协议到dict.org上查11本字典,例如:dict RTFM

1054让显示器不休眠(陈绪)
setterm -blank 0
setterm -blank n (n为等待时间)

1055 用dat查询昨天的日期(gadfly)
date --date='yesterday'

1056 xwindow下如何截屏(陈绪)
使用Ksnapshot或者gimp

1057.a 解压小全(陈绪,noclouds,hmkart)
tar -I或者bunzip2命令都可以解压.bz2文件
tar xvfj example.tar.bz2
tar xvfz example.tar.gz
tar xvfz example.tgz
tar xvf example.tar
unzip example.zip
rpm2cpio example.rpm │ cpio -div
arp example.deb data.tar.gz | tar zxf -
tar -jvxf some.bz,就是把tar的zvxf 改成jvxf
zip/tar rh8下有一个图形界面的软件file-roller可以做这件事。另外可以用unzip *.zip解开zip文件,unrar *.rar解开rar文件,不过unrar一般系统不自带,要到网上下载:
http://www.linuxeden.com/download/softdetail.php?softid=883
下载rar for Linux 3.2.0,解压开后make,然后可以用unrar e youfilename.rar解压rar文件
Alien提供了.tgz, .rpm, .slp和.deb等压缩格式之间的相互转换:
http://sourceforge.net/projects/alien
sEx提供了几乎所有可见的压缩格式的解压接口:
http://sourceforge.net/projects/sex

1057.b tar的压缩和解压用法(platinum)
解压:x
压缩:c
针对gz:z
针对bz2:j
用于显示:v
解压实例:
gz文件:tar xzvf xxx.tar.gz
bz2文件:tar xjvf xxx.tar.bz2
压缩实例:
gz文件:tar czvf xxx.tar.gz /path
bz2文件:tar cjvf xxx.tar.bz2 /path

1058 在多级目录中查找某个文件的方法(青海湖)
1 find /dir -name filename.ext
2 du -a | grep filename.ext
3 locate filename.ext

1059 不让普通用户自己改密码(myxfc)
[root@xin_fc etc]# chmod 511 /usr/bin/passwd
又想让普通用户自己改密码
[root@xin_fc etc]# chmod 4511 /usr/bin/passwd

1060 显卡实在配不上怎么办(win_bigboy)
去http://www.redflag-linux.com/,下了xfree86 4.3安装就可以了

1061 超强删除格式化工具(弱智)
比pqmagic更安全的、进行删除格式化的小工具:sfdisk.exe for msdos
下载地址:http://www.wushuang.net/soft/sfdisk.zip

1062 如何让xmms播放列表里显示正确的中文(myxfc)
-*-*-*-*-*-iso8859-1,-misc-simsun-medium-r-normal--12-*-*-*-*-*-gbk-0,*-r-
把这个东西完全拷贝到你的字体里面
操作方法:右键单击xmms播放工具的任何地方,会看到一个"选项",然后选择"功能设定",选择"fonts",然后把上面的字体完整的拷贝到"播放清单"和"user x font"中

1063 redhat linux中播放mp3文件(hehhb)
自带的xmms不能播放MP3(无声),要安装一个rpm包:rpm -ivh xmms-mp3-1.2.7-13.p.i386.rpm。打开xmms,ctl-p,在font栏中先在上半部的小框内打勾,再选择 “fixed(misc) gbk-0 13”号字体即可显示中文歌曲名。在音频输出插件中选择 "开放音频系统驱动程序1.2.7 [lioOSS.so],即可正常播放MP3文件

1064 安装中文字体(hehhb)
先下载 http://freshair.netchina.com.cn/~George/sm.sh文件,然后在微软网站下载 SimSun18030.ttc(http://www.microsoft.com/china/windows2000/downloads /18030.asp),它是个msi文件,在mswindows中安装用的,装好后在windows目录下的fonts目录里面就可以找到它。把 simsun.ttc,SimSun18030.ttc,tahoma.ttf,tahomabd.ttf拷贝到/usr/local/temp,然后下 载的sm.sh文件也放到这个目录里,最后打开终端
cd /usr/local/temp
sh sm.sh

1065 移动光标(陈绪)
echo -e '\033[20;10f' 把光标移动到20行10列
另外,如果还出现乱码,可以改为iocharset=utf8

1066 在x下使用五笔和拼音,区位输入法(hmkart)
从http://www.fcitx.org/上下载fcitx的rpm包安装即可

1067 ls重定向到多个文件(陈绪)
ls | tee 1.txt 2.txt 3.txt .....

1068 硬盘iso安装后怎么添加和删除rpm包(sakulagi)
redhat-config-packages --isodir=
为iso文件所在的目录

1069 字符下控制音量(grub007,天外闲云)
使用aumix。保存oss的音量大小的步骤为:
1、用aumix将音量调整为你们满意的音量;
2、用root用户进入/usr/lib/oss下(oss的默认安装目录);
3、执行./savemixer ./mixer.map;
4、ok,以后oss开启之后就是你在第一步调整的音量了。

1170 echo典型应用(陈绪)
echo "abcdefg" | perl -lne '{$a = reverse($_); print $a;}' 把一个字符串翻转
echo bottle|rev 把一个字符串翻转

1071 删除几天以前的所有东西(包括目录名和目录中的文件)(shally5)
1 find . -ctime +3 -exec rm -rf {} \;
2 find ./ -mtime +3 -print|xargs rm -f –r

1072 用户的crontab在哪里(hutuworm)
/var/spool/cron/下以用户名命名的文件中

1073 以不同的用户身份运行程序(陈绪)
su - username -c "/path/to/command"
有时候需要运行特殊身份的程序, 就可以让su来做

1074 不改变inode清空一个文件(陈绪)
> filename

1075 为什么OpenOffice中不能显示中文(allen1970)
更改字体设置
tools->options->font replacement
Andale Sans UI -> simsun

1076 如何备份Linux系统(Purge)
Symantec Ghost 7.5以后的版本支持Ext3 native复制

1077 linux上的partition magic(wwwzc)
Linux下一个有用的分区工具:parted,可以实时修改分区大小, 删除和建立分区.

1078 /proc/sys/sem中每项代表的意思(sakulagi)
/proc/sys/sem内容如下
250 32000 32 128
这4个参数依次为SEMMSL(每个用户拥有信号量最大数量),SEMMNS(系统信号量最大数量),SEMOPM(每次semop系统调用操作数),SEMMNI(系统信号量集最大数量)

1079 Grub 引导菜单里 bigmem smp up 都是什么意思(lnx3000)
smp: (symmetric multiple processor)对称多处理器模式
bigmem: 支持1G 以上内存的优化内核
up:(Uni processor) 单处理器的模式

1080 oracle的安装程序为什么显示乱码(lnx3000)
现在oracle的安装程序对中文的支持有问题,建议使用英文界面来安装,在执行runinstaller之前,执行:export LANG=C;export LC_ALL=C

1081 linux下文件和目录的颜色代表的含义(sakulagi,弱智)
蓝色表示目录;绿色表示可执行文件;红色表示压缩文件;浅蓝色表示链接文件;灰色表示其它文件;红色闪烁表示链接的文件有问题了;黄色是设备文件,包括block, char, fifo。
用dircolors -p看到缺省的颜色设置,包括各种颜色和“粗体”,下划线,闪烁等定义

1082 查看有多少活动httpd的脚本(陈绪)
#!/bin/sh
while (true)
do
pstree |grep "*\[httpd\]$"|sed 's/.*-\([0-9][0-9]*\)\*\[httpd\]$/\1/'
sleep 3
done

1083 如何新增一块硬盘(好好先生)
一、关机,物理连接硬盘
如果是IDE硬盘,注意主、从盘的设置;如果是SCSI硬盘,注意选一个没被使用的ID号。
二、开机,检查硬盘有没有被linux检测到
dmesg |grep hd*(ide硬盘)
dmesg |grep sd*(SCSI硬盘)
或者 less /var/log/dmesg
如果你没有检测到你的新硬盘,重启,检查连线,看看bios有没有认出它来。
三、分区
你可以使用fdisk,Sfdisk或者parted(GNU分区工具,linux下的partition magic)
四、格式化
mkfs
五、修改fstab
vi /etc/fstab

1084 看分区的卷标(q1208c)
e2label /dev/hdxn, where x=a,b,c,d....; n=1,2,3...

1085 RH8,9中添加新的语言包(好好先生)
一 8.0中
1.放入第一张光盘;
2.cd /mnt/cdrom/Redhat/RPMS;
3.rpm -ivh ttfonts-ZH_CN-2.11-29.noarch.rpm(简体中文,建议用tab键来补齐后面的部分,以免输入有误);
4.rpm -ivh ttfonts-ZH_TW-2.11-15.noarch.rpm(繁体中文)
如果你还想装日文、韩文,安装第二张光盘上的ttfonts*.rpm.
二 9.0中
9.0不在第一张盘上,在第三张盘上.rpm包名分别为:
ttfonts-zh_CN-2.12-1.noarch.rpm(简体中文)
ttfonts-zh_TW-2.11-19.noarch.rpm(繁体中文)

1086 终端下抓屏(tsgx)
1 cat /dev/vcsX >screenshot 其中,X表示第X个终端
2 运行script screen.log,记录屏幕信息到screen.log里。一会记录到你exit为此。这也是抓屏的好方法
这是在debian的cookbook上看到的。在RH9上能用

1087 让一个程序在退出登陆后继续运行(NetDC,双眼皮的猪,noclouds,陈绪)
1 nohup command &
2 # command
# disown

1088 man命令不在路径中时,查看非标准的man文件(陈绪)
nroff -man /usr/man/man1/cscope.1 | more

1089 cp时显示进度(陈绪)
cp -r -v dir1 dir2
cp -a -d -v dir1 dir2

1090 编辑/etc/inittab后直接生效(陈绪)
init q

1091 让linux连续执行几个命令,出错停止(陈绪)
command1 && command2 && command3

1092 如何将grub安装到mbr(陈绪, NetDC)
grub> root (hd0, 0)
grub> setup (hd0)
也可以用grub-install /dev/hda来安装grub

1093 安装时把grub(lilo)写到linux分区的引导区还是主引导扇区(MBR)(陈绪)
如果你想电脑一启动就直接进入操作系统启动菜单就把grub(lilo)写到MBR上,如果写到linux分区的引导区则要用引导盘引导。建议写到 MBR,方便点

1094 如何让多系统共存(陈绪)
98系统的话用lilo(grub)引导,2k/nt则使用osloader引导多系统

1095 如何在图形界面和控制台(字符界面)之间来回切换(陈绪)
1 图形界面到控制台:Ctr+Alt+Fn(n=1,2,3,4,5,6);
2 各控制台之间切换:Alt+Fn(n=1,2,3,4,5,6);
3 控制台到图形:Alt+F7

1096 Redhat linux常用的命令(陈绪)
<1>ls:列目录。
用法:ls或ls dirName,参数:-a显示所有文件,-l详细列出文件。
<2>mkdir:建目录。
用法:mkdir dirName,参数:-p建多级目录,如:mkdir a/b/c/d/e/f -p
<3>find:查找文件。
用法:find inDir -name filename,inDir是你要在哪个目录找,filename是你要找的文件名(可以用通配符),用通配符时filename最好用单引号引起来, 否则有时会出错,用例:find . -name test*,在当前目录查找以test开头的文件。
<4>grep:在文件里查找指定的字符串。
用法:grep string filename,在filename(可用通配符)里查找string(最好用双引号引起来)。参数:-r在所有子目录里的filename里找。用 例:grep hello *.c -r在当前目录下(包括子目录)的所有.c文件里查找hello。
<5>vi:编辑器。
用法:vi filename。filename就是你要编辑的文本文件。用了执行vi filename后,你可能会发现你无法编辑文本内容,不要着急,这是因为vi还没进入编辑状态,按a或i就可以进入编辑状态了,进入编辑状态后你就可以 编辑文本了。要退出编辑状态按Esc键就可以了。以下操作均要在非编辑状态下。查找文本:输入/和你要查找的文本并回车。退出:输入: 和q并回车,如果你修改了文本,那么你要用:q!回车才能退出。保存:输入: w回车,如果是只读文件要用: w!。保存退出:输入: wq回车,如果是只读就: wq!回车。取消:按u就可以了,按一次就取消一步,可按多次取消多步。复制粘贴一行文本:把光标移到要复制的行上的任何地方,按yy(就是连按两次 y),把光标移到要粘贴地方的上一行,按p,刚才那行文本就会被插入到光标所在行的下一行,原来光标所在行后面所有行会自动下移一行。复制粘贴多行文本: 跟复制一行差不多,只是yy改成先输入要复制的行数紧接着按yy,后面的操作一样。把光标移到指定行,输入:和行号并回车,如移到123行:123回车, 移到结尾:$回车

1097 linux文本界面下如何关闭pc喇叭(labrun,sakulagi)
1 将/etc/inputrc中的set bell-style none 前的#去掉;
2 echo "set bell-style none" >> ~/.bashrc;
3 去除vi的铃声,echo "set vb t_vb=" >> ~/.vimrc

1098 重装windows导致linux不能引导的解决办法(好好先生)
如果没有重新分区,拿linux启动盘(或者第一张安装光盘)引导,进入rescue模式。首先找到原来的/分区mount在什么地方。redhat通常 是/mnt/sysimage. 执行"chroot /mnt/sysimage". 如果是grub,输入grub-install /dev/hd*(根据实际情况);如果是lilo,输入lilo -v,然后重新启动。如果分区有所改变,对应修改/etc/lilo.conf和/boot/grub/grub.conf然后再执行上述命令

1099 为什么装了LINUX后win2K很慢(lnx3000,好好先生)
你在2000应该能看见Linux的逻辑盘,但不能访问,解决方法是在磁盘管理里,选中这个盘,右击->更改"驱动器名和路径"->"删除"就可以了,注意不是删除这个盘

1100 将linux发布版的iso文件刻录到光盘的方法(陈绪)
在windows中使用nero软件,选择映象文件刻录->iso文件,刻录即可

1101 linux中刻录iso的方法(hutuworm)
1 使用xcdroast,选择制作光碟,选择ISO文件,刻录!
参见http://www.xcdroast.org/xcdr098/faq-a15.html#17
2 找刻录机的命令:
cdrecord --scanbus
输出结果为:
0,0,0 0) 'ATAPI ' 'CD-R/RW 8X4X32 ' '5.EZ' Removable CD-ROM
刻录的命令:
cdrecord -v speed=8 dev=0,0,0 hutuworm.iso
3 使用k3b可以刻录CD/DVD
k3b主页:http://www.k3b.org/
(实际上k3b是个图形界面,刻录CD利用了cdrecord,刻录DVD利用了dvd+rw-tools http://fy.chalmers.se/~appro/linux/DVD+RW/ )

1102 屏幕变花时怎么办(双眼皮的猪)
当您一不小心cat了一个并不是文本的文件时,屏幕会变花,那么您可以按两下"Enter"键,再敲"reset",那么屏幕就恢复正常了....

1103 卸载软件包时得知具体包名(diablocom)
删除软件包的命令是rpm -e XXX,如果不知道这个XXX的确切拼写时,可以用rpm -qa查询所有安装的软件包或者用rpm -qa |grep xxxx查询出名字

1104 使用内存作linux下的/tmp文件夹(yulc)
在/etc/fstab中加入一行:
none /tmp tmpfs default 0 0
或者在/etc/rc.local中加入
mount tmpfs /tmp -t tmpfs -o size=128m
注:size=128m 表示/tmp最大能用128m
不管哪种方式,只要linux重启,/tmp下的文件全部消失

1105 用ls只列出目录(yulc)
ls -lF | grep ^d
ls -lF | grep /$
ls -F | grep /$

1106 在命令行下列出本机IP地址,而不是得到网卡信息(yulc)
ifconfig |grep "inet" |cut -c 0-36|sed -e 's/[a-zA-Z: ]//g'
hostname –i

1107 修改/etc/profile或者$HOME/.profile文件后如何立即生效(peter333)
#source /etc/profile (或者source .profile)

1108 bg和fg的使用(陈绪)
输入ctrl+z,当前一个任务会被挂起并暂停,同时屏幕上返回进程号,此时用 "bg %进程号",会把这个进程放到后台执行,而用" fg %进程号 "就能让这个进程放到前台来执行。另外,job命令用来查看当前的被bg的进程

1109 ctrl+s与ctrl+q(陈绪)
ctrl-s用来暂停向终端发送数据的,屏幕就象死了一样,只能用ctrl-q来恢复

1110 目录统计脚本(陈绪)
保存成total.sh,然后用total.sh 绝对路径,就能统计路径下目录的大小了
代码:
#!/bin/sh
du $1 --max-depth=1 | sort -n|awk '{printf "%7.2fM ----> %s\n",$1/1024,$2}'|sed 's:/.*/\([^/]\{1,\}\)$:\1:g'

1111 grep不显示本身进程(陈绪)
#ps -aux|grep httpd|grep -v grep
grep -v grep可以取消显示你所执行的grep本身这个进程,-v参数是不显示所列出的进程名

1112 删除目录中含输入关键字的文件(WongMokin)
find /mnt/ebook/ -type f -exec grep "在此输入关键字" {} \; -print -exec rm {} \;

1113 让cron中的任务不回馈信息, 本例5分钟检查一次邮件(WongMokin)
0-59/5 * * * * /usr/local/bin/fetchmail > /dev/null 2>&1

1114 在当前目录下解压rpm文件(陈绪)
cat kernel-ntfs-2.4.20-8.i686.rpm | rpm2cpio | pax –r

1115 合并两个Postscript或PDF文件(noclouds)
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
-sOutputFile=bar.ps -f foo1.ps foo2.ps
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
-sOutputFile=bar.pdf -f foo1.pdf foo2.pdf

1116 去掉apache的manual目录中的所有.en的后缀名(陈绪)
进入到manual目录
代码:
find ./ -regex .*\.en|awk -F. '{ printf "mv %s.%s.%s.%s %s.%s.%s\n",$1,$2,$3,$4,$1,$2,$3}'|sh

1117 如何起多个X(noclouds)
startx默认以display :0.0起第一个X,通过传递参数给Xserver可以起多个X:
# startx -- :1.0
# startx -- :2.0
...
然后用Ctrl-Alt-F7/F8...切换

1118 split分割合并文件(陈绪)
split -b1440k a_whopping_big_file chunk
cat chunk* > a_whopping_big_file

1119 看Linux启动时屏幕的显示信息(陈绪)
启动完毕后用命令dmesg查看

1120 我需要编译内核,内核源码在哪里(platinum)
1、一般在发行版的盘里都有,比如 RedHat,一般在第二、第三张上
2.4 内核的叫 kernel-source-2.4.xx-xx.rpm
2.6 内核的叫 kernel-devel-2.6.xx-xx.rpm
2、去www.kernel.org下载一份你喜欢的

1121 让fedora开机后自动login(dzho002)
1 rpm -ihv autologin-1.0.0-7mdk.i586 rpm
2 建立文件 /etc/sysconfig/autologin
在里面加上一行.
USER = root

1122 如何配置让哪些服务启动(天外闲云,q1208c)
1 运行ntsysv或者setup命令,进入菜单进行配置;
2 chkconfig --list 显示服务
chkconfig name on/off 打开/关闭“name”服务

1123 安全删除linux(天外闲云)
步骤1 dos下使用fdisk /mbr或者用win2000/xp的光盘启动进入故障恢复控制台,使用命令fixmbr
步骤2 格式化linux分区为windows分区即可

1124 用grub引导进文本界面(天外闲云)
进入grub之后,按a,输入 空格 3 就可以引导进入文本界面,但是不修改系统的运行级,只在当次有效

1125 先测试patch是否运行正常,暂不将更改应用到kernel(jiadingjun)
patch --dry-run

1126 redhat和debian上的软件安装卸载用法(NetDC)
卸载一个软件包:
rpm -e
dpkg -r
显示一个软件包的内容:
rpm -qvl
dpkg -c
显示所有已经安装的软件包:
rpm -qvia
dpkg -l
打印一个包的信息:
rpm -qpi
dpkg -I
检验包characteristics:
rpm -Va
debsums -a
检验一个文件属于哪个包:
rpm -qf

dpkg -S

安装新软件包:
rpm -Uvh
dpkg -i

1127 强制新用户首次登陆后修改密码(猫小)
#useradd -p '' testuser; chage -d 0 testuser

1128 日志维护工具logrotate(hotbox)
在/etc/logrotate.conf中配置,定义log文件达到预定的大小或时间时,自动压缩log文件

1129 Linux中默认的管理员叫什么(陈绪)
root

1130 如何产生一个长度固定(例如文件长度为1M)字节的空文件,即每个字节的值全为0x00(sakulagi)
dd if=/dev/zero of=/tmp/zero_file bs=1024 count=1024

1131查看某文件的一部分(陈绪)
如果你只想看文件的前5行,可以使用head命令,
如:head -5 /etc/passwd
如果你想查看文件的后10行,可以使用tail命令,
如:tail -10 /etc/passwd
你知道怎么查看文件中间一段吗?你可以使用sed命令
如:sed –n '5,10p' /etc/passwd这样你就可以只查看文件的第5行到第10行。

1132 查找当前目录下文件并更改扩展名(零二年的夏天)
更改所有.ss文件为.aa
# find ./ -name "*.ss" -exec rename .ss .aa '{}' \;

1133 patch的使用(天才※樱木)
语法是patch [options] [originalfile] [patchfile]
例如:
patch -p[num] <patchfile p="" 16="" src="" usr="" patch="" p0=""><patch-2.4.16"可以工作,在当前目录为 usr="" src="" patch="" id="wbx8722">
1134 将file.txt里的123改为456(hutuworm)
方法1
sed 's/123/456/g' file.txt > file.txt.new
mv -f file.txt.new file.txt
方法2
vi file.txt
输入命令:
:%s/123/456/g

1135 将一个分区格式化为ext3日志文件系统(hutuworm)
mkfs -j /dev/xxxx

1136 开启硬盘ATA66(laixi781211)
/sbin/hdparm -d1 -X68 -c3 -m16 /dev/had

1137 查看当前运行级别(双眼皮的猪)
runlevel

1138 查看当前登陆身份(双眼皮的猪)
1 who am i
2 whoami
3 id
注意1跟2的小区别

1139 删除rpm -e删除不了的包(wwwzc)
1、如果在删除包之前删除了包的目录
rpm -e --noscripts
2、如果系统里一个包被装两次(由于某些异常引起的)
rpm -e multi-installed-pkgs –allmatches

1140 如何定制用户登录时显示的信息(jiadingjun)
在/etc目录下放一个名字叫motd的文本文件实现的,例如,建立自己的/etc/motd:
$cat /etc/motd
welcome to my server !
那么,当用户登录系统的时候会出现这样的信息:
Last login: Thu Mar 23 15:45:43 from *.*.*.*
welcome to my server

1141 用命令清空Root回收站中的文件(dtedu)
cd /var/.Trash-root
rm -rf *

1142 在Red Hat上加Simsun.ttc字体(陈绪)
以Red Hat 7.3为例,安装时选取简体中文安装,先复制一个simsun.ttc到/usr/X11R6/lib/X11/font/TrueType,改名为 simsun.ttf;然后进入/usr/X11R6/lib/X11/font/TrueType目录下,运行ttmkfdir > fonts.dir命令;接着用vi编辑fonts.dir文件,把有simsun.ttf行修改如下:
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-ascii-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-iso10646-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-15
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-iso8859-1
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gb2312.1980-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-m-0-gb2312.1980-0
simsun.ttf -misc-SimSun-medium-r-normal--0-0-0-0-p-0-gbk-0
接着运行cat fonts.dir > fonts.scale命令,修改/etc/X11/XF86config-4, 在Section“Files”加上下面这一行:
FontPath “/usr/X11R6/lib/X11/fonts/TrueType”
最后回到KDE桌面里, 在“开始”→“选项”→“观感”→“字体”,将所有字体改为Simsun

1143 Unicon和Zhcon的区别和作用(陈绪)
Unicon是内核态的中文平台,基于修改Linux FrameBuffer和Virtual Console(fbcon)实现的。由于是在系统底层实现的,所以兼容性极好,可以直接支持gpm鼠标。但是相对比较危险,稍有漏洞就可能会危及系统安 全。Zhcon是用户态的中文平台,有点像UCDOS

1144 如何卸载tar格式安装的软件(陈绪)
进入安装该软件的原代码目录,运行make uninstall。如果不行,也可以查看一下Makefile文件,主要是看install部分,从其中找出tar格式的文件被复制到了什么路径,然后进入相应的目录进行删除即可

1145 定制linux提示符(陈绪)
在bash中提示符是通过一个环境变量$PS1指定的。用export $PS1查看现在的值,比较直观常用的提示符可以设定为export PS1=“[\u@\h \W]\$”。其中\u代表用户名,\h代表主机名,\W代表当前工作目录的最后一层,如果是普通用户\$则显示$,root用户显示#

1146 在vi中搜索了一个单词,该单词以高亮显示,看起来很不舒服,怎么能将它去掉(陈绪)
在vi的命令模式下输入:nohlsearch就可以了。另外可以在~/.vimrc中写上下面的语句就会有高亮显示:
set hlsearch
加上下面的语句就不会有高亮显示:
set nohlsearch

1147 如何找出系统中所有的*.cpp、*.h文件(陈绪)
用find命令就可以了。不过如果从根目录查找消耗资源较高,使用下面的命令就可以:
find / -name "*.cpp" -o -name "*.h"

1148 如安装Debian需要几张盘就够了?7张盘全部都要下载吗(陈绪)
如果经常有网络环境的话,下载第一张就可以了。要是没有网络环境的话不推荐使用Debian,因为Debian主要依赖网络来更新软件。实在要安装的话,要下载全部7张盘,否则可能会出现需要的软件包找不到的问题

1149 Debian第一张光盘为什么有两个版本?debian-30r1-i386-binary-1.iso和debian-30r1-i386-binary-1_NONUS.iso该下载哪一个呢?它们有什么区别(陈绪)
因为含有“non-US”(不属美国)的软件不能合法地存放在架设于美国境内的服务器中。以前,其原因通常是因为软件含有严密的密码编码,而今天,则是因 为程序使用了美国专利保护的演算法。每个人应该取用“non-US”来供私人用途所用;而没有这个标识的iso则只对架设在美国的镜像及供应商才有用处。 其它二进制的光盘则不会含有任何“US-sensitive”(与美国相关的)软件,它们和其它种binary-1光盘一样运作得很好。因此,个人使用还 是下载debian-30r1-i386-binary-1_NONUS.iso版本

1150 为何我使用umount /mnt/cdrom命令的时候出现device is busy这样的语句,不能umount(陈绪)
在使用umount的时候一定要确保已退出/mnt/cdrom这个目录,退出这个目录就可以使用umount /mnt/cdrom了

1151 我使用的是笔记本电脑,怎么才能在控制台下显示现在还剩多少电量呢(陈绪)
使用apm -m就可以看到还有多少分钟了,具体参数可以用man apm查看

1152 为什么我进入Linux的终端窗口时,man一条命令出来的都是乱码呢(陈绪)
这是因为你的字符集设置有问题。临时解决办法可以使用export LANG=“en_US”。要想不必每次都修改的话,在/etc/sysconfig/i18n文件里面修改LANG=“en_US”就可以了。也可以针 对某个用户来做,这样就可以改变个人的界面语言,而不影响别的用户。命令如下:# cp /etc/sysconfig/i18n $HOME/.i18n

1153 编译内核的时候出错,提示“Too many open files”,请问怎么处理(陈绪)
这是因为file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*下的init脚本):
# echo "65536" > /proc/sys/
最后进入解压后的目录,运行安装命令。
# cd vmware-linux-tools
# ./install.pl

1154 本来装有Linux与Windows XP,一次将Windows XP重装后,发现找不到Linux与Windows XP的启动选单,请问如何解决(陈绪)
首先光盘启动,进入rescue模式,运行GRUB,进入grub提示符grub>,然后敲入下面的语句,重启就好了。
root (hd0,2),setup (hd0)

1155 安装了一台Linux服务器,想自己编译内核,一步一步做下来,GRUB也添加进去了,但出现“kernel Panic:VFS:Unable to mount root fs on 0:00”的错误,请问是怎么回事(陈绪)
一般情况下initrd这个文件在台式机上不是必须的,但是在有SCSI设备的服务器上却是必须的。有可能因为编译内核的时候没有产生initrd那个文 件,所以会有上面的错误提示。用户可以使用mkinitrd命令来生成一个initrd.img文件,然后加入GRUB,重启试一试

1156 如何设置用户登录后的欢迎信息(陈绪)
修改/etc/motd文件,往里面写入文本,就能使用户通过Telnet正确登录后,执行Shell之前得到相应的提示信息。
motd就是“messages of the day”,也就是当日信息的意思。管理员可以往里面写一些需要注意的事项或通知等来提醒正式用户

1157 我下载了rcs5.7,用./configure && make && make install时报错如下:./conf.sh: testing permissions ... ./conf.sh: This command should not be run with superuser permissions. 我是以root用户身份登录编译安装的,为什么会这样(陈绪)
有些软件确实因为考虑到安全等其它原因不能用root用户编译。这时只要用其它用户编译,到make install这步时,如果该软件安装在不属于编译时的用户的主目录下时,需要使用su命令转换为root用户再执行make install

1158 我在安装USBView时失败,具体情况如下:
#rpm -ivh usbview-1.0-9.src.rpm warning:usbview-1.0-9.src.rpm:V3 DSAsignature:NOKEY,key IDab42a60e(陈绪)
这行代码说明安装失败是因为你的系统上没有安装合适的钥匙来校验签名。要使该软件包通过校验,可以通过导入Red Hat的公匙来解决,具体的方式是在Shell下运行如下命令:
#rpm -import /usr/share/rhn/RPM-GPG-KEY (注意大小写)

1159 如何防止某个关键文件被修改(陈绪)
在Linux下,有些配置文件是不允许任何人(包括root)修改的。为了防止被误删除或修改,可以设定该文件的“不可修改位(immutable) ”。命令如下:
# chattr +i /etc/fstab
如果需要修改文件则采用下面的命令:
# chattr -i /etc/fstab

1160 怎样限制一个用户可以启动的进程数(陈绪)
先确定一下/etc/pam.d/login文件中下面一行的存在:
session required /lib/security/pam_limits.so
然后编辑/etc/security/limits.conf,在里面可以设置限制用户的进程数、CPU占用率和内存使用率等,如hard nproc 20就是指限制20个进程,具体可以看man

1161 如何限制Shell命令记录大小(陈绪)
默认情况下,bash会在文件$HOME/.bash_history中存放多达500条命令记录。有时根据具体的系统不同,默认记录条数不同。系统中每 个用户的主目录下都有一个这样的文件。为了系统的安全,在此强烈建议用户限制该文件的大小。用户可以编辑/etc/profile文件,修改其中的选项如 下:
HISTFILESIZE=30 或 HISTSIZE=30
这样就将记录的命令条数减少到30条

1162 我想将开机时显示的信息保留下来,以检查电脑出了问题的地方,请问怎么办(陈绪)
可输入下面的命令:
#dmesg > bootmessage
该命令将把开机时显示的信息重定向输出到一个文件bootmessage中

1163 我想在注销时删除命令记录,请问怎么做(陈绪)
编辑/etc/skel/.bash_logout文件,增加如下行:
rm -f $HOME/.bash_history
这样,系统中的所有用户在注销时都会删除其命令记录。
如果只需要针对某个特定用户,如root用户进行设置,则可只在该用户的主目录下修改/$HOME/.bash_history文件,增加相同的一行即可

1164 编译内核,支持ntfs的步骤(platinum,陈绪)
1. # cd /usr/src/linux-2.4
2. # make menuconfig
3. 选中File System下的NTFS file system support (read only)为M
4. # uname -a
2.4.21-27.0.2.EL
5. # vi Makefile
确保前几行为
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 21
EXTRAVERSION = -27.0.2.EL
6. # make dep
7. # make modules SUBDIRS=fs/ntfs
8. # mkdir /lib/moduels/2.4.21-27.0.2.EL/kernel/fs/ntfs
9. # cp -f fs/ntfs/*.o /lib/moduels/2.4.21-27.0.2.EL/kernel/fs/ntfs/
10. # depmod -a
11. # modprobe ntfs
12. # lsmod
确保有ntfs在里面

1165 如何使用ssh通道技术(陈绪)
本文讨论所有机器均为Linux操作系统。
比如说我的机器是A,中间服务器为B,目标服务器是C。
从A可以ssh到B,从B可以ssh到C,但是A不能直接ssh到C。
现在展示利用ssh通道技术从A直接传输文件到C。
1. ssh -L1234:C:22 root@B
input B's password
2. scp -P1234 filename root@localhost:
input C's password

1166 使用rpm命令时没有任何响应,如何解决(初学摄影)
rm -rf /var/lib/rpm/__db.*

1167 向登陆到同一台服务器上的所有用户发一条信息(陈绪)
1)输入wall并回车
2)输入要发送的消息
3)结束时按“Control-d”键,消息即在用户的控制窗口中显示

1168 输入短消息到单个用户(陈绪)
1)输入write username,当用户名出现在多个终端时,在用户名后可加tty,以表示在哪个tty下的用户。
2)输入要发送的消息。
3)结束时按“Control-d”键,消息即在用户的控制窗口中显示。
4)对于接收消息方,可以设定是否允许别人送消息给你。
指令格式为:mesg n[y]
%write liuxhello! Everybody, I’llcome.
%
用户控制窗口中显示的消息:Message from liux on ttyp1 at 10:00…hello! Everybody, I’llcome.EOF
当使用CDE或OpenWindows等窗口系统时,每个窗口被看成是一次单独的登录;如果用户登录次数超过一次则消息直接发送到控制窗口

1169 发送文件中的消息到单个用户(陈绪)
如果有一个较长的消息要发送给几个用户,用文件方式:
1)创建要发送的消息文本的文件filename.
2)输入write usernamemessage hello! Everybody, I’ll come.
% write liux % 用户在一个以上窗口登录,消息显示在控制窗口中Message from liux on ttyp1 at 10:00…hello! Everybody, I’ll come. EOF

1170 向远程机器上的所有用户发送消息(陈绪)
使用rwall(向所有人远程写)命令同时发送消息到网络中的所有用户。
rwall hostname file
当使用CDE或OpenWindows等窗口系统时,每个窗口被看成是一次单个的登录;
如果用户登录次数超过一次则消息直接发送到控制窗口

1171 向网络中的所有用户发送消息(陈绪)
发送消息到网络中的所有用户
1)输入rwall -n netgroup并回车
2)输入要发送的消息
3)结束时按“Control-d”键,消息即在系统每个用户的控制窗口中显示,下面是系统管理员发消息到网络组Eng每个用户的例子:
% rwall -n EngSystem will be rebooted at 11:00.(Control-d)
%
用户控制窗口中的消息:Broadcast message from root on console…System will be rebooted at 11:00.EOF
注意:也可以通过rwall hostname(主机名)命令到系统的所有用户

1172 我需要编译内核,内核源码在哪里?(platinum)
1、一般在发行版的盘里都有,比如 RedHat,一般在第二、第三张上
2.4 内核的叫 kernel-source-2.4.xx-xx.rpm
2.6 内核的叫 kernel-devel-2.6.xx-xx.rpm
2、去 www.kernel.org 下载一份你喜欢的

1173 将top的结果输出到文件中(魏琼)
top -d 2 -n 3 -b >test.txt
可以把top的结果每隔2秒,打印3次,这样后面页的进程也能够看见了

1174 vim中改变全文大小写的方法(陈绪)
光标放在全文开头
gUG 所有字母变大写
guG 所有字母变小写
g~G 所有字母,大写变小写,小写变大写

1175 如何升级安装ubuntu(陈绪)
以ubuntu 7.04->7.10为例。
mount -o loop /media/ubuntu-7.10-alternate-i386.iso /cdrom
gksu "sh /cdrom/cdromupgrade"
如果需要代理:
export http_proxy=http://proxy.server.ip/; gksu "sh /cdrom/cdromupgrade"

1176文件不均匀切分方法(qintel)
$dd if=source of=target.1 bs=1M count=10
$dd if=source of=target.2 bs=1M skip=10
source被分为target.1和target.2两个文件,其中target.1为source的前10M部分;target.2为source的减去10M后的部分。
2 网络相关篇
2001 让apache的默认字符集变为中文(陈绪)
vi httpd.conf,找到 AddDefaultCharset ISO-8859-1 一行
apache版本如果是1.*,改为 AddDefaultCharset GB2312
如果是2.0.1-2.0.52,改为 AddDefaultCharset off
然后运行/etc/init.d/httpd restart重启apache即可生效。
注意:对于2.0.53以上版本,不需要修改任何配置,即可支持中文

2002 永久更改ip(陈绪)
编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,修改ip,然后执行ifdown eth0; ifup eth0

2003 从Linux上远程显示Windows桌面(lnx3000)
安装rdesktop包

2004 手动添加默认网关(陈绪)
以root用户,执行: route add default gw 网关的IP
想更改网关
1 vi /etc/sysconfig/network-scripts/ifcfg-eth0
更改GATEWAY
2 /etc/init.d/network restart

2005 redhat 8.0上msn和qq(陈绪)
下载Gaim 0.58版:
gaim-0.58-2.i386.rpm
下载QQ插件 for gcc2.9版:
libqq-0.0.3-ft-0.58-gcc296.so.gz
将下载的文件放入/temp目录,然后将系统中已有的Gaim删除,即在终端仿真器中键入命令:rpm -e gaim。
开始安装
打开终端仿真器,继续执行下列命令安装Gaim 0.58版,即:
cd /temp         (进入temp目录)
rpm -ivh gaim-0.58-2.i386.rpm (安装软件)
当安装成功后,你就可以在GNOME或KDE桌面建立Gaim图标了。
继续安装QQ插件,即键入命令:
gunzip libqq-0.0.3-ft-0.58-gcc296.so.gz (解压缩文件)
cp libqq-0.0.3-ft-0.58-gcc296.so /usr/lib/gaim (复制插件到gaim库目录中)
软件设置
首次启动Gaim 0.85版时,会出现的登录界面。先选择“插件”,在插件对话框中点击“加载”,分别将libmsn.so和libqq-0.0.3-ft-0.58- gcc296.so文件装入,确认后关闭。然后再选择“所有帐号”,在出现的帐号编辑器中继续点击“增加”,当出现的修改帐号页面时,我们就可以输入自己 的QQ或MSN号了,登录名填写QQ号码或MSN邮箱,密码填写对应的QQ或MSN密码,Alias填写自己的昵称,协议选择相应的QQ或MSN,其他的 设置按默认的即可。当全部设置完成后就可以登录使用了。
Fedora core 5中的gaim,缺省对msn就可以支持,加上gaim的qq插件,即可支持qq

2006 查出22端口现在运行什么程序(陈绪)
lsof -i :22

2007 查看本机的IP,gateway,dns(陈绪)
IP:以root用户登录,执行ifconfig。其中eth0是第一块网卡,lo是默认的设备
Gateway:以root用户登录,执行netstat -rn,以0.0.0.0开头的一行的Gateway为默认网关
也可以查看/etc/sysconfig/network文件,里面有指定的地址
DNS:more /etc/resolv.conf,内容指定如下:
nameserver 202.96.69.38
nameserver 202.96.64.38

2008 RH8.0命令行下改变ping 的TTL值(cgweb,lnx)
方法1(重启后有效):
#sysctl -w net.ipv4.ip_default_ttl=N
(N=0~255),若N>255,则ttl=0
方法2(重启后无效):
#echo N(N为0~255) > /proc/sys/net/ipv4/ip_default_ttl

2009 开启LINUX的IP转发(houaq)
编辑/etc/sysctl.conf, 例如,将
net.ipv4.ip_forward = 0
变为
net.ipv4.ip_forward = 1
重启后生效,用sysctl -a查看可知

2010 mount局域网上其他windows机器共享出的目录(陈绪)
mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom

2011 允许|禁止root通过SSH登陆(Fun-FreeBSD)
修改sshd_config:PermitRootLogin no|yes

2012 让root直接telnet登陆(陈绪,platinum)
方法1:
编辑/etc/pam.d/login,去掉
auth required /lib/security/pam_securetty.so 这句话
方法2:
vi /etc/securetty
添加
pts/0
pts/1
...

2013 在linux接adsl设备(wind521)
需要一个运转正常的Linux + 至少一块网卡 + 宽带设备已经申请完毕,同时已经开通。目前市场上大概有几种ADSL设备,他们工作的方式有一些细微的差别。
就是通过虚拟拨号来完成上网的这一过程,也就是利用pppoe设备来进行虚拟拨号的叫作全向猫,就是一种加电后自动的进行拨号的工作,然后留给我们的接口 是RJ45,大连地区一般留给我们的网关都是10.0.0.2,这种设备最容易对付,最后是直接分配给用户一个固定的IP,相对大家来说也比较容易对付
1.第一种需要进行拨号:
这几种设备都是通过eth接口与计算机进行通讯的,所以先将硬件设备的连接作好,尤其是宽带猫的,一定要确认无误(否则一会儿要不去可不算我的事情)
然后启动系统,确认系统上是否安装rp-pppoe这个软件(通过rpm -qa|grep pppoe来查找),如没有安装的用户,在光盘里或是到网上去down一个来,安装上后,以root用户执行adsl-setup,这样就进入了adsl 的资料的设定状态,要求输入申请宽带的用户名以及其他一些信息,确认没有问题,接受直至最后(里面都是E文,但是一看即能懂,比较简单,有关一个防火墙的 设置,我一般都不用,选0,大家可以具体考虑)。
配置完成后,以root用户执行adsl-start,这样将进行adsl的拨号工作,正常就会一下上线,如有什么具体问题,去看一下日志(/var/log/messages)里面告诉你什么了。
停掉adsl,执行adsl-stop就可以了(很简单的)
2.另外两种比较容易对付:
全向猫:只要将你的网卡的IP设置成一个10网段的IP,然后网关指到全向猫的IP,上(10.0.0.2),基本上不有太大的问题
固定IP:就像配置本地的网卡一样,将IP,网关,DNS都按申请来的填写上就可以搞定了

2014 让linux自动同步时间(shunz)
vi /etc/crontab
加上一句:
00 0 1 * * root rdate -s time.nist.gov

2015 linux的网上资源有哪些(陈绪)
国外
http://lwn.net/
http://www.tldp.org/
http://www.yolinux.com/(flying-dance big big pig)
http://www.justlinux.com/
http://www.linuxtoday.com/
http://www.linuxquestions.org/
http://www.fokus.gmd.de/linux/
http://www.linux-tutorial.info/
http://public.www.planetmirror.com/
http://www.freebsdforums.org/forums/
http://www.netfilter.org/documentation/
http://www-106.ibm.com/developerworks/linux/
国内
http://www.linuxmine.com/
http://www.fanqiang.com/
http://www.linuxsir.com/
http://www.chinaunix.net/
http://www.linuxfans.org/(deadcat)
http://www.linuxeden.com/
http://www.linuxforum.net/
http://www.linuxaid.com.cn/
http://freesoft.online.sh.cn/
http://www-900.ibm.com/developerWorks/cn/linux/index.shtml
http://www.neweasier.com/software.html
http://www.blueidea.com/bbs/archivecontent.asp?id=635906(sqh)
http://westlinux.ywzc.net/(onesun)

2016 改变sshd的端口(陈绪)
在/etc/ssh/sshd_config中加入一行:Port 2222,/etc/init.d/sshd restart重启守护进程

2017 改变telnet的端口(陈绪)
将/etc/services文件中telnet对应的端口号21改为你想要的值,/etc/init.d/xinetd restart重启守护进程

2018 终端模式有问题(sakulagi)
export TERM=vt100
2019 模仿超级终端,LINUX里什么程序连接路由器和交换机(alstone)
minicom

2020 ssh上来能不能不自动断线(wind521,双眼皮的猪)
修改自己HOME目录下的.bash_profile文件,加上
export TMOUT=1000000 (以秒为单位)
然后运行source .bash_profile

2021 用什么工具做入侵检测(陈绪)
Snort

2022 Linux下检测程序内存泄漏的工具(陈绪)
cchecker或是efence库都可以

2023 linux下如何监视所有通过本机网卡的数据(陈绪)
tcpdump或者iptraf

2024 为什么root执行好多命令都说command not found(陈绪)
你是telnet上来,然后su成root的吧,改改你的su命令格式,应该是su – root

2025 关闭用户的POP3权限(tiansgx)
把POP3的端口关了就可以了。在文件/etc/services中找到这一行 pop-3 110/tcp 把这一行前加个'#',把它注释掉就可以了

2026 linux下播放flash动画(myxfc)
linux下播放flash动画用这个东西,不会造成浏览器的关闭(其他的插件不好用)
首先下载flash播放动画在linux的插件
http://www.collaborium.org/onsite/jos2000/related/soft/flash_linux.tar.gz
tar zxvf flash_linux.tar.gz
打开包之后,会看到Linux文件夹
在linux文件颊里有两个文件libflashplayer.so 和shockwaveflash.class,把这两个文件拷贝到你的浏览器里的插件里(浏览器不一样,插件的位置可能也不一样)
/usr/lib/mozilla-1.0.1/plugins,就可以了

2027 锁定wu-ftp用户目录(wangla)
编辑ftpaccess文件
restricted-uid *
这一句很重要,限制了ftp用户在自己的目录里

2028 服务器怎么不让telnet(知秋一叶)
服务器上必须启动telnet服务 && 服务器的防火墙优先级应该设为低

2029 防止任何人使用su命令成为root(xiaohu0)
1.vi /etc/pam.d/su
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
2.在/etc/pam.d/su配置文件中定义了wheel组

2030 如何使lynx浏览器能够浏览中文网页(Ghost_Vale)
浏览简体中文网页就的修改如下设置
Save options to disk: [X]
Display and Character Set
Display character set : [Chinese________________________]
Assumed document character set(!): [iso-8859-1______]
CJK mode (!) : [ON_]
然后移到最下面的 Accept Changes 按下 Enter 保存就可以了
当然你的系统要支持简体中文才可以

2031 网卡激活了,却上不了网,怎么办(Slock,双眼皮的猪)
traceroute,看看到底是在那一块被阻住的。
1.ping自己
2.ping网关
3.ping DNS
4.traceroute DNS
如果一切正常
nslookup www.sina.com.cn
ping sina的address
traceroute sina的address
基本上就可以知道结果了

2032配置samba,win2000能访问,win98不能访问(squall2003)
如果是win98,必须要修改注册表:HKEY_LOCAL_MACHINE/system/correntcontrolset/
services/Vxd/VNETSUP下建个Dword值:EnablePlainTextpasswd,键值1

2033 如何得到网卡的MAC地址(陈绪,hutuworm)
arp -a | awk '{print $4}'
ifconfig eth0 | head -1 | awk '{print $5}'

2034 如何得到网卡的IP地址(mb)
ifconfig eth0 |awk '/inet addr/ {split($2,x,":");print x[2]}'

2035 如何修改Linux机器所在的工作组(hutuworm)
vi /etc/samba/smb.conf,修改workgroup = 一行,将组名写在后面

2036 一块网卡如何绑定两个ip(linuxloveu)
#cd /etc/sysconfig/network-scripts
#cp ifcfg-eth0 ifcfg-eth0:1
#vi ifcfg-eth0:1
修改IP和设备名
Debian下一个网卡绑定多个ip的方法(NetDC)
修改/etc/network/interfaces
auto eth0
iface eth0 inet static
address 172.16.3.123
netmask 255.255.255.0
network 172.16.3.0
broadcast 172.16.3.255
gateway 172.16.3.1
auto eth0:1
iface eth0:1 inet static
address 10.16.3.123
netmask 255.255.0.0
network 10.16.0.0
broadcast 10.16.255.255
修改/etc/network/ifstate
lo=lo
eth0=eth0
eth0:1=eth0:1
然后/etc/init.d/networking restart就可以了。
一个网卡绑定多ip另一法(hotbox)
在/etc/sysconfig/network-scripts/下创建一个文件:ifcfg-ethX-rangeX ("X"为网卡号)
文件内容:
IPADDR_START=
IPADDR_END=
CLONENUM=0
可以有256个ip

2037 一个ip如何绑定两块网卡(hutuworm)
假设192.168.0.88是ip,192.168.0.1是网关:
/sbin/modprobe bonding miimon=100 mode=1
/sbin/ifdown eth0
/sbin/ifdown eth1
/sbin/ifconfig bond0 192.168.0.88
/sbin/ifenslave bond0 eth0 eth1
/sbin/route add default gw 192.168.0.1

2038 192.168.1.0/24(双眼皮的猪)
它与192.168.1.0/255.255.255.0是等价的,只是表示方式不同....

2039 linux下清空arp表的命令(NetDC)
#arp -d -a(适用于bsd)
for HOST in `arp | sed '/Address/d' | awk '{ print $1}'` ; do arp -d $HOST; done

2040 使用ntp协议从服务器同步时间(NetDC)
ntpdate NTP-SERVER 例:ntpdate 172.16.2.1

2041 host命令的用法(陈绪)
host能够用来查询域名,它还能得到更多的信息
host -t mx example.com可以查询出example.com的MX记录,以及处理mail的host的名字
host -l example.com会返回所有注册在example.com下的域名
host -a example.com则会显示这个主机的所有域名信息.

2042 立刻让LINUX支持NAT(platinum)
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -I POSTROUTING -j MASQUERADE

2043 rh8.0下rcp的用法设置(zhqh1)
只对root用户生效
1、在双方root用户根目录下建立.rhosts文件,并将双方的hostname加进去,在此之前应在双方的/etc/hosts文件中加入对方的IP和hostname
2、把rsh服务启动起来,redhat默认是不启动的。方法:用执行ntsysv命令,在rsh选项前用空格键选中,确定退出。 然后执行:service xinetd restart即可。
3、到/etc/pam.d/目录下,把rsh文件中的auth required /lib/security/pam_securetty.so一行用“#”封掉即可。

2044 在ethX设备上,使LINUX支持网络广播功能(默认不支持)(platinum)
ip route add 255.255.255.255 dev ethX

2045 路由设置手册(NetDC)
查看路由信息:
netstat -rn
route -n
手工增加一条路由:
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
手工删除一条路由:
route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
好了,下面到了重要的了,让系统启动的时候自动启用路由设置。
在redhat中添加一条路由,修改文件/etc/sysconfig/static-routes
any net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
在debian中添加一条路由,
方法一:修改/etc/network/interfaces
代码:
auto eth0
iface eth0 inet static
address 172.16.3.222
netmask 255.255.0.0
network 172.16.0.0
broadcast 172.16.255.255
gateway 172.16.2.1
up route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
down route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
方法二:在/etc/network/if-up.d目录下建立一个简单的脚本文件,如static-route$(记得以$符号结尾,要不有个run-parts会跑出来告诉你一些东西)脚本最简单的就好啦,如:
代码:
#!/bin/bash
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
嘿嘿,你也可以猜到/etc/network/目录下的其他目录的作用了吧。
发觉在debian中这个route的设置其实只是它的那些配置文件的一个比较简单的应用而已,你完全可以做更复杂的应用

2046 利用ssh复制文件(platinum)
假如A、B都有SSH服务,现在在A的SSH里
1、从A复制B(推过去)
scp -rp /path/filename username@remoteIP:/path
2、从B复制到A(拉过来)
scp -rp username@remoteIP:/path/filename /path
如果其中一个不是LINUX系统,可以在WINDOWS上用SecureFX软件

2047 samba3.0中文显示问题的解决办法(linuxzfp,jiadingjun)
在samba 3.0的配置文件中(/etc/samba/smb.conf)的[global]中加入下面两句:
unix charset=cp936
重启服务
service smb restart

2048 临时修改网卡MAC地址的方法
关闭网卡:/sbin/ifconfig eth0 down
然后改地址:/sbin/ifconfig eth0 hw ether 00:AA:BB:CCD:EE
然后启动网卡:/sbin/ifconfig eth0 up

2049 conntrack 表满的处理方法(cgweb)
前段时间配置的iptables+squid做的proxy server,一直工作正常。今天我上控制台上发现
Jun 18 12:43:36 red-hat kernel: ip_conntrack: table full, dropping packet.
Jun 18 12:49:51 red-hat kernel: ip_conntrack: table full, dropping packet.
Jun 18 12:50:57 red-hat kernel: ip_conntrack: table full, dropping packet.
Jun 18 12:57:38 red-hat kernel: ip_conntrack: table full, dropping packet.
IP_conntrack表示连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip- sysctl函数设置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,那么默认空间是多少?我以redhat为例在内 存为64MB的机器上是4096,内存为128MB是 8192,内存为256MB是16376,那么就能在/proc/sys/net/ipv4/ip_conntrack_max里查看、设置。
例如:增加到81920,可以用以下命令:
echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
那样设置是不会保存的,要重启后保存,可以在/etc/sysctl.conf中加:
net.ipv4.ip_conntract_max =81920
按照此方法改变后一切正常,要是再满了可以加大该值

2050 Linux下怎么使用BT(atz0001)
azureus,http://azureus.sourceforge.net/

2051 Linux下查看光纤网卡的工作模式(sakulagi)
主板上PCI—X插槽中插入一块64位的光纤网卡,在LINUX9.0的环境下,要知道它是否工作在64位模式下,可使用# getconf WORD_BIT

2052 在线更新RHEL的另类途径(hutuworm)
1.安装相应的APT包:
Red Hat EL 2.1 - i386
rpm -ihv http://dag.wieers.com/packages/apt/apt-0.5.15cnc6-3.0.el2.dag.i386.rpm
Red Hat EL 3 - i386
rpm -ihv http://dag.wieers.com/packages/apt/apt-0.5.15cnc6-3.1.el3.dag.i386.rpm
Red Hat EL 3 - x86_64
rpm -ihv http://dag.wieers.com/packages/apt/apt-0.5.15cnc6-3.1.el3.dag.x86_64.rpm
2.在线更新
apt-get update
apt-get upgrade

2053 SOCKS5启动后一段时间停止工作。用命令ps auxw | grep socks5查看,发现有很多SOCKS defunct进程,为什么(陈绪)
主要是打补丁的问题。如果socks5-tar.gz是没打过补丁的版本,必须下一个带补丁的v1.0-r11版本,重新安装、运行问题就可以解决了

2054 在VMware WorkStation 4.0.5中安装Debian 3.0时,提示找不到硬盘,需要SCSI的驱动。但是我用的是IDE硬盘,请问该怎么办(陈绪)
由于VMware将用户划分的硬盘空间虚拟成SCSI硬盘,而Debian安装盘中没有对应的驱动,而安装其它Linux版本时,有的在一开始会加载SCSI驱动,所以没有这个问题。用户可以修改VMware的配置,将其改为模拟IDE硬盘就可以了

2055 如何让Linux网关后面的WIN32下的用户直接点击FTP连接下载(platinum)
modprobe ip_nat_ftp

2056 请问用户的IP是动态的,如何在squid中限定在同一时间内同一账户在线的数量(陈绪)
例如限制单个用户只能打开12个HTTP连接,采用下面的方法:
acl all src 0.0.0.0/0.0.0.0
acl limit maxconn 12
acl localnet src 192.168.0.0/24
http_access deny localnet maxconn
http_access allow localnet
http_access deny all

2057 如果我用Squid代理的代理服务器在192.168.1.0这个网段里,例如它的IP是192.168.1.1,我有一些客户端在192.168.2.0这个网段内,怎样设置才能通过这个代理服务器出去(陈绪)
如果不用透明代理,直接在浏览器的代理选项里设置就可以了。否则首先是在代理服务器的网卡上再挂一个IP为192.168.2.1,添加相应的路由,再修 改Squid的squid.conf文件里的监听地址和端口等,最后在192.168.2.0网段的客户端设置其网关为 192.168.2.1,再直接在浏览器的代理选项里设置一下就可以了

2058 如何使用netrc文件进行自动FTP(陈绪)
在自己的home目录下建立一个权限为600,后缀名为.netrc的文件,内容如下:
machine 172.168.15.1 login admin password admin
这样用户以后每次登录FTP服务器172.168.15.1的时候,系统都会帮用户以用户名admin、密码admin登录。用户利用这个特征可以实现自 动FTP。例如用户想要每天6:00到172.168.15.1机器上面获得/admin目录下的文件admin.txt,可以按如下方法做。
建立一个文件ftp_cmd,内容如下:
cd admin
get amin.txt
bye
然后使用crontab -e设置定时任务:
0 6 * * * ftp 172.168.15.1 < id="wbx81365">
2059 怎样得到ipchains的日志(陈绪)
用户设置规则的时候必须加入-l参数才会在/etc/messages里面做记录。不过建议还是不加的好,不然用户的/etc/messages会变得非常大

2060 如何不显示其它用户的消息(陈绪)
用户可以使用mesg n来禁止别人给自己发送信息,其实就是禁止别人往自己的终端上面的写的权限。当别人试图再使用write给自己发送信息时,发送者将会看见提示如下:
write: user has messages disabled on pts/n

2061 minicom彩色显示(双眼皮的猪)
minicom -s进行serial port配置,然后配置好以后,
minicom -o -c on
-o表示不初始化
-c on表示color on

2062 启用SELinux的Apache的配置文件httpd.conf里面修改DocumentRoot无用或者出现403 Forbidden错误(arbor)
# chcon -u system_u -t httpd_sys_content_t -R website目录

2063 apache2 的log文件位置如何自定义目录(tomi)
编辑httpd.conf里的
ErrorLog /var/log/http/error_log <== 这是管errorlog的 CustomLog /var/log/http/access_log common <== 这是管accesslog的 2064 更改eth0是否混杂模式(wwy) 网卡eth0改成混杂模式: ifconfig eth0 promisc 关闭混杂模式: ifconfig eth0 –promisc 2065 字符界面下的ftp中,下载整个文件夹(陈绪) 1. lftp IP 2. > user username
password
3. > mirror -c --parallel=number remotedir localdir
3a. > help mirror

2066 如何让ssh只允许指定的用户登录(xinyv,好好先生,wolfg,我爱钓鱼)
方法1:在/etc/pam.d/sshd文件中加入
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=fail
然后在/etc下建立sshusers文件,编辑这个文件,加入你允许使用ssh服务的用户名,重新起动sshd服务即可。
方法2:pam规则也可以写成deny的
auth required pam_listfile.so item=user sense=deny file=/etc/sshusers onerr=succeed
方法3:在sshd_config中设置AllowUsers,格式如
AllowUsers a b c
重启sshd服务,则只有a/b/c3个用户可以登陆

2067 在Linux下如何绑定IP地址和硬件地址(陈绪)
可以编辑一个地址对应文件,里面记录了IP地址和硬件地址的对应关系,然后执行“arp –f 地址对应文件”。如果没有指定地址对应文件,则通常情况下一默认文件/etc/ethers为准。地址对应文件的格式如下:
192.168.0.1 00:0D:61:27:58:93
192.168.0.2 00:40:F4:2A:2E:5C
192.168.0.3 00:0A:EB:5E:BA:8E

2068 已知网络中一个机器的硬件地址,如何知道它所对应的IP地址(陈绪)
在Linux下,假定要查“00:0A:EB:27:17:B9”这样一个硬件地址所对应的IP地址,可以使用以下命令:
# cat /proc/net/arp |grep 00:0A:EB:27:17:B9
192.168.2.54 0x1 0x6 00:0A:EB:27:17:B9 *eth2
另外,还可以用“arp -a”命令查询:
# arp –a|grep 00:0A:EB:27:17:B9
(192.168.2.54)at 00:0A:EB:27:17:B9[ether] on eth2

2069 基于Apache的HTTPD或Sendmail服务在启动时被挂起了,如何解决此问题(陈绪)
遇到此类问题,请确认/etc/hosts文件中是否包含如下一行:
127.0.0.1 localhost.localdomain localhost
127.0.0.1 是网络的回路地址

2070 如何使Linux系统对ping不反应(陈绪)
要使Linux对ping没反应,也就是使Linux系统忽略ICMP包。用如下命令可以达到此目的:
# echo 1 > /proc/sys/net/ipv4/icmp-echo-ignore-all
若想恢复,可用如下命令:
# echo 0 > /proc/sys/net/ipv4/icmp-echo-ignore-all

2071 压缩传输文件或目录(FunBSD)
传输到远程:tar czf - www | ssh server "tar zxf -"
压缩到远程:tar czf - www | ssh server "cat > www.tar.gz"
解压到远程:ssh server "tar zxf -" < id="wbx81439"> 解压到本地:ssh server "cat www.tar.gz" | tar zxf -

2072 rsync同步压缩传输文件或目录(FunBSD)
rsync -aze ssh --delete sample_dir/ remote_host:remote_dir/sample_dir/
目录最后的/不能少

2073 无需输入密码使用ssh密钥登录(FunBSD)
ssh-keygen -b 1024 -t rsa
ssh server "mkdir .ssh; chmod 0700 .ssh"
scp ~/.ssh/id_rsa.pub server:~/.ssh/authorized_keys
这样就不在提示密码,直接可以登录server了
对文件复制、同步等操作都比较方便
在ssh_config里加入这两句就更方便了
ForwardAgent yes
StrictHostKeyChecking no

2074 wget下载整个网站(陈绪)
wget -t0 -c -nH -np -b -m -P /localdir http://freesoft.online.sh.cn/mirrors/ftp.redhat.com -o wget.log

2075 命令行下发送带附件的邮件(陈绪)
方法1. uuencode | mail -s "title" mail@address
本地需要作为附件的文件名。
邮件中的附件文件名,可以和不同,其实内容一样。
方法2. cat | mutt -s "title" -a mail@address
邮件正文内容。
本地需要作为附件的文件名。

2076 高效率使用1000兆网卡(陈绪)
系统加载模块时,可以根据实际情况调节参数,使网卡工作在最佳状态。驱动重新提供的可选择参数有速率、工作模式、自适应和流控等
在Linux下,可以定义合法速率参数为0、10、100和1000。却省为0,表示网卡工作在自适应状态下,其他值分别为10Mb、100Mb和1000Mb。
工作模式有全、半双工方式。0表示适应;1表示半双工;2表示全双工。
自适应方式的有效期值范围0~3。0表示不设置流控;1表示仅对Rx流控;2表示仅对Tz流控;3表示对Rx/Tx双向流控。缺省为3

2077 管理SSH监听端口(陈绪)
从安全角度考虑,SSH应当取代Telnet。目前在Linux上使用广泛的SSH服务器软件sshd-config(默认路径是 /etc/ssh/sshd-config)文件中,Port 22是sshd监听的端口,即为连接到主机时需要使用的端口。使用以下代码可以指定sshd监听的接口地址:
ListenAddress 192.168.0.254
这样,就可以避免向未知的用户提供登录服务

2078 不重新编译httpd,增加动态模块(以deflate模块为例)(陈绪)
1 进入httpd源代码目录
cd /usr/local/src/httpd-2.2.6
2 执行httpd安装后目录中的bin/apxs文件
/usr/local/apache2/bin/apxs -cia modules/metadata/mod_deflate.c
3 重新启动httpd
service httpd restart

2079 不重新编译php,增加动态模块(以mbstring模块为例)(陈绪)
1 进入php源代码目录中的mbstring所在目录
cd /usr/local/src/php-5.2.4/ext/mbstring/
2 执行php安装后目录中的bin/phpize文件
/usr/local/php/bin/phpize
3 进入php源代码目录
cd /usr/local/src/php-5.2.4/
4 执行上述目录中的configure文件
./configure --prefix=/usr/local/src/php-5.2.4/ext/mbstring --with-php-config=/usr/local/php/bin/php-config
5 make; make install
将mbstring.so安装到/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/中
6 编辑php.ini,加入一行
extension=mbstring.so
7 重新启动httpd
service httpd restart
3 程序开发篇
3001 linux下调试core文件(陈绪)
gdb
:出错产生core dump的可执行程序。
: core dump的文件名,缺省是“core”

3002 gcc abc.c得到的a.out不能运行(陈绪)
./a.out

3003 c++ 编译时为什么出错信息说cout没定义(陈绪)
include头文件完后加入 using namespace std;

3004 新编译生成的gcc ,使用的标准连接库都在/usr/local/lib 下了,但使用的缺省的连接路径是 /usr/lib 怎样添加?(除了在每次编译时 增加 -L /usr/local/lib 以外)(sakulagi, hutuworm)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
写到~/.bash_profile里面。
增加一种简便办法:
将/usr/local/lib加入/etc/ld.so.conf,然后运行一次ldconfig

3005 RH9下GCC的安装(一起走过的日子,hutuworm)
三种方法选一:
(1)利用CD上rpm安装
CD-1:compat-gcc-7.3-2.96.118.i386.rpm
CD-1:compat-gcc-c++-7.3-2.96.118.i386.rpm
CD-1:libgcc-3.2.2-5.i386.rpm
CD-2:compat-gcc-g77-7.3-2.96.118.i386.rpm
CD-2:compat-gcc-java-7.3-2.96.118.i386.rpm
CD-2:compat-gcc-objc-7.3-2.96.118.i386.rpm
CD-2:gcc-3.2.2-5.i386.rpm
CD-2:gcc-c++-3.2.2-5.i386.rpm
CD-2:gcc-g77-3.2.2-5.i386.rpm
CD-2:gcc-gnat-3.2.2-5.i386.rpm
CD-2:gcc-java-3.2.2-5.i386.rpm
CD-2:gcc-objc-3.2.2-5.i386.rpm
比如碰到系统提示:
warning : gcc-3.2.2-5.i386.rpm : V3 DSA signature :MOKEY key ID db42a60e
error : Failed dependencies :
binutils >=2.13.90.0.18-9 is needed by gcc-3.2.2-5
glibc-devel >=2.3.2-11.9 is needed by gcc-3.2.2-5...
就先安裝glibc-devel包,依此类推
(2)更好的方法就是在X-window下选“主菜单”──>“系统设置”──>“添加/删除应用程序”──>“开发工具”中的gcc并安装它
(3) up2date gcc便可自动解决dependency问题

3006 shell脚本为何无法运行(GOD_Father)
第一,脚本权限要为可执行 #chmod +x test.sh
第二,脚本所在的目录在环境变量PATH中,或者直接执行 #./test.sh

3007 查看某个文件被哪些进程在读写(魏琼)
lsof 文件名

3008 查看某个进程打开了哪些文件(魏琼)
lsof –c 进程名
lsof –p 进程号

3009 lsof是什么意思(魏琼)
list open files

3010 lsof用法小全(魏琼)
lsof abc.txt 显示开启文件abc.txt的进程
lsof -i :22 知道22端口现在运行什么程序
lsof -c nsd 显示nsd进程现在打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i [i] 用以显示符合条件的进程情况
语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4位置
service --> /etc/service中的 service name (可以不止一个)
port --> 端口号(可以不止一个)
例子: TCP:25 - TCP and port 25
@1.2.3.4 - Internet IPv4 host address 1.2.3.4
tcp@ohaha.ks.edu.tw:ftp - TCP protocol host:ohaha.ks.edu.tw service name:ftp
lsof -n 不将IP转换为hostname,预设是不加上-n参数
例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n
lsof -p 12 看进程号为12的进程打开了哪些文件
lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新
-r,lsof会永远不断的执行,直到收到中断讯号
+r,lsof会一直执行,直到没有档案被显示
例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r
lsof -s 列出打开文件的大小,如果没有大小,则留下空白
lsof -u username 以UID,列出打开的文件

3011让某用户只能ftp,不能ssh/telnet (魏琼)
vi /etc/passwd
将用户行中的/bin/bash改为/bin/false即可


4 经典图书篇
4001 GNU/Linux高级网络应用服务指南(陈绪)
linuxaid网站
机械工业出版社
优点:又全又精,全都是实战之作
缺点:针对版本较低,为redhat 6.2

4002 Linux Apache Web Server管理指南(Linux Apache Web Server Administration)(陈绪)
Charles Aulds 马树奇/金燕译
电子工业出版社
定价:46元
优点:目前我还没有发现哪个关于apache的问题这本书没有讲过
缺点:针对1.3.x,最新的针对2.0.*的英文版已出,中文版待出

4003 Linux内核情景分析(陈绪)
毛德操/胡希明
浙江大学出版社
优点:太透彻了,没法不懂
缺点:还是版本问题,内核更新太快了,不过还是必读

4004 Unix环境高级编程(陈绪)
Richard Stevens
机械工业出版社
优点:博大精深
缺点:初学者是很难理解的,否则怎么叫《高级编程》呢

4005 编程精粹--Microsoft编写优质无错c程序秘诀(陈绪)
Steve Maguire
电子工业出版社
优点:不说了,作者是微软的资深工程师
缺点:很难找了,1994年出的

4006 Understanding the Linux Kernel, 3nd Edition(hutuworm,albcamus)
Daniel P. Bovet & Marco Cesati
O'Reilly出版社
优点:读了这本书之后,你就会明白在什么情况下Linux具有最佳的性能,以及它如何面对挑战,在各种环境中提供进程调度、文件访问和内存管理时的优良的 系统响应。作者通过解释其重要性来引入每一个题目,并将内核操作与Unix程序员和用户熟悉的系统调用或实用程序联系起来。一本很全面的Linux内核原 理书。书中以2.6.11为示例版本,着重讲述了
x86平台的Linux内核实现。我觉得看完ULK3就是高手了:) 而且由于书中着重介绍了X86体系结构,也称得上半个x86专家了。

4007 UNIX操作系统教程(英文版)(弱智)
Syed Mansoor Sarwar等
机械工业出版社
优点:浅显易懂,着重unix基础概念和整体理解,顺便复习英语。
另外:机械工业出版社已经出版了中文版,名称为“UNIX 教程”

4008 UNIX编程环境(弱智)
Brian W.Kernighan, Rob Pike 陈向群等译
机械工业出版社
优点:深入浅出地讲解如何使用UNIX及各种工具,简单介绍Unix编程环境;对比“UNIX环境高级编程”,此书适合新手入门

4009 The Art of UNIX Programming(hutuworm)
Eric Steven Raymond
http://catb.org/~esr/writings/taoup/html/
优点:E.S. Raymond的经典著作

4010 unix网络编程--卷一 套接口API和X/Open传输接口API(slg1972)
Richard Stevens
清华大学出版社
优点:详细地讲解unix网络的编程

4011 unix网络编程--卷二 进程间通讯(slg1972)
Richard Stevens
清华大学出版社
优点:详细讲解unix的进程之间,线程之间的关系,及各种不同标准的进程编程的异同

4012 unix网络编程--卷三 应用程序(slg1972,hutuworm)
未出,因为Richard Stevens大师英年早逝,再也不可能完成这计划中的第三卷了。据说其未竟稿可能由Gary R. Wright整理续写出来,但是自大师驾鹤以来一直杳无音信

4013 基于C++ CORBA高级编程(slg1972)
Michi Henning,Steve Vinoski
清华大学出版社
优点:中间件的好书,通向corba应用的必备资料

4014 unix linux网管通鉴(odin_free)
电子版的
优点:我见过关于unix知识最全面、最实用的chm文档,相当于一个小型网站,里面支持全文检索,推荐所有还没有的兄弟姐妹们下载

4015 www.chinaoy.com(aomin5555)
不错,挺全的,图书下载的好网址:
redhat linux9.0 官方入门指南
•redhat linux9.0 官方安装指南
•redhat linux9.0 官方定制设置手册
•redhat linux基础教程
•Linux 参考大全
•清华论坛linux精华
•Linux系统管理员指南中文手册
•Linux网站建设和维护全攻略
•redhat linux8.0 安装手册
•Linux环境database管理员指南

4016 Linux Advanced Routing & Traffic Control(hutuworm)
专门讲LINUX IPROUTE2的书,大概100页左右,www.lartc.org
中文版在:http://www.lartc.org/LARTC-zh_CN.GB2312.pdf

4017 Debian User强烈推荐看的书(NetDC)
Debian Reference (Debian参考手册)
http://qref.sourceforge.net/
简体中文版的pdf文档:
http://qref.sourceforge.net/Debian/reference/reference.zh-cn.pdf

4018 高级Bash脚本编程指南--中文版(hutuworm)
Mendel Cooper著
http://www.linuxpk.com/doc/abs/
优点:Bash编程的圣经,而且该书作者不断在更新其内容,一两个月就会翻新一个版本,值得一读,一读再读

4019 JAVA完美经典(陈绪)
江义华 编著 林彩瑜 文编
中国铁道出版社
定价:65元
优点:不愧是台湾同胞的力作,讲解清楚,知识全面,我看了之后,收获颇丰

4020 Thinking in JAVA(陈绪)
Burce Eckel著
到http://www.BruceEckel.com下载最新版本
优点:经典之作,深入剖析java的核心问题

4021 APACHE2中文手册(陈绪)
Apache官方著
http://www.linuxpk.com/doc/apache/
优点:官方手册,全面深入。

4022 MYSQL中文手册(陈绪)
Mysql官方著
http://www.linuxpk.com/doc/mysql/
优点:官方手册,全面深入。

4023 PHP中文手册(陈绪)
Php官方著
http://www.linuxpk.com/doc/php/
优点:官方手册,全面深入。

4024 VIM中文手册(陈绪)
Vim官方著
http://www.linuxpk.com/doc/vim/
优点:官方手册,全面深入。

4025 Linux 内核设计与实现-第2 版LKD2 (albcamus)
入门推荐,从入门开始,介绍了诸如中断、系统调用、虚拟文件系统、同步与互斥、内存管理、进程控制等方面,内容比较浅显易懂,是入门的好书。
优点: 适合入门 (个人认为,没有比LKD2更优秀的内核入门图书)
缺点: 内容不够深入,覆盖面不广。(对高手来说估计就像休闲材料)

4026 Linux 设备驱动程序-3rd LDD3 (albcamus)
LDD3写的很精彩。但如果要学会写具体的驱动程序,还是得参照硬件的datasheet,读一个内核中现成的驱动程序。
FYI:内核中自带的驱动程序skeleton: drivers/net/pci-skeleton.c和drivers/usb/usb-skeleton.c,分别是为PCI/USB驱动程序员提供的参考代码。

4027 现代体系结构上的Unix 系统 - 内核程序员的SMP 和Caching 技术 (albcamus)
这本书着重讲解各种体系结构上的Unix实现注意事项,e.g. SMP的同步与互斥、Cache一致性问题。
优点: 作者知识面非常广,原理讲得很清楚。
缺点: 94年的书,比较旧

5 mysql相关篇

5001 mysql的数据库存放在什么地方(陈绪)
1. 如果使用rpm包安装,应该在/var/lib/mysql目录下,以数据库名为目录名
2. 如果源码安装在/usr/local/mysql中,应该在/usr/local/mysql/var中,以数据库名为目录名

5002 从mysql中导出和导入数据(陈绪)
导出数据库
mysqldump 数据库名 > 文件名
导入数据库
mysqladmin create 数据库名
mysql 数据库名 < 文件名 5003 忘了mysql的root口令怎么办(陈绪) # service mysql stop # mysqld_safe --skip-grant-tables & # mysqladmin -u user password 'newpassword'' # mysqladmin flush-privileges 5004 快速安装php/mysql(陈绪) 确保使用系统自带的apache,从安装光盘中找出所有以mysql及php-mysql开头的rpm包,然后运行#rpm -ivh mysql*.rpm php-mysql*.rpm; mysql_install_db; service mysql start 5005 修改mysql的root口令(陈绪,yejr) 大致有2种方法: 1、mysql>mysql -uroot -pxxx mysql
mysql>update user set password=password('new_password') where user='user';
mysql>flush privileges;
2、格式:mysqladmin -u用户名 -p旧密码 password 新密码
#mysqladmin -uroot -password ab12
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了

5006 如何使用rpm方式安装mysql(yejr)
首先下载合适的rpm包,例如下载了文件 MySQL-5.0.19-0.i386.rpm
用一下方法安装:
#rpm -ivhU MySQL-5.0.19-0.i386.rpm
通常情况下,安装完这个rpm包后,只具备有mysqld服务功能,其它相关的client程序和开发包还需要另外安装
#rpm -ivhU MySQL-devel-5.0.19-0.i386.rpm
#rpm -ivhU MySQL-client-5.0.19-0.i386.rpm

5007 如何安装已经编译好了的mysql二进制包(yejr)
首先下载合适的二进制包,例如下载了文件 mysql-standard-4.1.13-pc-linux-gnu-i686.tar.gz
#groupadd mysql
#useradd -g mysql mysql
#cd /usr/local
#tar zxf mysql-standard-4.1.13-pc-linux-gnu-i686.tar.gz
#ln -s mysql-standard-4.1.13-pc-linux-gnu-i686 mysql
#cd mysql
#scripts/mysql_install_db --user=mysql
#chgrp -R mysql *
#bin/mysqld_safe --user=mysql &
有什么个性化的配置,可以通过创建 /etc/my.cnf 或者 /usr/local/mysql/data/my.cnf,增加相关的参数来实现

5008 如何自己编译mysql(yejr)
以redhat linux 9.0为例:
下载文件 mysql-4.1.13.tar.gz
#tar zxf mysql-4.1.13.tar.gz
#cd mysql-4.1.13
#./configure --prefix=/usr/local/mysql --enable-assembler \
--with-mysqld-ldflags=-all-static --localstatedir=/usr/local/mysql/data \
--with-unix-socket-path=/tmp/mysql.sock --enable-assembler \
--with-charset=complex --with-low-memory --with-mit-threads
#make
#make install
#groupadd mysql
#useradd -g mysql mysql
#chgrp -R mysql /usr/local/mysql/
#/usr/local/mysql/bin/mysqld_safe --user=mysql &
有什么个性化的配置,可以通过创建 /etc/my.cnf 或者 /usr/local/mysql/data/my.cnf,增加相关的参数来实现

5009 如何登录mysql(yejr)
使用mysql提供的客户端工具登录
#PATH_TO_MYSQL/bin/mysql -uuser -ppassword dateabase

5010 mysqld起来了,却无法登录,提示"/var/lib/mysql/mysql.sock"不存在(yejr)
这种情况大多数是因为你的mysql是使用rpm方式安装的,它会自动寻找 /var/lib/mysql/mysql.sock 这个文件,
通过unix socket登录mysql。
常见解决办法如下:
1、创建/修改文件 /etc/my.cnf,至少增加/修改一行
[mysql]
[client]
socket = /tmp/mysql.sock
#在这里写上你的mysql.sock的正确位置,通常不是在 /tmp/ 下就是在 /var/lib/mysql/ 下
2、指定IP地址,使用tcp方式连接mysql,而不使用本地sock方式
#mysql -h127.0.0.1 -uuser -ppassword
3、为 mysql.sock 加个连接,比如说实际的mysql.sock在 /tmp/ 下,则
# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock即可

5011 如何新增一个mysql用户(yejr)
格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码"
例1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL,然后键入以下命令:
mysql>grant select,insert,update,delete on *.* to test1@"%" Identified by "abc";
但例1增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见例2。
例2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作 (localhost指本地主机,即MYSQL数据库所在的那台主机),这样用户即使用知道test2的密码,他也无法从internet上直接访问数据 库,只能通过MYSQL主机上的web页来访问了。
mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";
如果你不想test2有密码,可以再打一个命令将密码消掉。
mysql>grant select,insert,update,delete on mydb.* to test2@localhost identified by "";
另外,也可以通过直接往user表中插入新纪录的方式来实现

5012 如何查看mysql有什么数据库(yejr)
mysql>show databases;

5013 如何查看数据库下有什么表(yejr)
mysql>show tables;

5014 导出数据的几种常用方法(yejr)
1、使用mysqldump
#mysqldump -uuser -ppassword -B database --tables table1 --tables table2 > dump_data_20051206.sql
详细的参数
2、backup to语法
mysql>BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory';
详细请查看mysql手册
3、mysqlhotcopy
#mysqlhotcopy db_name [/path/to/new_directory]

#mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory

#mysqlhotcopy db_name./regex/
详细请查看mysql手册
4、select into outfile
详细请查看mysql手册
5、客户端命令行
#mysql -uuser -ppassword -e "sql statements" database > result.txt
以上各种方法中,以mysqldump最常用

5015 如何在命令行上执行sql语句(yejr)
#mysql -uuser -ppassword -e "sql statements" database

5016 导入备份出来文件的常见方法(yejr)
1、由mysqldump出来的文件
#mysql -uuser -ppassword [database] < id="wbx81868"> 2、文件类型同上,使用source语法
mysql>source /path_to_file/dump.sql;
3、按照一定格式存储的文本文件或csv等文件
#mysqlimport [options] database file1 [file2....]
详细请查看mysql手册
4、文件类型同上,也可以使用load data语法导入
详细请查看mysql手册

5017 让mysql以大内存方式启动(陈绪)
将/usr/share/mysql下的某个mysql-*.cnf(如1G内存时为mysql-huge.cnf)拷贝为/etc/mysql.cnf文件,并重启mysql

6 开源网址篇

6001 Intel的几个Linux开源社区网址(陈绪)
1. www.lesswatts.org 节能的
2. www.moblin.org 移动设备的
本文来自:http://doc.linuxpk.com/1.html

阅读全文

Linux shell I/O(输入/输出)重定向详解

Linux中的I/O(输入/输出)重定向功能非常强大,正确理解与认识I/O重定向将会对Shell的使用及Shell程序的编写非常有帮助,下面的内容对Linux的I/O重定向做了详细的解绍。

I/O重定向详解及应用实例

1、 基本概念(这是理解后面的知识的前提,请务必理解)
a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;
c、 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进; d、 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;
e、 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;
f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;
g、 管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;
h、 tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;
i、 bash(ksh)执行命令的过程:分析命令-变量求值-命令替代(``和$( ))-重定向-通配符展开-确定路径-执行命令;
j、 ( ) 将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。
k、 exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。


2、 基本IO
cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> fiel 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加)
cmd <>file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
cat <>file 以读写的方式打开 file
cmd < id="hmin27">cmd << id="hmin28">

3、 进阶IO
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n <&- 关闭标准输入(键盘) >&- 关闭标准输出
n<&- 表示将 n 号输入关闭 n>&- 表示将 n 号输出关闭
上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:
... 2>file 运行一个命令并把错误输出(文件描述符 2)定向到 file。
... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)
我 们对 2>&1详细说明一下 :2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的!
但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。

exec 0
exec 1>outfilename # 打开文件outfilename作为stdout
exec 2>errfilename # 打开文件 errfilename作为 stderr
exec 0<&- # 关闭 FD0 exec 1>&- # 关闭 FD1
exec 5>&- # 关闭 FD5

问:
如果关闭了 FD0、FD1、FD2,其后果是什么?
恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别?代码分别是什么?
打开了FD3~FD9,我们用完之后,你觉得是将他们关闭还是恢复?



下面是提示(例子来源于CU一帖子,忘记出处,来日再补上):
exec 6>&2 2>ver
command >>dev/null &
exec 2>&6 # 恢复 FD2


4、 简单举例(其中 you 这个文件是存在的,no和yes这两个文件不存在)
a、stdout和stderr都通过管道送给egrep了:
(ls you no 2>&1;ls yes 2>&1) 2>&1|egrep \* >file
(ls you no 2>&1;ls yes 2>&1)|egrep \* >file
(ls you no;ls yes) 2>&1|egrep \* >file
###
这个例子要注意的就是:
理解 命令执行顺序 和 管道“|”:在命令执行前,先要进行重定向的处理,并将把 nested sub-shell 的stdout 接到 egrep 命令的 stdin。
nested sub-shell ,在 ( ) 中的两个命令加上(),可以看作一个命令。其 FD1 已经连接到“|”往egrep送了,当遇到 2>&1时,也就是FD2=FD1,即FD2同FD1一样,往管道 “|”那边送。
###

b、没有任何东西通过管道送给egrep,全部送往monitor。
(ls you no 2>&1;ls yes 2>&1) >&2|egrep \* >file
虽然在()里面将 FD2转往FD1,但在()外,遇到 >&2 ,结果所有的都送到monitor。
请理解:
(ls you no 2>&1) 1>&2|egrep \* >file ## 送到 monitor
ls you no 2>&1 1>&2|egrep \* >file ## 送给 管道 “|”
ls you no 1>&2 2>&1|egrep \* >file ## 送到 monitor


5、 中阶例子(其中 you 这个文件是存在的,no和yes这两个文件不存在)
r2007兄的:http://bbs.chinaunix.net/forum/viewtopic.php?t=221848&show_type=new&sid=cf30398c911e0d2b16313c6922123f67
条件:
stderr通过管道送给egrep,正确消息仍然送给monitor(不变)
exec 4>&1;(ls you no 2>&1 1>&4 4>&-;ls yes 2>&1 1>&4 4>&-)|egrep \* >file;exec 4>&-
或者
exec 4>&1;(ls you no;ls yes) 2>&1 1>&4 4>&-|egrep \* >file;exec 4>&-

r2007 兄在其贴已有详细说明,我就不在说明了。
如果加两个条件:
(1)要求cmd1和cmd2并行运行;
(2)将cmd1的返回值赋给变量 ss。
则为:
exec 3>&1;exec 4>&1
ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
exec 3>&-;exec 4>&-

说明:
exec 3>&1;4>&1
### 建立FD3,是用来将下面ls那条语句(子shell)中的FD1 恢复到正常FD1,即输出到monitor,你可以把FD3看作最初始的FD1的硬盘备份(即输出到monitor);
### 建立FD4,到时用作保存ls的返回值(echo $?),你可以将FD4看作你考试时用于存放计算“echo $?”的草稿纸;

(ls you no 2>&1 1>&3 3>&-;echo $? >&4)
### 大家还记得前面说的子shell和管道吧。这条命令首先会继承FD0、FD1、FD2、FD3、FD4,它位于管道前,所以在运行命令前会先把子shell自己的FD1和管道“|”相连。
但是我们的条件是stderr通过管道送往egrep,stdout仍然输出到monitor。
于是通过2>&1,先把 子shell的FD1 的管道“送给”FD2,于是子shell中的stderr送往管道“|”;
再通过 1>&3,把以前的“硬盘备份”恢复给子shell的FD1,于是子shell中的FD1变成送到monitor了。
再通过3>&- ,将3关闭;
接着运行echo $? ,本来其输出值应该送往管道的,通过 >&4 ,将 输出 送往 “草稿纸”FD4,留以备用。

((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file)
于是,stderr 通过管道送给 egrep ,stdout 送给monitor,但是,还有 FD4,它送到哪去了?
$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
最后的 4>&1 ,就是把FD4 重定向到 FD1。但由于其输出在 $( )中,其值就赋给变量ss了。

最后一行关闭 FD3、FD4。


6、 高阶例子
lightspeed 版主大大的:Shell 经典问题之 [ I/O 重定向] (http://bbs.chinaunix.net/forum/viewtopic.php?t=452079&show_type=new)
[Q] 对于命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能:
1. 所有命令并行执行
2. cmd1 和 cmd2 不需要 stdin
3. cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin
4. cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin
5. cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕
6. cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕
7. cmd1 的返回码赋给变量 s
8. 不能利用临时文件

解决方法:
exec 3>&1; exec 4>&1
s=$(((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 4>&1)
exec 3>&-; exec 4>&-

这个我一步步解释(好复杂,自己感觉看明白了,过一会再看,大脑仍然有几分钟空白~~~,没想到我也能看明白):
exec 3>&1; exec 4>&1
### 前面的例子都有说明了,就是建立FD3 ,给cmd1恢复其FD1用和给cmd3 恢复其FD2用
### 建立FD4,保存“echo $?”输出值的“草稿纸”

第一对括号:(cmd1 1>&3 ; echo $? >&4 ) 和其后(第一个)管道
## 在第一个括号(子shell)中,其FD1已经连到 管道中了,所以用 FD3 将 FD1恢复正常,不让他往管道跑;
## 这里的cmd1没有stdin,接着将 cmd1 运行的返回码 保存到 FD4 中;

第二对括号:((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 和其后(第二个)管道
## 前面的 FD1 已经不送给 cmd2了,FD2 默认也不送过来,所以cmd2 也没有stdin ,所以在第二对括号里面:cmd1和cmd2 的stdout、stderr 为默认输出,一直遇到 “3>&1”为止。
## 请注意:“3>&1”,先将第二对括号看出一个命令,他们遇到 第二个管道时,其FD1 连到 管道 “|”,由于“3>&1”的作用,子shell的FD1 送给FD3 使用,所以所有FD3 的输出都 “流往”cmd3,又由于继承关系(继承第一行的命令),FD3实际上就是cmd1和cmd2的stdout,于是“ cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin”

第三对括号:(((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 和其后的第三个管道
## cmd1 和 cmd2 的 stdout 已经定向到 cmd3 的 stdin,处理之后,cmd3 >a 意味着将其 stdout 送给 a 文件。而2>&3的意思是:恢复cmd3的错误输出为FD3,即送往 monitor。于是“cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕”。如果没有“2>&3”,那么cmd3的错误输出就会干扰cmd1和cmd2的错误输出,所以它是必须的!

## 请注意第三对括号后的 “2>&1”| ,其子shell的FD1 本来连接着管道“|”,但子shell FD1 慷慨大方,送给了 FD2,于是FD2 连接着管道。还记得前面的 cmd1 和 cmd2 吗?他们的stderr一直没动了。于是在这里,通过管道送给了 第四个命令cmd4 了。即“cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin”
## 后面就比较简单了。cmd4 >b 表示“cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕(默认)”

第 四对括号:((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 与其后的 4>&1
## 四对括号里面的 FD1、FD2都处理完了。但是还记得前面“echo $? >&4”那块“草稿纸”吗?“4>&1”的作用就是“将草稿纸上的内容送给monitor”,但是由于最外面还有 $() 将其“包着”。于是其值赋给变量“s”。

++++++++++++++++++++++++++++++++++++++++++++
我尝试回答下面的问题。如有错误,还请各位前辈指正!


7、 在一个交互式的(Interactive) shell 中, 用 exec 进行 I/O 重定向.
1). Stdin, stderr 可以定向到文件中吗? 有什么结果?
a、 在交互式shell中,可以将stdin定向到文件。执行:exec 0
结果为:in 文件中每一行均会被自动执行,并且在最后会再加执行一个 exit 命令,导致退出(或退回到正常shell下)。
如 in 文件内容:$ more in
date
read lsp
echo hahha
echo "this is $lsp"

在提示符下执行命令:$ exec 0
$ date
Tue Jan 18 18:29:07 HKT 2005
$ read lsp # 其下面本应有的那句“ echo hahha ”的 “hahaha” 已经被读入到变量 lsp 中了
$ echo "this is $lsp"
this is echo hahha
$ exit

b、 在交互式shell中,可以将stderr定向到文件。执行:exec 2>err
结果为:命令提示符PS被屏蔽,输入的命令也被屏蔽。但是命令执行的结果,如果是stdout 则会回显到屏幕上,如果是 stderr 则不会回显到屏幕上。其中,命令提示符、命令、stderr均会保存到文件 err 中。如:
$ exec 2>err
err in out # 执行 ls 命令
Tue Jan 18 18:55:58 HKT 2005 # 执行 date 命令,而后执行了“ ls nofile”,nofile这个文件不存在
$ # 执行 exit 命令

现在让我们查看 err文件:
$ more err
[lsp@ii lsp]$ ls
[lsp@ii lsp]$ date
[lsp@ii lsp]$ ls nofile
ls: nofile: No such file or directory
[lsp@ii lsp]$ exit
exit

c、 在交互式shell中,可以将stdout定向到文件。这个使我们常用到的。就不说了。就是将错误的输出内容定向到文件中。正确的输出内容并不受影响。

2). Stdin, Stderr 可以关闭吗? 有什么结果?
在交互式shell中,如果关闭stdin,如:exec 0<&- ,其结果是退出(或退回到正常shell下)。 在交互式shell中,如果关闭stderr,如:exec 2>&- ,状态同stderr定向到文件,唯一不同的是没有保存下来。
在 交互式shell中,如果关闭stdoutr,如:exec 1>&- ,只要执行有stdout或stderr内容送往 monitor 的命令,如ls、date这类命令,均会报错:“ls: write error: Bad file descriptor”。其他如cd、mkdir、……这类命令不受影响。

3). 如果 stdin, stdout, stderr 进行了重定向或关闭, 但没有保存原来的 FD, 可以将其恢复到 default 状态吗?
*** 如果关闭了stdin,因为会导致退出,那肯定不能恢复。
*** 如果重定向或关闭 stdout和stderr其中之一,可以恢复,因为他们默认均是送往monitor(但不知会否有其他影响)。如恢复重定向或关闭的stdout: exec 1>&2 ,恢复重定向或关闭的stderr:exec 2>&1。
*** 如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1>/dev/tty 恢复。

+++++++++++++++++++
下面参考了 r2007 兄的回复!谨以致谢!
+++++++++++++++++++

8、 cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
我想:他们的不同点在于:
cmd >a 2>a 相当于使用了两个互相竞争使用文件a的管道;
而cmd >a 2>&1 只使用了一个管道,但在其源头已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率应该更高!

FD: File Descriptor



阅读全文

2008年7月28日

大教堂与市集

Eric Raymond
HansB翻译
一. 大教堂和市集


  Linux的影响是非常巨大的。甚至在5年以前,有谁能够想象一个世界级的操作系统能够仅仅用细细的Internet连接起来的散布在全球的几千个开发人员有以业余时间来创造呢?

  我当然不会这么想。在1993年早期我开始注意Linux时,我已经参与Unix和自由软件开发达十年之久了。我是八十年代中期GNU最早的几个参与 者之一。我已经在网上发布了大量的自由软件,开发和协助开发了几个至今仍在广泛使用的程序(Nethack,Emacs VC和GND模式,xlife等等)。我想我知道该怎样做。



  Linux推翻了许多我认为自己明白的事情。我已经宣扬小工具、快速原型和演进式开发的Unix福音多年了。但是我也相信某些重要的复杂的事情需要更 集中化的,严密的方法。我相信多数重要的软件(操作系统和象Emacs一样的真正大型的工具)需要向建造大教堂一样来开发,需要一群于世隔绝的奇才的细心 工作,在成功之前没有beta版的发布。
Linus Torvalds的开发风格(尽早尽多的发布,委托所有可以委托的事,对所有的改动和融合开放)令人惊奇的降临了。这里没有安静的、虔诚的大教堂的建造工 作——相反,Linux团体看起来像一个巨大的有各种不同议程和方法的乱哄哄的集市(Linux归档站点接受任何人的建议和作品,并聪明的加以管理),一 个一致而稳定的系统就象奇迹一般从这个集市中产生了。


  这种设计风格确实能工作,并且工作得很好,这个事实确实是一个冲击。在我的研究过程中,我不仅在单个工程中努力工作,而且试图理解为什么Linux世界不仅没有在一片混乱中分崩离析,反而以大教堂建造者们不可想象的速度变得越来越强大。


  到了1996年中,我想我开始理解了。我有一个极好的测试我的理论的机会,以一个自由软件计划的形式,我有意识的是用了市集风格。我这样做了,并取得了很大的成功。


  在本文的余下部分,我将讲述这个计划的故事,我用它来明确一些自由软件高效开发的格言。并不是所有这些都是从Linux世界中学到的,但我们将看到 Linux世界给予了它们一个什么样的位置。如果我是正确的,它们将使你理解是什么使Linux团体成为好软件的源泉,帮助你变得更加高效。


二. 邮件必须得通过


  1993年以前我在一个小的免费访问的名为Chester County InterLink的ISP的做技术工作,它位于Pennsylvania的West Chester。(我协助建立了CCIL,并写了我们独特的多用户BBS系统——你可以telnet到locke.ccil.org来检测一下。今天它在 十九条线上支持三千的用户)。这个工作使我可以一天二十四小时通过CCIL的56K专线连在网上,实际上,它要求我怎么做!


  所以,我对Internet email很熟悉。因为复杂的原因,很难在我家里的机器(snark.thyrsus.com)和CCIL之间用SLIP工作。最后我终于成功了,但我发 现不得不时常telnet到locke来检查我的邮件,这真是太烦了。我所需要的是我的邮件发送到snark,这样biff(1)会在它到达时通知我。


  简单地sendmail的转送功能是不够的,因为snark并不是总在网上而且没有一个静态地址。我需要一个程序通过我的SLIP连接把我的本地发送的邮件拉过来。我知道这种东西是存在的,它们大多使用一个简单的协议POP(Post Office Protocol)。而且,locke的BSD/OS操作系统已经自带了一个POP3服务器。


  我需要一个POP3客户。所以我到网上去找到了一个。实际上,我发现了三、四个。我用了一会pop-perl,但它却少一个明显的特征:抽取收到的邮件的地址以便正确回复。


  问题是这样的:假设locke上一个叫“joe”的人向我发了一封邮件。如果我把它取到snark上准备回复时,我的邮件程序会很高兴地把它发送给一个不存在的snark上的“joe”。手工的在地址上加上“@ccil.org”变成了一个严酷的痛苦。


  这显然应是计算机替我做的事。(实际上,依据RFC1123的5.2.18节,sendmail应该做这件事)。但是没有一个现存的POP客户知道怎样做!于是这就给我们上了第一课:

  1.每个好的软件工作都开始于搔到了开发者本人的痒处。

  也许这应该是显而易见的(“需要是发明之母”长久以来就被证明是正确的),但是软件开发人员常常把他们的精力放在它们既不需要也不喜欢的程序,但在Linux世界中却不是这样——这解释了为什么从Linux团体中产生的软件质量都如此之高。


  那么,我是否立即投入疯狂的工作中,要编出一个新的POP3客户与现存的那些竞争呢?才不是哪!我仔细考察了手头上的POP工具,问自己“那一个最接近我的需要?”因为:
  2.好程序员知道该写什么,伟大的程序员知道该重写(和重用)什么。


  我并没有声称自己是一个伟大的程序员,可是我试着效仿他们。伟大程序员的一个重要特点是建设性的懒惰。他们知道你是因为成绩而不是努力得到奖赏,而且从一个好的实际的解决方案开始总是要比从头干起容易。


  例如,Linux并不是从头开始写Linux的。相反的它从重用Minix(一个386机型上的类似Unix的微型操作系统)的代码和思想入手。最后所有的Minix代码都消失或被彻底的重写了,但是当它们在的时候它为最终成为Linux的雏形做了铺垫。


  秉承同样的精神,我去寻找良好编码的现成的POP工具,用来作为基础。


  Unix世界中的代码共享传统一直对代码重用很友好(这正是为什么GNU计划不管Unix本身有多么保守而选取它作为基础操作系统的原因)。 Linux世界把这个传统推向技术极限:它有几个T字节的源代码可以用。所以在Linux世界中花时间寻找其他几乎足够好的东西,会比在别处带来更好的结 果。


  这也适合我。加上我先前发现的,第二次寻找找到了9个候选者——fetchPOP,PopTart,get-mail,gwpop,pimp,pop-perl,popc,popmail 和 upop)。我首先选定的是“fetchpop”。我加入了头标重写功能,并且做了一些被作者加入他的1.9版中的改进。


  但是几个星期之后,我偶然发现了Carl Harris写的“popclient”的代码,然后发现有个问题,虽然fetchpop有一些好的原始思想(比如它的守护进程模式),它只能处理 pop3,而且编码的水平相当业余(Seung-Hong是个很聪明但是经验不足的程序员),Carl的代码更好一些,相当专业和稳固,但他的程序缺少几 个重要的相当容易实现的fetchpop的特征(包括我自己写的那些)。


  继续呢还是换一个? 如果换一个的话,作为得到一个更好开发基础的代价,我就要扔掉我已经有的那些代码。


  换一个的一个实际的动机是支持多协议,pop3是用的最广的邮局协议,但并非唯一一个,Fetchpop和其余几个没有实现POP2.RPOP,或者APOP,而且我还有一个为了兴趣加入IMAP(Internet Message Access Protocol,最近设计的最强大的邮局协议)的模糊想法。


  但是我有一个更加理论化的原因认为换一下会是一个好主意,这是我在Linux很久以前学到的:

  3.“计划好抛弃,无论如何,你会的”(Fred Brooks,《神秘的人月》第11章)


  或者换句话说,你常常在第一次实现一个解决方案之后才能理解问题所在,第二次你也许才足够清楚怎样做好它,因此如果你想做好,准备好推翻重来至少一次。


  好吧(我告诉自己),对fetchpop的尝试是我第一次的尝试,因此我换了一下。


  当我在1996年6月25日把我第一套popclient的补丁程序寄给Carl Harris之后,我发现一段时间以前他已经对popclient基本上失去了兴趣,这些代码有些陈旧,有一些次要的错误,我有许多修改要做,我们很快达 成一致,我来接手这个程序。不知不觉的,这个计划扩大了,再也不是我原先打算的在已有的pop客户上加几个次要的补丁而已了,我得维护整个的工程,而且我 脑袋里涌动着一些念头要引起一个大的变化。


  在一个鼓励代码共享的软件文化里,这是一个工程进化的自然道路,我要指出:

  4. 如果你有正确的态度,有趣的问题会找上你的,但是Carl Harris的态度甚至更加重要,他理解:

  5.当你对一个程序失去兴趣时,你最后的责任就是把它传给一个能干的后继者。


  甚至没有商量,Carl和我知道我们有一个共同目标就是找到最好的解决方案,对我们来说唯一的问题是我能否证明我有一双坚强的手,他优雅而快速的写出了程序,我希望轮到我时我也能做到。

三. 拥有用户的重要性


  于是我继承了popclient,同样重要的是,我继承了popclient的用户基础,用户是你所拥有的极好的东西,不仅仅是因为他们显示了你正在满足需要,你做了正确的事情,如果加以适当的培养,他们可以成为合作开发者。


  Unix传统另一有力之处是许多用户都是黑客,因为源优码是公开的,他们可以成为高效的黑客,这一点在Linux世界中也被推向了令人高兴的极致,这 对缩短调试时间是极端重要的,在一点鼓励之下,你的用户会诊断问题,提出修订建议,帮你以远比你期望快得多的速度的改进代码。


  6. 把用户当做协作开发者是快速改进代码和高效调试的无可争辩的方式。


  这种效果的力量很容易被低估,实际上,几乎所有我们自由软件世界中的人都强烈低估了用户可以多么有效地对付系统复杂性,直到Linus让我们看到了这一点。


  实际上,我认为Linus最聪明最了不起的工作不是创建了Linux内核本身,而是发明了Linux开发模式,当我有一次当着他的面表达这种观点时, 他微笑了一下,重复了一句他经常说的话:“我基本上是一个懒惰的人,依靠他人的工作来获取成绩。”象狐狸一样懒惰,或者如Robert Heinlein所说,太懒了而不会失败。


  回顾起来,在GNU Emacs Lisp库和Lisp代码集中可以看到Linux方法的成功,与Emacs的C内核和许多其他FSF的工具相比,Lisp代码库的演化是流动性的和用户驱 动的,思想和原型在达到最终的稳定形式之前往往要重写三或四次,而且经常利用Internet的松散合作。


  实际上,我自己在fetchmail之前最成功的作品要算Emacs VC模式,它是三个其他的人通过电子邮件进行的类似Linux的合作,至今我只见过其中一个人(Richard Stallman),它是SCCS、RCS和后来的CVS的前端,为Emacs提供“one-touch”版本控制操作,它是从一个微型的、粗糙的别人写好的sccs.el模式开始演化的,VC开发的成功不像Emacs本身,而是因为Emacs Lisp代码可以很快的通过发布/测试/改进的过程。


  (FSF的试图把代码放入GPL之下的策略有一个未曾预料到的副作用,它让FSF难以采取市集模式,因为他们认为每个想贡献二十行以上代码的人都必须 得到一个授权,以使受到GPL的代码免受版权法的侵扰,具有BSD和MITX协会的授权的用户不会有这个问题,因为他们并不试图保留那些会使人可能受到质 询的权力)。


四. 早发布、常发布


  尽量早尽量频繁的发布是Linux开发模式的一个重要部分,多数开发人员(包括我)过去都相信这对大型工程来说是个不好的策略,因为早期版本都是些充满错误的版本,而你不想耗光用户的耐心。

  这种信仰强化了建造大教堂开发方式的必要性,如果目标是让用户尽可能少的见到错误,那你怎能不会仅仅每六个月发布一次(或更不经常),而且在发布之间象一只狗一样辛勤“捉虫”呢? Emacs C内核就是以这种方式开发的,Lisp库,实际上却相反,因为有一些有FSF控制之外的Lisp库,在那里你可以独立于Emacs发布周期地找寻新的和开发代码版本。


  这其中最重要的是Ohio州的elisp库,预示了今天的巨大的Linux库的许多特征的精神,但是我们很少真正仔细考虑我们在做什么,或者这个库的 存在指出了FSF建造教堂式开发模式的什么问题,1992年我曾经做了一次严肃的尝试,想把Ohio的大量代码正式合并到Emacs的官方Lisp库中, 结果我陷入了政治斗争中,彻底失败了。


  但是一年之后,在Linux广泛应用之后,很清楚,一些不同的更加健康的东西诞生了,Linus的开发模式正好与建造教堂方式相反,Sunsite和tsx-11的库开始成长,推动了许多发布。所有这些都是闻所未闻的频繁的内核系统的发布所推动的。


  Linus以所有实际可能的方式把它的用户作为协作开发人员。


  7. 早发布、常发布、听取客户的建议

  Linus的创新并不是这个(这在Unix世界中是一个长期传统),而是把它扩展到和他所开发的东西的复杂程度相匹配的地步,在早期一天一次发布对他 来说都不是罕见的!而且因为他培育了他的协作开发者基础,比其他任何人更努力地充分利用了Internet进行合作,所以这确实能行。


  但是它是怎样进行的呢?它是我能模仿的吗?还是这依赖于Linus的独特天才?


  我不这样想,我承认Linus是一个极好的黑客(我们有多少人能够做出一个完整的高质量的操作系统内核?),但是Linux并不是一个令人敬畏的概念 上的飞跃,Linus不是(至少还不曾是)象Richard stallman或James Gosling一样的创新天才,在我看来,Linus更象一个工程天才,具有避免错误和开发失败的第六感觉,掌握了发现从A点到B点代价最小的路径的决 窍,确实,Linux的整个设计受益于这个特质,并反映出Linus的本质上保守和简化设计的方法。


  如果快速的发布和充分利用Internet不是偶然而是Linus的对代价最小的路径的洞察力的工程天才的内在部分,那么他极大增强了什么?他创建了什么样的方法?


  问题回答了它自己,Linus保持他的黑客用户经常受到激励和奖赏:被行动的自我满足的希望所激励,而奖赏则是经常(甚至每天)都看到工作在进步。


  Linus直接瞄准了争取最多的投入调试和开发的人时,甚至冒代码不稳定和一旦有非常棘手的错误而失去用户基础的险,Linus似乎相信下面这个:

  8. 如果有一个足够大的beta测试人员和协作开发人员的基础,几乎所有的问题都可以被快速的找出并被一些人纠正。


  或者更不正式的讲:“如果有足够多的眼睛,所有的错误都是浅显的”(群众的眼睛是雪亮的),我把这称为“Linus定律”。


  我最初的表述是每个问题“对某些人是透明的”,Linus反对说,理解和修订问题的那个人不一定非是甚至往往不是首先发现它的人,“某个人发现了问题”,他说,“另一个理解它,我认为发现它是个更大的挑战”,但是要点是所有事都趋向于迅速发生。


  我认为这是建造教堂和集市模式的核心区别,在建造教堂模式的编程模式看来,错误和编程问题是狡猾的、阴险的、隐藏很深的现象,花费几个月的仔细检查, 也不能给你多大确保把它们都挑出来的信心,因此很长的发布周期,和在长期等待之后并没有得到完美的版本发布所引起的失望都是不可避免的。


  以市集模式观点来看,在另一方面,我们认为错误是浅显的现象,或者至少当暴露给上千个热切的协作开发人员,让他们来对每个新发布进行测试的时候,它们 很快变得浅显了,所以我们经常发布来获得更多的更正,作为一个有益的副作用,如果你偶尔做了一个笨拙的修改,也不会损失太多。也许我们本不应该这样的惊 奇,社会学家在几年前已经发现一群相同专业的(或相同无知的)观察者的平均观点比在其中随机挑选一个来得更加可靠,他们称此为“Delhpi效应 ”,Linus所显示的证明在调试一个操作系统时它也适用——Delphi效应甚至可以战胜操作系统内核一级的复杂度。


  我受Jeff Dutky (dutky @ wam.umd.edu)的启发指出Linus定律可以重新表述为“调试可以并行”,Jeff观察到虽然调试工作需要调试人员和对应的开发人员相交流,但 它不需要在调试人员之间进行大量的协调,于是它就没有陷入开发时遇到的平方复杂度和管理开销。

  在实际中,由于重复劳动而导致的理论上的丧失效率的现象在Linux世界中并不是一个大问题,“早发布、常发布策略”的一个效果就是利用快速的传播反馈修订来使重复劳动达到最小。


  Brooks甚至做了一个与Jeff相关的更精确的观察:“维护一个广泛使用的程序的成本一般是其开发成本的40%,奇怪的是这个成本受到用户个数的强烈影响,更多的用户发现更多的错误”(我的强调)。

  更多的用户发现更多的错误是因为更多的用户提供了更多测试程序的方法,当用户是协作开发人员时这个效果被放大了,每个找寻错误的人都有自己稍微不同的 感觉和分析工具,从不同角度来看待问题。“Delphi效应”似乎因为这个变体工作变得更加精确,在调试的情况下,这个变体同时减小了重复劳动。


  所以加入更多的beta测试人员虽不能从开发人员的P.O.V中减小“最深”的错误的复杂度,但是它增加了这样一种可能性,即某个人的工具和问题正好匹配,而这个错误对这个人来说是浅显的。


  Linus也做了一些改进,如果有一些严重的错误,Linux内核的版本在编号上做了些处理,让用户可以自己选择是运行上一个“稳定”的版本,还是冒 遇到错误的险而得到新特征,这个战略还没被大多数Linux黑客所仿效,但它应该被仿效,存在两个选择的事实让二者都很吸引 人。

  
五. 什么时候玫瑰不是玫瑰?


  在研究了Linus的行为和形成了为什么它成功的理论之后,我决定在我的工程(显然没有那么复杂和雄心勃勃)里有意识的测试这个理论。
但我首先做的事是熟悉和简化Popclient。 Carl Harris的实现非常好,但是有一种对许多C程序来说没有必要的复杂性。他把代码当作核心而把数据结构当作对代码的支持,结果是代码非常漂亮但是数据结 构设计得很特别,相当丑陋(至少对以这个老LISP黑客的标准来看),然而除了提高代码和数据结构设计之外,重写它还有一个目的,就是要把它演化为我彻底 理解的东西,对修改你不理解的程序中的错误负责可不是一件有趣的事。


  第一个月我只是在领会Carl's的基本设计的含义,我所做的第一个重大修改是加入了IMAP支持,我把协议机重新组织为一个通用驱动程序和三个方法 表(对应POP2、POP3和IMAP),这个前面的修改指出一个需要程序员(特别是象C这种没有自然的动态类型支持的语言)记在脑中的一般原理:


  9. 聪明的数据结构和笨拙的代码要比相反的搭配工作的更好


  Fred Brooks也在他第11章中讲道:“让我看你的[代码],把你的[数据结构]隐藏起来,我还是会迷惑;让我看看你的[数据结构],那我就不需要你的[代码]了,它是显而易见的”。


  实际上,他说的是“流程图”和“表”,但是在三十年的术语/文化演进之后,事情还是一样的。


  此时(1996年9月初,在从零开始六个月后),我开始想接下来修改名字——毕竟,它已不仅仅是一个POP客户,但我犹豫了,因为还没有什么新的漂亮设计呢,我的popclient版本需要有自己的特色。


  当fetehmail学会怎样把取到的邮件转送到SMTP端口时,事情就完全改变了,但是首先:上面我说过我决定使用这个工程来测试我关于Linus Torualds所做的行为的理论,(你可能会问)我怎样做到这点呢? 以下面的方式:
    1. 我尽早尽量频繁的发布(几乎从未少于每十天发布一次;在密集开发的时候是每天一次)。
    2. 我把每一个和我讨论fetchmail的人加入一个beta表中。
    3. 每当我发布我都向beta表中的人发出通告,鼓励人们参与。
    4. 我听取beta测试员的意见,向他们询问设计决策,对他们寄来的补丁和反馈表示感谢。

  这些简单的手段立即收到的回报,在工程的开始,我收到了一些错误报告,其质量足以使开发者因此被杀掉,而且经常还附有补丁、我得到了理智的批评,有趣的邮件,和聪明的特征建议,这导致了:


  10. 如果你象对待最宝贵的资源一样对待你的beta测试员,他们就会成为你最宝贵的资源。


六. popclient变成了Fetchmail


  这个工程的真正转折点是Harry Hochleiser寄给我他写的代码草稿,他把邮件转发到客户端机器的SMTP端口,我立即意识到这个特征的可靠实现将淘汰所有其他的递送模式。


  几个星期以来我一直在修改而不是改进fetchmail,因为我觉得界面设计虽然有用但是太笨拙琐碎了,到处充满了太多的粗陋的细小选项。


  当我思考SMTP转发时我发现popclient试图做的事太多了,它被设计成既是一个邮件传输代理(MTA)也是一个本地递送代理(MDA)。使用 SMTP转发,它就可以从MDA的事务中解脱出来而成为一个纯MTA,而象sendmail一样把邮件交给本地递送程序来处理。


  既然端口25在所有支撑TCP/IP的平台上早已被预留,为什么还要为一个邮件传输代理的配置或为一个邮箱设置加锁的附加功能而操心呢?尤其是当这意味着抽取的邮件就象一个正常的发送者发出的SMTP邮件一样,而这就是我们需要的。


  这里有几个教益:第一,SMTP转发的想法是我有意识地模拟Linus的方法以来的最大的单个回报,一个用户告诉我这个非同寻常的想法——我所需做的只是理解它的含义。


  11. 想出好主意是好事,从你的用户那里发现好主意也是好事,有时候后者更好。


  很有趣的是,你很快将发现,如果你完全承认你从其他人那里得到多少教益的话,整个世界将会认为所有的发明都是你做出的,而你会对你的天才变得谦虚。我 们可以看到这在Linus身上体现得多明显!(当我在1997年8月的Perl会议上发表这个论文时,Larry Wall坐在前排,当我讲到上面的观点时,他激动的叫了出来:“对了!说对了!哥们!”所有的听众都哄堂大笑起来,因为他们知道同样的事情也发生在 Perl的发明者身上)。


  于是在同样精神指导下工程进行了几个星期,我开始不光从我的用户那儿也从听说我的系统的人那儿得到类似的赞扬,我把一些这种邮件收藏起来,我将在我开始怀疑自己的生命是否有价值时重新读读这些信。:)


  但是有两个更基本的,非政治性的对所有设计都有普遍意义的教益。


  12. 最重要和最有创新的解决方案常常来自于你认识到你对问题的概念是错误的。

  一个衡量fetchmail成功的有趣方式是工程的beta测试人员表(fegtchmail的朋友们)的长度,在创立它的时候已经有249个成员了,而且每个星期增加两到三个。


  实际上,当我在1997年5月校订它时,这张表开始因为一个有趣的原因而缩短了,有几个人请求我把他们从表中去掉,因为fetchmail已经工作的如此之好,他们不需要看到这些邮件了!也许这是一个成熟的市集风格工程的生命周期的一部分。

  我以前一直在解决错误的问题,把popclient当作MTA和具有许多本地递送模式的MDA的结合物,Fetchmail的设计需要从头考虑为一个纯的MTA,做为一个普通Internet邮件路径的一部分。


  当你在开发中碰了壁时(当你发现自己很难想通下一步时),那通常不是要问自己是否找到正确答案,而是要问是否问了正确问题,也许需要重新构造问题。


  于是,我重新构造了我的问题,很清楚,要做的正确的事是(1)把SMTP转发支持放在通用驱动程序中,(2)把它做为缺省模式,(3)最终分离所有其他的递送模式,尤其是递送到文件和标准输出的选项。


  我在第三步上犹豫了一下,担心会让popdiant的长期用户对新的递送方法感到烦心,在理论上,他们可以立即转而转发文件或者他们的非sendmail等价物来得到同样的效果,在实际中这种转换可能会很麻烦。
但是当我这么做之后,证明好处是巨大的,驱动程序代码的冗余的部分消失了,配置完全变得简单了——不用屈从于系统MDA和用户的邮箱,也不用为下层OS是否支持文件锁定而担心了。


  而且,丢失邮件的唯一漏洞也被堵死了,如果你选择了递送到一个文件而磁盘已满,你的邮件就会丢失,这在SMTP转发中不会发生,因为SMTP侦听器不会返回OK的,除非邮件可以递送成功或至少被缓冲留待以后递送。


  还有,性能也改善了(虽然在单次执行中你不会注意到),这个修改的另一个不可忽视的好处是手册变得大大简单了。


  后来,为了允许处理一些罕见的情况,包括动态SLIP,我必须回到让用户定义本地MDA递送上来,但是我发现了一个更加简单的方法。


  所有这些给了我们什么启发呢?如果可以不损失效率,就要毫不犹豫抛弃陈旧的特性,Antonine de Saint-Exupery(在他成为经典儿童书籍作家之前是一个飞行员和飞机设计师)曾说过:


  13. “最好的设计不是再也没有什么东西可以添加了,而是再也没有什么东西可以去掉。”


  当你的代码变得更好和更简单时,这就是你知道它是正确的时候了,而且在这个过程中,fetehmail的设计具有了自己的特点,而区别于其前身popclient。


  现在是改名的时候了,这个新的设计看起来比老popclient更象一个sendmail的复制品,它们都是MTA,但是Senmail是推然后递送,而新的popclient是拉然后递送。于是,在两个月之后,我把它重新命名为fetehmail。


七. Fetchmail成长起来


  现在我有了一个简洁和富有创意的设计,工作得很好的代码,因为我每天都用它,和一直在增长的beta表,它让我渐渐明白我已经不是在从事只能对少数其他人有用的工作中,我写了一个所有有一个Unix邮箱和SLIP/PPP邮件连接的人都真正需要的程序。


  通过SMTP转发功能,它成为一个潜在的“目录杀手”,远远领先于它的竞争者,这个程序如此能干以至于其他的程序不但被放弃简直被忘记了。


  我知道你不可以真得瞄准或计划出这样的结果,你只能努力去设计这些强大的思想,以后这些结果就好象是不可避免的、自然的、注定了的,得到这种思想的唯一办法是获取许多思想,或者用工程化的思考其他人的好主意而超过原来想到它的人的设想。


  Andrew Tanenbanm原来设想建造一个适合386的简单的Unix用做教学,Linus Torvalels把Andrew的可能想到的Minix可以做什么的概念推进了一步,成长为一个极好的东西,同样的(虽然规模较小),我接受了Card Harris和Harry Hochheiser的想法,把它们变得更强大,我们都不是人们所浪漫幻想的天才的创始人,但是大多数科学和工程和软件开发不是被天才的创始人完成的,这和流传的神话恰恰相反。


  结果总是执着的原因——实际上,它是每个黑客为之生存的成功!而且它们意味着我必须把自己的标准定高一点,为了把fetchmail变得和我所能设想 的那样好,我必须不仅为我自己的需要写代码,而且也要包括对在我生活围主页外的人们的需求的支持,而且同时也要保证程序的简单和健壮。


  在实现它之后我首先写的最重要的特征是支持多投——从集中一组用户的邮件的邮箱中取出邮件,然后把它路由到每个人手中。


  我之所以加上多投功能部分是因为有些用户一直在闹着要它,更是因为我想它可以从单投的代码中揭露出错误来,让我完全一般地处理寻址,而且这被证明了。 正确解释RFC822花了我相当长的时间,不仅因为它的每个单独部分都很难,而且因为它有一大堆相互依赖的苛刻的细节。


  但是多投寻址也成为一个极好的设计决策,由此我知道:


  14. 任何工具都应该能以预想的方式使用,但是一个伟大的工具提供你没料到的功能。


  Fetchmant多投功能的一个没有料到的用途是在SLIP/PPP的客户端提供邮件列表、别名扩展。这意味着一个使用个人机器的人不必持续访问 ISP的别名文件就能通过一个ISP帐户管理一个邮件列表。我的beta测试员提出的另一个重要的改变是支持8位MIME操作,这很容易做,因为我已经仔 细的保证了8位代码的清晰,不仅因为我预见到了这个特性的需求,而且因为我忠实于另一准则:


  15. 当写任何种类的网关型程序时,多费点力,尽量少干扰数据流,永远不要抛弃信息,除非接收方强迫这么作!


  如果我不遵从这个准则,那么8位MIME支持将会变得困难和笨拙,现在我所需要做的,是只读一下RFC 1652,在产生信头的逻辑加上一点而已。


  一些欧洲用户要求我加上一个选项来限制每次会话取得消息数(这样他们就可以从昂贵的电话网中控制花费了),我很长一段时间拒绝这样做,而且我仍然对它不很高兴,但是如果你是为了世界而写代码,你必须听取顾客的意见——这并不随他们不付给你钱而改变。


八. 从Fetchmail得来的另一些教益


  在他们回到一般的软件工程问题以前,还有几个从fetchmail得到的教益需要思考。


  rc文件语法包括可选的“noise”关键字,它被扫描器完全忽略了,当你把它们全抽取出的时候,关键字/值对更具可读性。


  当我注意到rc文件的声明在多大程度上开始象一个微型命令语言时,这是一个Late-night的体验(这也是我为什么把popclient原来的“server”关键字改成了“poll”)。


  对我来说似乎把这个微型命令语言变得更象英语可能会使它更容易使用。现在,虽然我对经过Emacs和HTML及许多数据库引擎所证实的“把它做成一个语言”的设计方式确信不疑,但是我并不是一个通常的“类英语”语法的狂热拥护者。


  传统程序员容易控制语法使它尽量精确和紧凑,完全没有冗余,这是计算机资源还很昂贵时遗留下的一种文化传统,所以扫描策略需要尽可能的廉价和简单,而具有50%冗余度的英语,看来好象是一个非常不合适的模型。


  这并不是我不用类英语语法的原因,我提到这一点是为了推翻它,在更廉价的时钟周期与核心的时代,简洁并没有走到尽头,今天对一个语言来说,对人更方便比对机器更廉价来的更加重要。


  然而,有几个原因提醒我们小心一点,一个是扫描策略的复杂度开销——你并不想把它变成一个巨大的错误来源和让用户困惑,另一个是试图使语言表面上的类似可以和传统语言一样令人困惑(你可以在许多4GL和商业数据库查询语言上看到这一点)。


  Fetchmail的控制语法避免了这些问题,因为语言的领域是极其有限的。它一点也不象一个一般性的语言,它很简单地描述的东西并不复杂,所以很少可能在英语的一个小子集与实际的控制语言之间发生混淆,我想这有一个更广泛的教益:


  16. 如果你的语言一点也不象是图灵完备的,严格的语法会有好处。


  另一个教益是关于安全的,一些fetchmail用户要求我修改软件把口令加密存贮在rc文件里,这样觑探者就不能看到它们了。


  我没有这样做,因为这实际上起不到任何保护作用,任何有权读取你的rc文件的人都可以以你的名义运行fetchmail——如果他们要破你的口令,它们可以从fetchmail的代码中找到制作解码器的方法。


  所以fetchmail口令的加密都会给那些不慎重思考的人一种安全的错觉,这里一般性的准则是:


  17. 一个安全系统只能和它的秘密一样安全,当心伪安全。


九. 集市风格的必要的先决条件


  本文的早期评审人员和测试人员坚持提出成功的市集模式开发的先决条件,包括工程领导人的资格问题和在把项目公开和开始建造一个协作开发人员的社团的时候代码的状态。


  相当清楚,不能以一个市集模式从头开发一个软件,我们可以以市集模式、测试、调试和改进,但是以市集模式从头开始一个项目将是非常困难的,Linus没有这样做,我也没有,初期的开发人员的社团应该有一此可以运行和测试的东西来玩。


  当你开始创建社团时,你需要演示的是一个诺言,你的程序不需要工作的很好,它可以很粗糙、很笨拙、不完整和缺少文档、它不能忽略的东西是要吸引哪些人卷入一个整洁的项目。


  Linux和fetchmail都是以一个吸引人的基本设计进入公共领域的,许多和我一样在思考市集模式的人已经正确的认为这是非常关键的,然后得出了一个结论,工程领导者的高度的设计直觉和聪颖是必不可少的。


  但是Linus是从Unix得到他的设计的,我最初是从先前的popmail得到启发的(虽然相对Linux而言,它最后改变巨大),所以市集风格的领导人/协调人需要有出众的设计才能,或者他可以利用别人的设计才能?


  我认为能够提出卓越的原始设计思想对协调人来说不是最关键的,但是对他/她来说绝对关键的是要能把从他人那里得到的好的设计重新组织起来。


  Linux和fetchmail项目都显示了这些证据,Linus(如同前面所说)并不是惊人的原始设计者,但他显示了发现好的设计并把它集成到 Linux内核中的强大决窍。还有我也描述了怎样从别人那里得到了fetchmail中最强大的设计思想(SMTP转发)。


  本文的早期读者称赞我,说因为我做了许多关于原始设计的事,所以倾向于低估原始设计在市集项目中的价值,也许有些是对的吧,但是设计(而不是编码或调试)本来就是我最强的能力。


  变得聪明和软件设计的原始创作的问题是它会变成一个习惯,当需要保持事物健壮和简洁的时候,你却开始把事情变得漂亮但却复杂。我曾经犯过错误,使得一些项目因我而崩溃了,但我努力不让它发生在fetchmail身上。


  所以我相信fetchmail项目的成功部分是因为我抑制自己不要变得太聪明,这说明(至少)对市集模式而言原始设计并不是本质的,请考察一下Linux假设Linus Torvalds在开发时试图彻底革新操作系统设计,它还会象今天我们所拥有的内核那样稳定和成功吗?


  当然基本的设计和编码技巧还是必需的,但我希望每个严肃考虑发起一个市集计划的人都已至少具备这些能力,自由软件社团的内部市场对人们有某些微妙的压力,让他们不要发起自由不能搞定的开发,目前为止,这工作得仍然相当好。


  对市集项目来说,我认为还有另一种通常与软件开发无关的技能和设计能力同样重要——或者更加重要,市集项目的协调人或领导人必须有良好的人际和交流能力。


  这是很显然的,为了建造一个开发社团,你需要吸引人,你所做的东西要让他们感到有趣,而且要保持他们对他们正在做的工作感到有趣,而且要保持他们对他们正在做的工作感到高兴,技术方面对达成这些目标有一定帮助,但这远远不是全部,你的个人素质也有关系。


  并不是说Linus是一个好小伙子,让人们喜爱并乐于帮助他,也并不是说我是个积极外向的,喜欢扎堆儿工作,有出众的幽默感的人,对市集模式的工作而言,至少有一点吸引人的技巧是非常有帮助的。


十. 自由软件的社会学语境


 下述如实:最好的开发是从作者解决每天工作中的个人问题开始的,因为它对一大类用户来说是一个典型问题,所以它就推广开来了,这把我们带回到准则1,也许是用一个更有用的方式来描述:


  18. 要解决一个有趣的问题,请从发现让你感兴趣的问题开始。


  这是Carl Harris和原先的popclient的情形,也是我和fetchmail的情形,但这已在很长一段时间被大家知晓了,Linux和fetchmail 的历史要求我们注意的有趣之处是下一个阶段——软件在一个庞大的活跃的用户和协作开发人员的社团中的进化。


  在《神秘的人月》一书中,Fred Brooks观察到程序员的工作时间是不可替代的:在一个误了工期的软件项目中增加开发人员只会让它拖得更久,他声称项目的复杂度和通讯开销以开发人员的 平方增长,而工作成绩只是以线性增长,这个说法被称为“Brooks定律”,被普遍当作真理,但如果Brooks定律就是全部,那Linux就不可能成 功。


  几年之后,Gerald Weinbeng的经典之作“The Psychology Of Computer Progromming”为我们更正了Brooks的看法,在他的“忘我(egoless)的编程”中,Weinberg观察到在开发人员不顽固保守自己的代码,鼓励其他人寻找错误和发展潜力的地方,软件的改进的速度会比其他地方有戏剧性的提高。


  Weinberg的用词可阻止了他的分析得到应有的接受,人们对把Internet黑客称为“忘我”的想法微笑,但是我想今天他的想法比以往任何时候都要引人注目。


  Unix的历史已经为我们准备好了我们正在从Linux学到的(和我在更小规模上模仿Linus的方法所验证的)东西,这就是,虽然编码仍是一个人干 的活,真正伟大的工作来自于利用整个社团的注意和脑力,在一个封闭的项目中只利用他自己的脑力的人会落在知道怎样创建一个开放的、进化的,成百上千的人在 其中查找错误和进行修改的环境的开发人员之后。


  但是Unix的传统中有几个因素阻止把这种方法推到极致。一个是各种授权的法律约束、商业机密和商业利益,另一个(事后来看)是Internet还不够好。


  在Internet变得便宜之前,有一些在地理上紧密的社团,它们的文化鼓励Weingberg的“忘我”编程,一个开发人员很容易吸引许多熟练的人和协作开发人员,贝尔实验室,MIT A1实验室,UC Berkeley,都成为传统的、今天仍然是革新的源泉。


  Linux是第一个有意识的成功的利用整个世界做为它的头脑库的项目,我不认为Linux的孕育和万维网的诞生相一致是一个巧合,而且Linux在 1993-1994的一段ISP工业大发展和对Internet的兴趣爆炸式增长的时期中成长起来,Linus是第一个学会怎样利用Internet的新 规的人。


  廉价的Internet对Linux模式的演化来说是一个必要条件,但它并不充分,另一个关键因素是领导风格的开发和一套协作的氛围使开发人员可以吸引协作开发人员和最大限度地利用媒体。


  但是这种领导风格与氛围到底是什么呢?它不能建立在权力关系之上——甚至如果它们可以,高压的领导权力不能产生我们所看到的结果,Weinberg引用了19世纪俄国的无政府主义者Kropotkin的“Memoris of a Revolutionist”来证明这个观点:


  “我从小生活在一个农奴主的家庭中,我有一个活跃的生活,象我们时代的所有年轻人一样,我深信命令、强制、责骂、惩罚等等的必要性。但是当我(在早 期)必须管理一个企业,和(自由)人打交道时,当每一个错误都会产生严重后果时,我开始接受以命令和纪律为准则来行动和以普通理解为准则来行动的区别。前 者在军事阅兵中工作的很好,但是它在现实生活中一文不值,目标达成只是靠许多愿望的聚合的简单后果。”“许多聚合在一起的愿望的直接后果”精确地指出了象 Linux的项目所需要的东西。“命令的准则”在Internet这种无政府主义的天堂中一群自愿者之中是没有市场的,为了更有效的操作和竞争,想领导协 作项目的黑客们必须学会怎样以Kropotkins含糊指出的“理解的准则”模式来恢复和激活社团的力量,他们必须学会使用Linus定律。


  前面我引用“Delhpi效应”来作为Linus定律的一个可能的解释,但是来自生物学和经常学的自适应系统的更强大的分析也提出了自己的解 释,Linus世界的行为更象一个自由市场或生态系统,由一大群自私的个体组成,它们试图取得(自己)最大的实效,在这个过程中产生了比任何一种中央计划 都细致和高效的自发的改进的结果,所以,这里就是寻找“理解的准则”的地方。


  Linux黑客取得的最大化的“实际利益”不是经典的经济利益,而是无形的他们的自我满足和在其他黑客中的声望,(有人会说他们的动机是“利他的”, 但这忽略了这样的事实:利他主义本身是利他主义者的一种自我满足的形式),自愿的文化以这种方式工作的实际上并非不寻常,我已参与一个科幻迷团体很长时间 了,它不象黑客团体一样,显式地识别出“egoboo”(一个人在其他爱好者之中的声望的增长)作为自愿者活动背后的基础驱动力)。


  Linus成功地把自己置于项目的守门人的位置,在项目中开发大部分是别人做的,他只是在项目中培养兴趣直到它可以自己发展下去,这为我们展示了对 Kropokin的“共同理解原则”的敏锐把握,对Linux这种类似经济学的观点让我们看到这种理解是怎样应用的。


  我们可以把Linus的方法视为创建一个高效的关于“egoboo”(而不是钱)的市场,来把自私的黑客个体尽可能紧密的联系起来,达成只能通过高度 协作才能得到的困难的结果,在fetchmail项目中我展示了(在较小规模上)这种模式可以复制,得到良好的结果,也许我比他更有意识一点、更加系统一 点。


  许多人(尤其是哪些由于政治原因不信任自由市场的人)会盼望自我导向的自我主义者的文化破碎、报废、秘密和敌对,但这种盼望很明显地被Linux的文 档的多样性、质量和深度打破了,程序员讨厌写文档似乎已是圣训,但Linux的黑客们怎么产生了这么多?显然Linux的egoboo自由市场比有大量资 金的商业软件产品的文档部在产生有品德的、他人导向的行为方面工作的更好。


  Fetchmail和Linux内核项目都表明,通过恰当的表彰许多其他黑客,一个强大的开发者/协调者可以用Internet得到许多协同开发人员而不是让项目分崩离析为一片混乱,所以关于Brooks定律我得到了下面的想法:


  19. 如果开发协调人员有至少和Internet一样好的媒介,而且知道怎样不通过强迫来领导,许多头脑将不可避免地比一个好。


  我认为自由软件的将来将属于那些知道怎样玩Linus的游戏的人,把大教堂抛之脑后拥抱市集的人,这并不是说个人的观点与才气不再重要,而是,我认为自由软件的前沿将属于从个人观点和才气出发的人,然后通过共同兴趣自愿社团的高效建造来扩展。


  可能不只是自由软件的将来,在解决问题方面,没有任何商业性开发者可以与Linux社团的头脑库相匹敌,很少有人能负担起雇佣200多个为fetchmail出过力的人!


  也许最终自由软件文化将胜利,不是因为协作在道德上是正确的或软件“囤积居奇”在道德上是错的(假设你相信后者,Linus和我都不),而仅仅是因为商业世界在进化的军备竞赛中不能战胜自由软件社团,因为后者可以把更大更好的开发资源放在解决问题上。



阅读全文