2004年05月07日

gpedit.msc—–组策略


sndrec32——-录音机


Nslookup——-IP地址侦测器


explorer——-打开资源管理器


logoff———注销命令


tsshutdn——-60秒倒计时关机命令


lusrmgr.msc—-本机用户和组


services.msc—本地服务设置


oobe/msoobe /a—-检查XP是否激活


notepad——–打开记事本


cleanmgr——-垃圾整理


net start messenger—-开始信使服务


compmgmt.msc—计算机管理


net stop messenger—–停止信使服务


conf———–启动netmeeting


dvdplay——–DVD播放器


charmap——–启动字符映射表


diskmgmt.msc—磁盘管理实用程序


calc———–启动计算器


dfrg.msc——-磁盘碎片整理程序


chkdsk.exe—–Chkdsk磁盘检查


devmgmt.msc— 设备管理器


regsvr32 /u *.dll—-停止dll文件运行


drwtsn32—— 系统医生


rononce -p —-15秒关机


dxdiag———检查DirectX信息


regedt32——-注册表编辑器


Msconfig.exe—系统配置实用程序


rsop.msc——-组策略结果集


mem.exe——–显示内存使用情况


regedit.exe—-注册表


winchat——–XP自带局域网聊天


progman——–程序管理器


winmsd———系统信息


perfmon.msc—-计算机性能监测程序


winver———检查Windows版本


(note: Flash6 is required)

来自:http://home.attbi.com/~bernhard36/honda-ad.html

一定要先看完广告再看内容!

本广告一共拍摄六百零五次,沒有使用任何计算机辅助,花费四天四夜在巴黎一个工作室拍摄而成。

东京总部的大头目们第一次看到这段广告的反应是:很好啊~很聪明,现代的计算机技术真是不錯。当他们知道这全是真的的时候,他们惊呆了。

世界上共有六台量产前的New Accord,这部广告用了2台。其中一台拆成了零件─广告用的完全都是真的车里的零件,问什么? 因为在经过无数次的失败以后他们卯起来要拍出最真实的影片。

工作人员已经拍得快发疯了,最后有些人因为连续工作数天必须被”请”到旁边休息。

其他人也打起赌来猜哪一段会出错。(Honda的自动感应水的雨刷贏最多次)。

终于成功的第606次拍摄,结束时现场鸦雀无声,然后爆出了热烈的欢呼和掌声,以及四溅的香槟。

这个游戏值多少钱?八十万台币如果你算那辆车,或三亿台币如果你算整个计划。

其中一段是一个吊着的雨刷在空中旋转移动,拍成功的那次是那一段唯一成功的一次。

轮胎里放的是螺丝和螺帽,平衡之精细,连摄影組员走动时都得小心翼翼。常常一个大一点的动作或是不小心轻推一下什么,就得重复好几小时的工作。

拍到三四百,甚至第五百多次时,制作人开始称呼这些零件为「our friends, the parts」。

更有一些组员几天没睡后被其他人要求离较精细的部份远一点。

当问及他花在这个广告的时间有多长时,广告导演尖声一笑,回答:「五年? 还是八年了?」

广告用的这两台 Accord 是全世界仅有的六台中的两台,全是Honda 工程师手工打造的。(可见当初拆掉一台时那些工程师有多心疼)

从small家回来就一直在写那个mvc的php class,终于搞完了,写了个文档放在网上,把code给我small一份。妈的,他机器上据让还没有装php.


small说我的blog有点向垃圾场,我也觉得,怎么右面的字都遮住了呢,整理了一下后台,换了个风格,ok.不错!


刷牙洗脸之后,又回到电脑钱,发现天已经很亮了。


今天要去理发,买东西,洗衣服收拾屋子了 呵呵,后天就要上班了。

我是在台湾的一家网站上偶尔发现的,我把繁体字转变为简体字,那个网站说,没有得到作者同意,不能转载,呵呵,但我还是转载了,LINUX崇尚自由嘛
3.2 VSFTP—安全与效能兼备的ftp 服务器
3.2.1 VSFTP 概述
FTP,file transfer protocol,这是档案传输的通讯协议,也是一般最常用来传送档案的方式。读者在使用RedHat9 的时候,可能会感受到ftp server 有一些改变:第一,就是ftp server 只剩下vsftp,原有的wuftp 等都没放入﹔第二,就是vsftp 从XINETD 中独立出来,并将设定档从/etc/vsftpd.conf 之中移到/etc/vsftpd/vsftpd.conf。
为什么做这样的改变?可以想见的是vsftp 已有独立运作的能力,不需要XINETD 来做更进一步的管控,并且类似sendmail、httpd、ssh、samba 等,将设定文件的放入/etc 下独立的目录。
FTP 分为两类,一种为PORT FTP,也就是一般的FTP﹔另一类是PASVFTP,分述如下: PORT FTP
这是一般形式的FTP,首先会建立控制频道,默认值是port 21,也就是跟
port 21 建立联机,并透过此联机下达指令。第二,由FTP server 端会建立数据
传输频道,默认值为20,也就是跟port 20 建立联机,并透过port 20 作数据的
传输。
PASV FTP
跟PORT FTP 类似,首先会建立控制频道,默认值是port 21,也就是跟
port 21 建立联机,并透过此联机下达指令。第二,会由client 端做出数据传输
的请求,包括数据传输port 的数字。
这两者的差异为何?PORT FTP 当中的数据传输port 是由FTP server 指定,
而PASV FTP 的数据传输port 是由FTP client 决定。通常我们使用PASV FTP,
是在有防火墙的环境之下,透过client 与server 的沟通,决定数据传输的port。
3.2.2 范例
3.2.1. 直接启动VSFTP 服务
这个范例是套用RedHat 的预设范例,直接启动vsftp。
[root@relay vsftpd]# /sbin/service vsftpd start
Starting vsftpd for vsftpd: OK ]
3.2.2. 更换port 提供服务:将预设的port 21 更换为2121
为了安全,或是以port 来区隔不同的ftp 服务,我们可能会将ftp port 改为
21 之外的port,那么,可参考以下步骤。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
listen_port=2121
Step2. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
3.2.3. 特定使用者peter、john 不得变更目录
使用者的预设目录为/home/username,若是我们不希望使用者在ftp 时能够
切换到上一层目录/home,则可参考以下步骤。
Step1. 修改/etc/vsftpd/vsftpd.conf
将底下三行
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
改为
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
Step2. 新增一个档案: /etc/vsftpd/chroot_list
内容增加两行:
peter
john
Step3. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
若是peter 欲切换到根目录以外的目录,则会出现以下警告:
ftp> cd /home
550 Failed to change directory.
3.2.4. 取消anonymous 登入
若是读者的主机不希望使用者匿名登入,则可参考以下步骤。
Step1. 修改/etc/vsftpd/vsftpd.conf

anonymous_enable=YES
改为
anonymous_enable=NO
Step2. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
3.2.5. 安排欢迎话语
若是我们希望使用者在登入时,能够看到欢迎话语,可能包括对该主机的
说明,或是目录的介绍,可参考以下步骤。
首先确定在/etc/vsftpd/vsftpd.conf 当中是否有底下这一行
dirmessage_enable=YES
RedHat9 的默认值是有上面这行的。
接着,在各目录之中,新增名为.message 的档案,再这边假设有一个使用
者test1,且此使用者的根目录下有个目录名为abc,那首先我们在/home/test1
之下新增.message,内容如下:
Hello~ Welcome to the home directory
This is for test only…
接着,在/home/test1/abc 的目录下新增.message,内容如下:
Welcome to abcs directory
This is subdir…
那么,当使用者test1 登入时,会看到以下讯息:
230- Hello~ Welcome to the home directory
230-
230- This is for test only…
230-
若是切换到abc 的目录,则会出现以下讯息:
250- Welcome to abcs directory
250-
250- This is subdir …
3.2.6. 对于每一个联机,以独立的process 来运作
一般启动vsftp 时,我们只会看到一个名为vsftpd 的process 在运作,但若
是读者希望每一个联机,都能以独立的process 来呈现,则可执行以下步骤。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
setproctitle_enable=YES
Step2. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
使用ps -ef 的指令,可以看告不同使用者联机的情形,如下图所示:
[root@home vsftpd]# ps -ef|grep ftp
root 2090 1 0 16:41 pts/0 00:00:00 vsftpd: LISTENER
nobody 2120 2090 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244:
connected
test1 2122 2120 0 17:18 ? 00:00:00 vsftpd: 192.168.10.244/test1:
IDLE
nobody 2124 2090 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244:
connected
test2 2126 2124 0 17:19 ? 00:00:00 vsftpd: 192.168.10.244/test2:
IDLE
root 2129 1343 0 17:20 pts/0 00:00:00 grep ftp
[root@home vsftpd]#
3.2.7. 限制传输档案的速度:本机的使用者最高速度为200KBytes/s,匿名登入
者所能使用的最高速度为50KBytes/s
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下两行
anon_max_rate=50000
local_max_rate=200000
Step2. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在这边速度的单位为Bytes/s,其中anon_max_rate 所限制的是匿名登入的
使用者,而local_max_rate 所限制的是本机的使用者。VSFTPD 对于速度的限
制,范围大概在80%到120%之间,也就是我们限制最高速度为100KBytes/s,
但实际的速度可能在80KBytes/s 到120KBytes/s 之间,当然,若是频宽不足
时,数值会低于此限制。
3.2.8. 针对不同的使用者限制不同的速度:假设test1 所能使用的最高速度为
250KBytes/s,test2 所能使用的最高速度为500KBytes/s。
Step1. 修改/etc/vsftpd/vsftpd.conf
新增底下一行
user_config_dir=/etc/vsftpd/userconf
Step2. 新增一个目录:/etc/vsftpd/userconf
mkdir /etc/vsftpd/userconf
Step3. 在/etc/vsftpd/userconf 之下新增一个名为test1 的档案
内容增加一行:
local_max_rate=250000
Step4. 在/etc/vsftpd/userconf 之下新增一个名为test2 的档案
内容增加一行:
local_max_rate=500000
Step5. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
3.2.9-1. 建置一个防火墙下的ftp server,使用PORT FTP mode:预设的ftp
port:21 以及ftp data port:20
启动VSFTPD 之后执行以下两行指令,只允许port 21 以及port 20 开放,
其它关闭。
iptables -A INPUT -p tcp -m multiport –dport 21,20 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT –reject-with tcp-reset
3.2.9-2. 建置一个防火墙下的ftp server,使用PORT FTP mode:ftp port:2121
以及ftp data port:2020
Step1. 执行以下两行指令,只允许port 2121 以及port 2020 开放,其它关闭。
iptables -A INPUT -p tcp -m multiport –dport 2121,2020 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT –reject-with tcp-reset
Step2. 修改/etc/vsftpd/vsftpd.conf
新增底下两行
listen_port=2121
ftp_data_port=2020
Step3. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在这边要注意,8、9 两个例子中,ftp client(如cuteftp)的联机方式不能
够选择passive mode,否则无法建立数据的联机。也就是读者可以连上ftp
server,但是执行ls、get 等等的指令时,便无法运作。
3.2.10. 建置一个防火墙下的ftp server,使用PASS FTP mode:ftp port:2121
以及ftp data port 从9981 到9986。
Step1. 执行以下两行指令,只允许port 2121 以及port 9981-9990 开放,其它关
闭。
iptables -A INPUT -p tcp -m multiport –dport
2121,9981,9982,9983,9984,9985,9986,9987,9988,9989,9990 -j ACCEPT
iptables -A INPUT -p tcp -j REJECT –reject-with tcp-reset
Step2. 修改/etc/vsftpd/vsftpd.conf
新增底下四行
listen_port=2121
pasv_enable=YES
pasv_min_port=9981
pasv_max_port=9986
Step3. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
在这边要注意,在10 这个例子中,ftp client(如cuteftp)的联机方式必须
选择passive mode,否则无法建立数据的联机。也就是读者可以连上ftp
server,但是执行ls,get 等等的指令时,便无法运作。
8.2.11. 将vsftpd 与TCP_wrapper 结合
若是读者希望直接在/etc/hosts.allow 之中定义允许或是拒绝的来源地址,
可执行以下步骤。这是简易的防火墙设定。
Step1. 确定/etc/vsftpd/vsftpd.conf 之中tcp_wrappers 的设定为YES,如下图所
示:
tcp_wrappers=YES
这是RedHat9 的默认值,基本上不需修改。
Step2. 重新启动vsftpd
[root@home vsftpd]# /sbin/service vsftpd restart
Shutting down vsftpd: OK ]
Starting vsftpd for vsftpd: OK ]
Step3. 设定/etc/hosts.allow,譬如提供111.22.33.4 以及10.1.1.1 到10.1.1.254 连
线,则可做下图之设定:
vsftpd : 111.22.33.4 10.1.1. : allow
ALL : ALL : DENY
8.2.12. 将vsftpd 并入XINETD
若是读者希望将vsftpd 并入XINETD 之中,也就是7.x 版的预设设定,那
么读者可以执行以下步骤。
Step1. 修改/etc/vsftpd/vsftpd.conf

listen=YES
改为
listen=NO
Step2. 新增一个档案: /etc/xinetd.d/vsftpd
内容如下:
service vsftpd
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
port = 21
log_on_success += PID HOST DURATION
log_on_failure += HOST
}
Step3. 重新启动xinetd
[root@home vsftpd]# /sbin/service xinetd restart
Stopping xinetd: OK ]
Starting xinetd: OK ]
3.2.3 设定档说明
在范例中,有些省略的设定可以在这边找到,譬如联机的总数、同一个位
址的联机数、显示档案拥有者的名称等等,希望读者细读后,可以做出最适合
自己的设定。
格式
vsftpd.conf 的内容非常单纯,每一行即为一项设定。若是空白行或是开头为#的一行,
将会被忽略。内容的格式只有一种,如下所示
option=value
要注意的是,等号两边不能加空白,不然是不正确的设定。
===ascii 设定=====================
ascii_download_enable
管控是否可用ASCII 模式下载。默认值为NO。
ascii_upload_enable
管控是否可用ASCII 模式上传。默认值为NO。
===个别使用者设定===================
chroot_list_enable
如果启动这项功能,则所有的本机使用者登入均可进到根目录之外的数据夹,除了列
在/etc/vsftpd.chroot_list 之中的使用者之外。默认值为NO。
userlist_enable
用法:YES/NO
若是启动此功能,则会读取/etc/vsftpd.user_list 当中的使用者名称。此项功能可以在询
问密码前就出现失败讯息,而不需要检验密码的程序。默认值为关闭。
userlist_deny
用法:YES/NO
这个选项只有在userlist_enable 启动时才会被检验。如果将这个选项设为YES,则在
/etc/vsftpd.user_list 中的使用者将无法登入﹔ 若设为NO , 则只有在
/etc/vsftpd.user_list 中的使用者才能登入。而且此项功能可以在询问密码前就出现错误
讯息,而不需要检验密码的程序。
user_config_dir
定义个别使用者设定文件所在的目录,例如定义user_config_dir=/etc/vsftpd/userconf,
且主机上有使用者test1,test2,那我们可以在user_config_dir 的目录新增文件名为
test1 以及test2。若是test1 登入,则会读取user_config_dir 下的test1 这个档案内的设
定。默认值为无。
===欢迎语设定=====================
dirmessage_enable
如果启动这个选项,使用者第一次进入一个目录时,会检查该目录下是否有.message
这个档案,若是有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对
该目录的说明。默认值为开启。
banner_file
当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值
为无。
ftpd_banner
这边可定义欢迎话语的字符串,相较于banner_file 是档案的形式,而ftpd_banner 是字
串的格式。预设为无。
===特殊安全设定====================
chroot_local_user
如果设定为YES,那么所有的本机的使用者都可以切换到根目录以外的数据夹。预设
值为NO。
hide_ids
如果启动这项功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al
之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。
ls_recurse_enable
若是启动此功能,则允许登入者使用ls -R 这个指令。默认值为NO。
write_enable
用法:YES/NO
这个选项可以控制FTP 的指令是否允许更改file system,譬如STOR、DELE、
RNFR、RNTO、MKD、RMD、APPE 以及SITE。预设是关闭。
setproctitle_enable
用法:YES/NO
启动这项功能,vsftpd 会将所有联机的状况已不同的process 呈现出来,换句话说,使
用ps -ef 这类的指令就可以看到联机的状态。默认值为关闭。
tcp_wrappers
用法:YES/NO
如果启动,则会将vsftpd 与tcp wrapper 结合,也就是可以在/etc/hosts.allow 与
/etc/hosts.deny 中定义可联机或是拒绝的来源地址。
pam_service_name
这边定义PAM 所使用的名称,预设为vsftpd。
secure_chroot_dir
这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当vsftpd 不需
要file system 的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty
===纪录文件设定=====================
xferlog_enable
用法:YES/NO
如果启动,上传与下载的信息将被完整纪录在底下xferlog_file 所定义的档案中。预设
为开启。
xferlog_file
这个选项可设定纪录文件所在的位置,默认值为/var/log/vsftpd.log。
xferlog_std_format
如果启动,则纪录文件将会写为xferlog 的标准格式,如同wu-ftpd 一般。默认值为关
闭。
===逾时设定======================
accept_timeout
接受建立联机的逾时设定,单位为秒。默认值为60。
connect_timeout
响应PORT 方式的数据联机的逾时设定,单位为秒。默认值为60。
data_connection_timeout
建立数据联机的逾时设定。默认值为300 秒。
idle_session_timeout
发呆的逾时设定,若是超出这时间没有数据的传送或是指令的输入,则会强迫断线,
单位为秒。默认值为300。
===速率限制======================
anon_max_rate
匿名登入所能使用的最大传输速度,单位为每秒多少bytes,0 表示不限速度。默认值
为0。
local_max_rate
本机使用者所能使用的最大传输速度,单位为每秒多少bytes,0 表示不限速度。预设
值为0。
===新增档案权限设定==================
anon_umask
匿名登入者新增档案时的umask 数值。默认值为077。
file_open_mode
上传档案的权限,与chmod 所使用的数值相同。默认值为0666。
local_umask
本机登入者新增档案时的umask 数值。默认值为077。
===port 设定======================
connect_from_port_20
用法:YES/NO
若设为YES,则强迫ftp-data 的数据传送使用port 20。默认值为YES。
ftp_data_port
设定ftp 数据联机所使用的port。默认值为20。
listen_port
FTP server 所使用的port。默认值为21。
pasv_max_port
建立资料联机所可以使用port 范围的上界,0 表示任意。默认值为0。
pasv_min_port
建立资料联机所可以使用port 范围的下界,0 表示任意。默认值为0。
===其它========================
anon_root
使用匿名登入时,所登入的目录。默认值为无。
local_enable
用法:YES/NO
启动此功能则允许本机使用者登入。默认值为YES。
local_root
本机使用者登入时,将被更换到定义的目录下。默认值为无。
text_userdb_names
用法:YES/NO
当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出现拥有者的
UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。
默认值为NO。
pasv_enable
若是设为NO,则不允许使用PASV 的模式建立数据的联机。默认值为开启。
===更换档案所有权===================
chown_uploads
用法:YES/NO
若是启动,所有匿名上传数据的拥有者将被更换为chown_username 当中所设定的使
用者。这样的选项对于安全及管理,是很有用的。默认值为NO。
chown_username
这里可以定义当匿名登入者上传档案时,该档案的拥有者将被置换的使用者名称。预
设值为root。
===guest 设定=====================
guest_enable
用法:YES/NO
若是启动这项功能,所有的非匿名登入者都视为guest。默认值为关闭。
guest_username
这里将定义guest 的使用者名称。默认值为ftp。
===anonymous 设定==================
anonymous_enable
用法:YES/NO
管控使否允许匿名登入,YES 为允许匿名登入,NO 为不允许。默认值为YES。
no_anon_password
若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO。
anon_mkdir_write_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许新增目录,当然,匿名使用者必须要有对上层目
录的写入权。默认值为NO。
anon_other_write_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许更多于上传与建立目录之外的权限,譬如删除或
是更名。默认值为NO。
anon_upload_enable
用法:YES/NO
如果设为YES,匿名登入者会被允许上传目录的权限,当然,匿名使用者必须要有对
上层目录的写入权。默认值为NO。
anon_world_readable_only
用法:YES/NO
如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
ftp_username
定义匿名登入的使用者名称。默认值为ftp。
deny_email_enable
若是启动这项功能,则必须提供一个档案/etc/vsftpd.banner_emails,内容为email
address。若是使用匿名登入,则会要求输入email address,若输入的email address 在
此档案内,则不允许联机。默认值为NO。
===Standalone 选项==================
listen
用法:YES/NO
若是启动,则vsftpd 将会以独立运作的方式执行,若是vsftpd 独立执行,如RedHat9
的默认值,则必须启动﹔若是vsftpd 包含在xinetd 之中,则必须关闭此功能,如
RedHat8。在RedHat9 的默认值为YES。
listen_address
若是vsftpd 使用standalone 的模式,可使用这个参数定义使用哪个IP address 提供这
项服务,若是主机上只有定义一个IP address,则此选项不需使用,若是有多个IP
address,可定义在哪个IP address 上提供ftp 服务。若是不设定,则所有的IP address
均会提供此服务。默认值为无。
max_clients
若是vsftpd 使用standalone 的模式,可使用这个参数定义最大的总联机数。超过这个
数目将会拒绝联机,0 表示不限。默认值为0。
max_per_ip
若是vsftpd 使用standalone 的模式,可使用这个参数定义每个ip address 所可以联机
的数目。超过这个数目将会拒绝联机,0 表示不限。默认值为0。
=============================
3.2.4 FTP 数字代码的意义
110 重新启动标记应答。
120 服务在多久时间内ready。
125 数据链路埠开启,准备传送。
150 文件状态正常,开启数据连接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制连接埠关闭,可以注销。
225 数据连结开启,但无传输动作。
226 关闭数据连接端口,请求的文件操作成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操作完成。
257 显示目前的路径名称。
331 用户名称正确,需要密码。
332 登入时需要账号信息。
350 请求的操作需要进一部的命令。
421 无法提供服务,关闭控制连结。
425 无法开启数据链路。
426 关闭联机,终止传输。
450 请求的操作未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,无法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件需要账户登入。
550 未执行请求的操作。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。
553 未执行请求的的命令,名称不正确。




amd:自动安装NFS(网络文件系统)守侯进程
apmd:高级电源管理
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
Autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息
crond:Linux下的计划任务
Dhcpd:启动一个DHCP(动态IP地址分配)服务器
Gated:网关路由守候进程,使用动态的OSPF路由选择协议
Httpd:WEB服务器
Inetd:支持多种网络服务的核心守候程序
Innd:Usenet新闻服务器
Linuxconf:允许使用本地WEB服务器作为用户接口来配置机器
Lpd:打印服务器
Mars-nwe:mars-nwe文件和用于Novell的打印服务器
Mcserv:Midnight命令文件服务器
named:DNS服务器
netfs:安装NFS、Samba和NetWare网络文件系统
network:激活已配置网络接口的脚本程序
nfs:打开NFS服务
nscd:nscd(Name Switch Cache daemon)服务器,用于NIS的一个支持服务,它高速缓存用户口令和组成成员关系
portmap:RPC portmap管理器,与inetd类似,它管理基于RPC服务的连接
postgresql:一种SQL数据库服务器
routed:路由守候进程,使用动态RIP路由选择协议
rstatd:一个为LAN上的其它机器收集和提供系统信息的守候程序
ruserd:远程用户定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息
rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,允许用户给每个注册到LAN机器上的其他终端写消息
rwhod:激活rwhod服务进程,它支持LAN的rwho和ruptime服务
sendmail:邮件服务器sendmail
smb:Samba文件共享/打印服务
snmpd:本地简单网络管理候进程
squid:激活代理服务器squid
syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
xfs:X Window字型服务器,为本地和远程X服务器提供字型集
xntpd:网络时间服务器
ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程
yppasswdd:NIS口令服务器
ypserv:NIS主服务器
gpm:管鼠标的
identd:AUTH服务,在提供用户信息方面与finger类似


Linux各项系统开机服务的功能是什么?有哪些可以关掉?
Linux在启动时要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。但是,开启不必要或有漏洞的服务则会 给操作系统带来安全和性能上的影响。下面我们以BluePoint Linux 2.0的开机服务为例,列表说明各项服务的功能。


alsasound
Alsa声卡驱动程序支持。Alsa声卡驱动程序本来是为了 一种声卡Gravis UltraSound(GUS)而写的,该程序被证 明很优秀,于是作者就开始为一般的声卡写 驱动程序。 Alsa和OSS/Free 及OSS/Linux兼容,但是有自己的接 口,甚至比OSS优秀。


amd
运行automount精灵程序,该精灵在必要时自动安装一些 本地设备和NFS文件系统。


apmd
apmd用来监视系统用电状态,并将相关信息通过syslogd 写入日志。也可以用来在电源不足时关机。


arpwatch
该程序主要用来维护以太网物理地址和IP地址的对应关系。


atalk
AppleTalk精灵程序。注意不要在后台运行该程序,该程 序的数据结构必须在运行其他进程前先花一定时间初始化。


atd
运行用户用At命令调度的任务。也在系统负荷比较低时 运行批处理任务。


autofs
当您需要时自动转载文件系统,而当您不需要时自动卸载。


bootparamd
该服务允许老的Sun工作站从Linux网络启动,它和rarp 现在很少使用,基本上被bootp和dhcp取代了。


crond
cron是Unix下的一个传统程序,该程序周期地运行用户 调度的任务。比起传统的Unix版本,Vixie版本添加了不 少属性,而且更安全,配置更简单。
dhcpd 该精灵提供了对动态主机控制协议(Dynamic Host Control Protocol)的访问支持。


gated
gated通过一个数据库提供了网络路由功能支持。它支持 各种路由协议,包括RIP版本1和2、DCN HELLO协议、 OSPF版本2以及EGP版本2到4。


gpm
gpm为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。它也支持控制台下鼠标 的拷贝,粘贴操作以及弹出式菜单。


httpd
http是著名的www服务器,可用来提供HTML文件以 及CGI动态内容服务。


inetd
因特网操作服务程序。监控网络对各种它管理的服务的需 求,并在必要的时候启动相应的服务程序。通常,inetd 管理的程序有telnet、ftp、rsh和rlogin。 关闭inetd也就 关闭了这些由它管理的服务。


innd
inn是最流行的用户组新闻服务器。它允许您建立起本地 新闻服务器。配置有一定的难度,可以先阅读/usr/doc/ inn*文档获得帮助。



keytable 该程序的功能是转载您在/etc/sysconfig/keyboards里说 明的键盘映射表,该表可以通过kbdconfig工具进行选 择。您应该使该程序处于激活状 态。


ldap
LDAP代表Lightweight Directory Access Protocol, 实现了目录访问协议的行业标准。


linuxconf
linuxconf是Linux下的一个有效的系统配置工具,该服 务允许远程运行。


lpd
lpd是系统打印守护程序,负责将lpr等程序提交给打印 作业。


mcserv
Midnight Commander服务进程允许远程机器上的用户 通过Midnight Commander文件管理器操作本机文件。服 务进程用PAM来验证用户,需要给出“用 户名/口令” 以通过验证。


mysql 一个快速高效可靠的轻型SQL数据库引擎。


named 域名服务器,将Internet主机名解析为点分的IP地址。


netfs 负责装载/卸载NFS、Samba、NCP(Netware)文件系统。


network 激活/关闭启动时的各个网络接口。


nfs
NFS是一个流行的基于TCP/IP网络的文件共享协议。该 服务提供了NFS文件共享服务,具体的配置在/etc/ exports文件里。


nscd
该服务负责密码和组的查询,并且缓冲查询结果。如果您 的系统有比较慢的服务(如NIS和NIS+),则应该启动该 服务。


pcmcia pcmcia 主要用于支持笔记本电脑。


portmap portmap 用来支持RPC连接,RPC被用于NFS以及NIS 等服务。


postgresql PostgreSQL 关系数据库引擎。


proftpd proftpd 是Unix下的一个配置灵活的ftp守护程序。


radvd 路由广播程序。


random
保存和恢复系统的高质量随机数生成器,这些随机数是系 统一些随机行为提供的。


routed
该守护程序支持RIP协议的自动IP路由表维护。RIP主要 使用在小型网络上,大一点的网络就需要复杂一点的协议。


rstatd Rstat协议允许网络上的用户获得同一网络上各机器的性能 参数。


rusersd 该服务使网络用户可以定位同一网络上的其他用户。


rwalld
Rwall协议允许远程用户向在同一系统中活跃着的终端发送 消息,类似wall的本地行为。


rwhod
允许远程用户获得运行rwho精灵的机器上所有已登录用户 的列表,与finger类似。


sendmail 大名鼎鼎的邮件服务器。


smb 启动和关闭smbd和nmbd精灵程序以提供SMB网络服务。


snmpd 简单网络管理协议(SNMP)的守护精灵。


syslog
syslog是操作系统提供的一种机制,守护程序通常使用这 种机制将各种信息写到各个系统日志文件。通常应该启动 该服务。


xfs X的字体服务器。
ypbind NIS/YP的客户端守护程序。如果您需要使用NIS/YP机 器,请启动这项服务,否则,关闭这项服务。


yppasswd
让NIS用户能够修改密码。运行在NIS域的服务器上。客 户端程序同样也叫yppasswd。


ypserv
标准NIS/YP网络协议的一个实现。允许主机名,用户名 和其他信息分布于网络各端。运行在NIS服务器上,客户 端不需要。

在Linux中限制用户的磁盘使用空间使用的是Quota,一般Quota在安装Linux时就已包括在内核中,不需要另行安装。Quota可以从两方面指定磁盘的储存限制: 使用者所能够支配的索引节点(inodes)数量;以及使用者可以取用的磁盘区块数量。在使用Quota监视用户时,一旦用户使用空间超出缓冲值(soft)就会发出警告,如超出限定值(hard)就会禁止用户再储存文件。在 Linux上2.x 版的核心都可以使用 Quota 。使用步骤及方法如下: 
⒈开启系统Quota功能:

1 修改/etc/fstab文件,2 下面是我在我的系统上设定的值:

#device directory type options

/dev/hda1 / ext2 default 1 1
/dev/hda2 /usr ext2 default 1 1

/dev/hda3 /home ext2 default,usrquota,grpquota 1 1

下画线部分(usrquota,grpquota)为另加的部分

3 修改/etc/rc.d/rc.local文件,在文件的最后面加入下面语句:

if

   [ -x /usr/sbin/quotaon ]

then

echo ”Quota now is turning on”

/usr/sbin/quotaon -avug

4 在quota所在目录(本例为/usr/local/bin)执行quotacheck -avug,这时Quota开始检查所有子目录并建立两个文件:quota.user,quota.group

5 建立 ”quota.user” 记录

quota 记录档(quota.user) 应该由 root 拥有,即 root 有读写的权限而其他任何 人都没有。以 root身份登录Linux服务器,进入想要启用 quota 分区最上层,即如想在/usr建立quota管理:

[root@Server/usr]#touch /partition/quota.user

#chmod 600 /partition/quota.user

6 重新启动计算机

⒉设定用户或用户组的空间限定

 ①设定用户的磁盘限制:edquota -u 用户名

如我系微机室设有一帐户wlx01,当使用命令edquota -u wlx01后出现Vi界面,如下所示:

Quotaa for user wlx01:

/dev/hda3:blocks in use:0,limits(soft=0,hard=0)

inodes in use:9,limits(soft=0,hard=0)

  ”blocks in use” 是使用者在某个分割区上已经使用的区块总数(以千位元组为单位) , “inodes in use” 是使用者在某个分割区上所拥有的文件总数。其中只需修改soft和hard两项后的值,单位都是kb。Soft指定占用空间达到多少时给以警告,hard则是为用户分配的可用空间大小

 ②设定用户组的磁盘限制:edquota -g 用户组

 ③重复操作:当以设定某个用户而想重复在其他用户上时:

       edquota -p 已设定用户  需设定用户

  当使用  edquota -p wlx01  * 时所有用户都会与wlx01一样

⒊常用命令:

Repquota 

edquota –t:对 quota 使用者实行软性限制之前的时间限制。可以使用的时间单位是秒、分、小时、日、星期、以及月。软性限制指出 quota 使用者在分割区上拥有的磁盘用量总数。但是合并使用缓冲期间的时候,它的动作就如同一道临界线,当 quota

使用者超越时便发出有关他即将违犯 quota 的警告。

Time units may be: days, hours, minutes, or seconds

Grace period before enforcing soft limits for users:

/dev/hda2: block grace period: 0 days, file grace period: 0days

0 days 这个部份可变更为觉得合理的任何期限。

repquota -a : Repquota 产生文件系统关于的quota信息

Block limits File limits

User used soft hard grace used softhard grace

root – 175419 0 0 14679 00

bin – 18000 0 0 735 00

uucp – 729 0 0 23 00

man – 57 0 0 10 00

user1 – 13046 15360 19200 806 15002250

user2 – 2838 5120 6400 377 10001500

Quotaon 用来打开 quota 的计算; quotaoff 则是将其关闭,它们是在系统启动与关机时执行的。

Quota :显示用户的磁盘使用情况和上限。

参数 使用说明 

-g 显示用户所在组的组配额

-u 显示用户配额

-v 显示没有空间分配的文件系统情况

-q 显示使用情况超过配额的简要信息

原文URL: http://www.atmarkit.co.jp/flinux/special/php5/php5a.html
翻譯:Victoria / 孤獨過客

如需轉載,請指明出處
———————————————



[摘要]目前開發中的PHP5,其面向對象的機能已經被大幅度的強化了。下一代的PHP將會是怎樣的一種語言呢?下面我們來詳細講解一下目前發佈的PHP5的beta release。




(一) Zend 2.0的誕生
現在的PHP4所使用的基本文法是被稱之為Zend 引擎的腳本編譯引擎。這個就是PHP4的優良機能的原因之一,是作為對PHP3的改進而生成的一種語言。大家一直認為,PHP4的性能根據當初的目標,比PHP3有了很大的提升,在網絡編程的世界裡佔據了很大的份額。

開發了Zend 引擎的Zend公司是在開發PHP4的同時,由PHP3的主要開發者Zeev Suraski和Andi Gutmans所創立的企業合併而來的。Zend的名稱是由Zeev和Andi的名字合起來組成的。Zend公司的商業模式是,持續不斷的為open source提供zend 引擎的PHP內核 (core),同時提升周邊產品開發和販賣的利益。以open source software作為基盤的商業,在世界範圍內大多數正在苦戰的企業中,算是比較好的典型例子了。

■PHP4的局限

托PHP4成功的福,這個用途的適用範圍逐漸變廣起來。作為企業級的用途而使用PHP的說法時有所聞。因此,就有了這樣一個問題,構築大規模網站的時候,代碼的再利用性十分差。具體來說就是,PHP4的面向對像性能很弱,因此習慣於使用Java等的技術人員對此有很多的抱怨。

逐步的改善PHP4的面向對象的性能,大幅度的更改基本文法,開發者達成了更新PHP記述方法的開拓目的。

■Zend 2.0開始開發
隨後,Zend公司PHP中心的開發者們在2001年7月發表了作為下一代PHP語言引擎的Zend 2.0引擎的構想。以[Zend Engine version 2.0: Feature Overview and Design](http://www.zend.com/engine2/ZendEngine-2.0.pdf)作為目標的同時,面向對象的性能大幅度的強化了。

目前的PHP4 Zend 引擎的擴張情況與昔日的PHP3如出一轍。這就意味著,要提升新的語言引擎的主版本號,明確方法目標,迎接來自開發團體的稱讚。

Ze2的開發,與以往的Zend引擎一樣,都是運行在open source的模式下的。最新的源代碼在CVS上被全面的公開,因為是面向開放的開發者的,關於開發的議論非常的活躍。

現在Ze2被決定採用於PHP的下一個版本PHP5中。最終發佈的時間現在還未定,但是假如根據Zend公司2003年4月1日發佈的Newsletter的話,現在的應該就是Beta Release了。

摘要]目前開發中的PHP5,其面向對象的機能已經被大幅度的強化了。下一代的PHP將會是怎樣的一種語言呢?下面我們來詳細講解一下目前發佈的PHP5的beta release。




(二) PHP5的新特性

接下來請按照順序看一下被強化的PHP5的性能。首先是最為重要的面向對像性能,類的實體特性在大幅度的被修改著。這裡說的僅是關於類的新特性。

· 對象的參照過渡是默認的(default)
· 引入訪問屬性的限制
· 引入訪問方法的限制
· 抽像類和抽像方法
· 接口
· final聲明
· 名空間
· 類內常量
· 類變量
· 統一構建器
· 析構函數(Distructor)
· 其他附屬特性

以上內容是根據2003年4月22日CVS上登錄版本資料所寫的,在正式的發佈之前,也有變動的可能性。

■對象的默認參照過渡

在PHP4中,在以變量$var1為類的實體對象的時候,如果$var2 = $var1;那麼,在$var2中,$var1的複製被代入。明顯的,$var2為了指向與$var1相同的對象,就要寫成$var2 =& $var1,必須要加上&作為參照。
而在PHP5,對象的代入將成為自動的參照過渡。也就是說,$var2=$var1,兩者指向相同的對象。如果想要同php4一樣,帶入copy,那麼就會運用到導入__clone()的方法。
$var2 = $var1->__clone();此處,clone前面是兩個連續的「_」
(這僅僅是類的實體的特性)

■引入訪問屬性的限制

在PHP4的類中,連同屬性和方法在內,可以自由的訪問類的內外任何地方,而沒有限制。因此,用戶就無法防範屬性的無意中的更改。

而在PHP5中,同C++和Java一樣,導入了private, protected, public三個等級的訪問限制,使得類的設計者能夠對屬性和方法的使用方法進行限定。以下是各種訪問限制的意思。

· Public: 可以自由的在類的內外任何地方進行參照、變更
· Private: 只能在這個類的方法中進行參照、變更
· Protected:能夠在這個類以及繼承了這個類的另一個類的方法中進行參照、變更。另外,在繼承的類中,能夠寫入訪問指定。

在PHP4中的「var」,同以往一樣與public有著相同的意思。下面就來舉一個例子,讓我們來看看訪問限制是怎樣起作用的。

class Hoge1 {
 private $var1 = ‘A’;
 protected $var2 = ‘B’;
 protected $var3 = ‘C’;

 function setLower() {
  $this->var1 = ‘a’;
  $this->var2 = ‘b’;
  $this->var3 = ‘c’;
 }
 function var1() {
  return $this->var1;
 }
 function var2() {
  return $this->var2;
 }
 function var3() {
  return $this->var3;
 }
}

在這個類中,帶有$var1, $var2, $var3三個屬性。$var1被聲明為private, $var2和$var3是protected.在此處

$hoge=new Hoge1;
echo』var1:』.$hoge->var1.」
\n」

如果嘗試參照不允許從外部進行訪問的private屬性,那麼就會出現如下錯誤:

Fatal error: Cannot access private property hoge1::$var1 in /path/to/script.php on line XX

對於protected的$var2也是相同的。

但是,因為$hoge的方法是沒有private和protected的,所以下面的代碼能夠正常運作,返回內部私有和保護變量的值。

echo ‘var1: ‘ . $hoge->var1() . “
\n”; // var1: A
echo ‘var2: ‘ . $hoge->var2() . “
\n”; // var2: B
echo ‘var3: ‘ . $hoge->var3() . “
\n”; // var3: C

$hoge->setLower();

echo ‘var1: ‘ . $hoge->var1() . “
\n”; // var1: a
echo ‘var2: ‘ . $hoge->var2() . “
\n”; // var2: b
echo ‘var3: ‘ . $hoge->var3() . “
\n”; // var3: c

其次,為了能夠看到protected的屬性的狀態,我們試著創造了繼承了Hoge1的類Hoge2

class Hoge2 extends Hoge1 {
 public $var3 = ‘3′;

 function d_var1() {
  return $this->var1;
 }
 function d_var2() {
  return $this->var2;
 }
 function d_var3() {
  return $this->var3;
 }
}

在類Hoge2中,只有$var3被聲明為public。在屬性是protected的情況下,從子類進行訪問有何種限制,是由子類的屬性聲明決定的。在Hoge2中,因為$var3被聲明是public,因此無論是從何處都可以訪問Hoge2的$var3(實體是Hoge1的$var3)。因為$var1在Hoge1中是private,因此,在Hoge2子類中Hoge1的$var1不會被繼承,而在Hoge2中有可能會做出名為$var1的屬性,因此,必須要明確區分Hoge1::$var1和Hoge2::$var1。

$hoge = new Hoge2;

echo ‘var1: ‘ . $hoge->var1 . “
\n”;   // var1:
// echo ‘var2: ‘ . $hoge->var2 . “
\n”;  // Error
echo ‘var3: ‘ . $hoge->var3 . “
\n”;   // var3: 3

echo ‘var1: ‘ . $hoge->d_var1() . “
\n”; // var1:
echo ‘var2: ‘ . $hoge->d_var2() . “
\n”; // var2: B
echo ‘var3: ‘ . $hoge->d_var3() . “
\n”; // var3: 3

$hoge->var1是與Hoge1::var1沒有關係的變量,因此不會有任何顯示,因為var2有protected訪問限制,所以如果不通過method就直接參照$var2,就會出現致命錯誤。

■引入訪問方法的限制

與上述相同,此處也分為private, protected, public三種。

· Public: 能夠從任何地方調用
· Private: 只能夠從這個類的method內調用
· Protected: 只能夠從這個類以及subclass的method中調用

此處的意思同Java和C++相同,請不要搞混。

■抽像(abstract)的類和抽像的方法

支持與Java相同的抽像類和抽像方法。抽像方法只提供了方法名的調用方式,而沒有提供實體。另外,持有抽像方法的類,必須抽像宣言類本身。如果想要直接作成抽像類的對象,那麼就會出現如下的致命錯誤。

Fatal error: Cannot instantiate abstract class ClassName

產生錯誤的實際的例子如下所示:


abstract class MyAbstract {
 abstract public function test();
 public function test2() {
  echo “MyAbstract::test2() called.
\n”;
 }
}

class MyImplement extends MyAbstract {
 public function test() {
  echo “MyImplement::test() called.
\n”;
 }
}

$obj = new MyImplement;
$obj->test();

?>

■接口(interface)

支持與Java相同的接口(interface)。接口是適合所描述的外部調用形式而設計組合起來的。
接口的實體不能夠記錄。相反的,實現接口的類必須持有與這個接口的方法相對應的實體。另外,類能夠實現多個接口,因此,有可能實現多重繼承。

interface Throwable {
 public function getMessage();
}

interface Serializable {
 public function toString();
}

class MyException implements Throwable, Serializable {
 public function getMessage() {
  return ‘this is MyException message’;
 }

 public function toString() {
  return ‘MyException: this is MyException message’;
 }
}

$e = new MyException;
echo $e->getMessage();
echo $e->toString();
?>

■final聲明

同Java一樣,PHP5支持final聲明。如果對於一個方法追加final聲明,這個方法將肯定在子類不能重載(Override)。如果方法被final聲明了,但是還在子類中重載,就會出現如下錯誤:

Fatal error: Cannot override final method fuga::foo()

產生錯誤的例子:
class Fuga {
 final function foo() {
  echo “this is final function\n”;
 }
}

class Hoge extends Fuga {
 function foo() {
  echo “this is not final function\n”;
 }
}
?>

[摘要]目前開發中的PHP5,其面向對象的機能已經被大幅度的強化了。下一代的PHP將會是怎樣的一種語言呢?下面我們來詳細講解一下目前發佈的PHP5的beta release。




(三) PHP5的新特性(續)

PHP5的發佈計劃

在前面的文章中我們提到,「根據ZEND公司2003年4月1日發佈的訊息的話,現在的應該就是Beta Release了」,但是開發者內部討論的結果是,Beta為時尚早,而且有可能不是Beta Release.

對這方面動向有興趣的可以參照 news://news.php.net/ 上所公佈的信息 php.version5.dev:372

在這個文件中,PHP5的發佈計劃又重新回到了一張白紙,而另一方面,Zend Engine2的開發正在著手進行中。PHP5的Release其實大體就是盼望著「快點到年終吧」。

PHP5的新特性

接著我們來看一下在前面所講到的其他一些關於類的新增的機能

■名空間

PHP5支持名空間。因此,我們可以在名空間內裝入類、變量、常量、函數。

在PHP4的Scope中,只有global、函數內、類內這三個種類,所以要特別注意如果不注意的話,將會很容易「污染」global空間。假如使用名空間的話我們就能夠在package裡分離變量命名空間,因此應該就能比較容易的做成獨立的package。

使用實例如下:

namespace This {
 class Hoge {
 }
 const aConstant = ‘This Constant’;
 function aFunction() {}
 var $aVariable = ‘This Variable’;
}

$obj = new This::Hoge;
echo This::aConstant . “
\n”;
This::aFunction();
echo This::$aVariable . “
\n”;

假設要訪問名空間內的對象的話,就應該這樣做:

名空間名::對像名

但是PHP5的名空間不會套入與C++相異的樣子。

■Class內常量

使用關鍵字const,能夠在類、名空間內定義常量。這裡因為是常量,因此一定要在常量名的前面加上$。Class內的常量,比這個類中的global常量的優先級要高。

在這裡const是預約語,因此在class名和函數名中使用const的時候要做必要的修正。

define(‘constant_value’, ‘global constant’);

class MyClass {
 const constant_value = ‘class constant’;

 function printConstant() {
  print constant_value;
 }
}

echo MyClass::constant_value . “
\n”;
MyClass::printConstant();
?>

在這個例子裡,MyClass::printConstant()是顯示常量constant_value的值,但是,constant_value存在於global空間和Class內這兩個地方。在這種情況下,MyClass內的常量constant_value的優先級較高,被顯示為「class constant」。

■對像變量

即使是在類沒有被實例化狀態下,對像變量也能準確的按照指定的值被初始化。訪問的方法如下:

類名::$變量名

class Hoge {
 static $my_static = 5;
}

print Hoge::$my_static;
?>

■統一構建器

在生成對象的時候,能夠自動被調用的方法被稱作「構建器」。

PHP4中的構建器,是與Class名相同的方法名。這是與Java和C++相同的地方,因此,對於一些用慣了的人來說,不會有彆扭感。但是,如果要從子類中調用父類的構建器的話,在PHP中就必須特意寫上父類的名字。

在PHP中,父類的構建器不能被自動調用,因此,情況就比較多。
在PHP5中,統一採用了__constructor這個構建器名稱,不管class名是什麼,凡是被稱為__construct()的,都被當作構建器來處理。

另外,考慮到同PHP4的互換性,假如存在於Class名相同的以前的構建器名,那麼,優先使用那個構建器。

class BaseClass {
 function __construct() {
  print “In BaseClass constructor\n”;
 }
}

class SubClass extends BaseClass {
 function __construct() {
  parent::__construct();
  print “In SubClass constructor\n”;
 }
}

$obj = new BaseClass();
$obj = new SubClass();
?>

■析構函數

與構建器相反,能夠在對像釋放時自動被調用的方法被稱為析構函數。

PHP4支持析構函數,通過登錄在PHP運行終止時用register_shutdown_function()調用的函數,只有類似的實行方法。PHP5正式支持析構函數,能夠在類中指定對像釋放時的動作。

析構函數就是名為__destruct的方法。當對像內部的參照計數器變成0的時候,__destruct()被調用,然後對像所使用的內存被釋放出來。

class MyDestructableClass {
 function __construct() {
  print “In constructor\n”;
  $this->name = ‘MyDestructableClass’;
 }

 function __destruct() {
  print ‘Destroying ‘ . $this->name . “\n”;
 }
}

$obj = new MyDestructableClass();
?>

另外,與構建器相同的地方是,父類的析構函數不能被自動的調用,必要的時候,需要用命令:

parent::__destruct();

■訪問

在PHP4中,如果訪問了一個不存在的屬性,那麼系統就會自動生成與之相對應的新屬性。

class Hoge {
}

$obj = new Hoge;
$obj->prop = “This is new property”;

如上所示,當把值代入一個不存在的屬性時,那個代入點就會自動生成一個新屬性。同樣的,訪問一個不存在的屬性,就如同被代入NULL值的變量一樣,不會發生錯誤。

在PHP5中追加了一點,就是能夠對訪問任意的屬性進行控制。在類中如果存在__set()、__get()這樣的方法,替代上述的動作此處的方法將能夠被調用。例如:

class Hoge {
 function __set($name, $value) {
  print “__set() is called with ($name, $value)\n”;
  $this->$name = $value;
 }
}

$obj = new Hoge;

$obj->a = ‘123′;
$obj->a = ‘456′;
$obj->b = ‘789′;
?>

在這裡,__set 方法被作為未定義屬性的代入方法,在顯示值之後將值代入未定義屬性。

$obj->a = ‘123′;

執行這一句時,因為在這個時候不存在屬性a,因此,作為代替,__set 方法被調用。

__set() is called with (a, 123)

其次,

$obj->a = ‘456′;

再一次的代入$obj->a,這一次,由於屬性a已經存在,所以__set 沒有被調用,和通常一樣把值代入到了屬性a中去了。

$obj->b = ‘789′;

這一回,我們把值代入另一個屬性b中,同a的第一次情況一樣,

__set() is called with (b, 789)

同__set 方法相反,__get 方法是在對不存在的屬性的引用時調用的。將這兩者結合起來,再來看一下對於屬性的訪問,實際上,利用它能夠寫出在不同的場合都能做出不同響應的類來。

class Hoge {
 public $properties;

 function __set($name, $value) {
  $this->properties[$name] = $value;
 }
 function __get($name) {
  return $this->properties[$name];
 }
}

$obj = new Hoge;

$obj->a = ‘123′;
$obj->b = ‘456′;
echo $obj->a;
echo $obj->b;

print_r($obj);
?>

在這個例子裡,對類中所有屬性的訪問被裝入了$properties中,這樣,使我們加入的屬性不直接的附在對像之下。這是個不太能容易理解的例子,例如,試著把這個例子中的保存到$properties改成存入文件或是數據庫會很有趣吧。實際上,在對像裡面,我們能夠簡單的實現讓許多的複雜的操作。

與__set, __get多少有些不同,但是__call也能用來書寫不存在的方法,當我們向如下例子一樣調用對象的方法的時候,

$object->methodname();

如果這個類中不存在methodname這個方法,通常情況下,就會出現如下錯誤:

Fatal error: Call to undefined method Class::methodname()

但是,如果這個類中存在__call這個方法,作為替代,__call就被調用。__call的參數有兩個,第一個參數是被叫出的方法名,第二個參數是保持了的被調用的參數的數組。考慮到有很多的使用方法,除了以下的例子外,還可以使用其它的方法。

class Proxy {
 private $object;

 function __call($name, $params) {
  if (isset($this->object)) {
   if (method_exists($this->object, $name)) {
   return call_user_func_array(array($this->object, $name), $params);
   }
   else {
   return “method not exists.”;
   }
  }
 }
 function __construct($object) {
  $this->object = $object;
 }
}

class Hoge {
 function add($var1, $var2) {
  return $var1 + $var2;
 }
}

$p = new Proxy(new Hoge);

$result = $p->add(1, 2);
echo “result: $result
\n”;

$result = $p->sub(5, 3);
echo “result: $result
\n”;
?>



  與類相關的一些擴充的功能大體上都講過了。下面,我們再來講述一下類以外的擴充的功能。

■參數的值修改後可以傳回

  有時候我們會想要收回函數的參數,「想要寫回數組」等等,而在PHP4中,我們是不能夠設定參照的參數的默認值的。

  在PHP5中,這一點就能夠得以實現。另外,當對像為參數的時候,正如前編裡講的一樣,即使不加上」&」也能夠參照過渡,所以不需要特別注意。

 function some_func(&$var == null) {
  if ($var == null) {
   // 不需作特殊處理
  }
 }
?>

■__autoload()

  當我們使用不存在的類的程序的時候,通常是以error告終。但是,假如存在__autoload()這個函數的話,我們就可以在錯誤發生前調用這個函數。在__autoload()內,如果讀入include_once等類的定義文件,就可以不發生錯誤繼續進行處理。

  在大規模的PHP站點,必定會有在一次運行中讀入大量文件的情況發生,因為只讀入了必要的類,所以減輕了負荷,__autoload也許會很好用也不一定啊。看看下面的例子,自動讀取所需要的類的定義文件:

function __autoload($className) {
 include_once $className . ‘.php’;
}

$object = new ClassName;
?>

■例外處理

  在編寫代碼的時候,錯誤的處理是避而不談的事項。因為在每次的錯誤的時候去檢查函數和方法中返回的值的確實是一件麻煩的事情。為了避免這些麻煩,就有了把例外處理當作文法來看待的語言。而PHP5就支持這個功能的語言。

  在文法方面,同Java和C++一樣,我們流行用catch{}這個命令來處理用try{}這個命令投入的例外。但是,同上述的兩種語言不同的是,PHP5的例外方法中只能投入對象。另外,在用catch{}獲取例外的時候,必須要靈活指定所獲取的例外類型。所以在使用的時候,一般會使用複數的catch{},以避免漏掉的例外。

  由於對例外處理的支持,形成了try、throw、catch這三個預約語。所以原有的PHP4代碼中如果有使用這三個詞作函數名的,必須作出修正。

看一下下面的例子,使用自定義的例外。

class MyException {
 function __construct($exception) {
  $this->exception = $exception;
 }
 function Display() {
  print “MyException: $this->exception\n”;
 }
}

class MyExceptionFoo extends MyException {
 function __construct($exception) {
  $this->exception = $exception;
 }
 function Display() {
  print “MyExceptionFoo: $this->exception\n”;
 }
}

try {
 throw new MyExceptionFoo(‘Hello’);
}
catch (MyException $exception) {
 $exception->Display();
}
?>

■回溯

  從PHP-4.3.0開始支持debug_backtrace函數。因為是使用Zend Engine 2.0開發的,能夠在PHP4中把有用的東西back trace出來。使用這個函數的時候,能夠取得在這個時點調用函數的信息。

詳細的請參閱一下網址:http://www.php.net/manual/zh/function.debug-backtrace.php

■與PHP4的兼容性

  講到與PHP4的兼容性,正如前面幾篇講到的,雖然文法有了很大的變化,但在保留了向下兼容的同時,還補充一些關鍵字。還有在使用常量和函數、類等等的時候要都做出了必要的修正。

新增加的關鍵字:

  public、protected、private
  abstract、interface、implements
  final、namespace、import、const
  try、throw、catch

  即使是關於對像功能,筆者也剛剛試了一下手頭的幾個類,並沒有什麼問題。但是也沒有全部都運行一遍。例如,pear命令在現在的PHP5中不能夠很好的運作。與pear命令並列的PEAR Framework,因為能夠活用PHP4的對象機能,即使不改也是很不錯啦。(笑)

    五一长假没有事情作,昨天去small家鬼混,电影看到半夜,突然灵感降临,研究了一下php的mvc模式和多语言实现,不敢私吞,拿出来与


大家分享。
   
    1。看了一些资料:
    http://www.phpe.net/articles/390.shtml PHP:MVC迷思
    http://www.phpe.net/articles/382.shtml MVC模式的PHP实现
    参考了phpbb的编程思路。
   
    2。动手


    其实mvc思路并不难,但是网上的文章写的有些假大空,都是概念型的,在调用数据库的时候使用类似$abc = new db;这样的写法我2001年


就这么写了,随着自己编程的深入,肯定会有很多的class分离出来以便更高效的开发,很自然就会写出mvc结构的东西的。
    php的mvc和java的比起来少了sessionbean,这样php页面执行完毕,所有的class和值就都消失了,只能存在session或者cookies里面,这


个没有办法,谁让php没有自己的容器(java的说法)呢?没有自己的http服务肯定不行,asp还有个application呢!不过asp是基于iis的,呵


呵。建议php和apache再深入合作一下搞个“phpapplication”什么的 哈哈!
    好了废话不说,现状摆在面前,客服困难吧!
    如果你不清楚mvc结构,请访问:http://tech.163.com/tm/030622/030622_99290.html 如何合理利用MVC设计模式运用到开发Java应用程


序 (不过讲的是针对java的)
    不多谈mvc,进入正题。
    我参考和简化了phpbb中的模板调用函数(phpBB2\includes\template.php),去掉了里面专门为phpbb设计的function。
    实现思路是这样的:
    i。判断要用那个语言版本和模板;
    ii。读入语言版本对应的数组文件和对应的模板文件;
    iii。其他语句;
    ix。将要替换的变量写进函数;
    x。替换模板中的变量并输出结果。


    3。代码
##########################################################3
index.php
———
<?
include_once(“template.php”);
$loadtpl = new template;
//判断语言
switch ($nowlang) {
    case “zh_cn”:
        $lang_now = “lang_zhcn”;
        break;   
    case “en”:
        $lang_now = “lang_en”;
        break;
    default:
        $lang_now = “lang_en”;
}
include_once($lang_now.”.php”);
//判断模板
switch ($nowtpl) {
    case “tpl1″:
        $tpl_now = “tpl1″;
        break;   
    case “tpl2″:
        $tpl_now = “tpl2″;
        break;
    default:
        $tpl_now = “tpl1″;
}
$loadtpl->gettpl($tpl_now.”.tpl”);


//商业逻辑
$timer=getdate();
$thistime=$timer["year"].’-’.$timer["mon"].’-’.$timer["mday"].’


‘.$timer["hours"].’:’.$timer["minutes"].’:’.$timer["seconds"];


//其他的与数据库交互的部分省略,直接把数据结果带进去
$myname = ‘普罗米修斯’;
$myage = ‘24′;
$mylove = ‘计算机’;


//将数据带入class,前一部分是语言常量,后一部分是本页面生成的变量
$loadtpl->assign_vars(array(


    ‘name’=>$lang['name'],
    ‘age’=>$lang['age'],
    ‘interest’=>$lang['love'],
    ‘title’=>$lang['title'],
    ‘now_tpl’=>$lang['now_tpl'],
   
    ‘myname’=>$myname,
    ‘myage’=>$myage,
    ‘mylove’=>$mylove,
    ‘nowtime’=>$thistime,
   
    ‘goto’=>’
    <form action=”index.php”>
<select name=nowlang>
<option value=”zh_cn”>chinese_zh</option>
<option value=”en”>english</option> 
</select>
<select name=nowtpl>
<option value=”tpl1″>blue</option>
<option value=”tpl2″>black</option> 
</select>
<input type=submit value=”go”>
</form>’)
);


//替换模板内容,写出结果
$loadtpl->dotpl();


?>
============
template.php (模板类)
————
<?
class template
{
    var $tplcontent;
    var $tpldata = array();
    //读入模板
 function gettpl($tplfile)
 {
  $tplf = implode(“”, @file($tplfile));
  $this->tplcontent = $tplf;
  return true;
 }
 //读入对应变量
 function assign_vars($arrayvar)
 {
  $this->tpldata = $arrayvar;
  return true;
 }
 //替换并显示网页内容
 function dotpl()
 {
  while (list ($key, $val) = each ($this->tpldata))
  {
   $$key = $val;
        }
        $tplstr = $this->tplcontent;
     $tplhaha = eval( “\$tplstr = \”$tplstr\”;” );
     echo $tplstr;


  return true;
 }


}
?>
================
tpl1.tpl (模板1)
—————-
<html>
<title>{$title}</title>
<body bgcolor=blue>
<h3><font color=999999>{$title}</h3>{$goto}{$now_tpl}:{$nowtime}


<hr>
·{$name}:{$myname}
·{$age}:{$myage}
·{$interest}:{$mylove}
</font>
</body>
</html>
================
tpl2.tpl (模板2)
—————-
<html>
<title>{$title}</title>
<body bgcolor=#999999>
<h3><font color=white>{$title}</h3>
<hr>
1.{$name} :{$myname}<br>
2.{$age} :{$myage}<br>
3.{$interest} :{$mylove}<br>
4.{$now_tpl} :{$nowtime}<br>
{$goto}</font>
</body>
</html>
==========================
lang_en.php (英文版本常量)
————————–
<?
$lang['name'] = ‘name’;
$lang['age'] =’age’;
$lang['love'] =’interest’;
$lang['title'] =’readme’;
$lang['now_tpl'] =’date’;
?>
============================
lang_zhcn.php (中文版本常量)
—————————-
<?
$lang['name'] = ‘姓名’;
$lang['age'] =’年龄’;
$lang['title'] =’自荐信’;
$lang['love'] = ‘爱好’;
$lang['now_tpl'] =’现在时间’;
?>
######################################
不需要应用数据库,就能体会mvc结构的多语言版本和模板实现。


    4。没有搞定的问题
       template.php中的这一段
########################################3333 
        //读入对应变量
 function assign_vars($arrayvar)
 {
  $this->tpldata = $arrayvar;
  return true;
 }
############################################
中我想实现在index.php中可多次增量方式的写入对应变量到class中的数组,但是没有找到增量合并的方法,希望大家指教。


 


code by 普罗米修斯
qq:5896340
mail:tssungeng@msn.com


注:本文为原创作品,如有转载请注明作者。 

2004年05月05日

anacron


你可以运行 anacron 来让你的系统指定每隔几天来定期执行一些命令。与 cron 不同,它并不假定机器是在持续运作。因而,它可以用在不是一天二十四小时都在运行的机器上,来控制通常被 cron 命令控制的每日、每周、和每月的作业。


--------------


apmd
apmd用来监视系统用电状态,并将相关信息通过syslogd 写入日志。也可以用来在电源不足时关机。


--------------


 








出自:http://www.xici.net 大鹰 2002年07月01日 20:19

前言
呵呵,这篇文章的目的在于让读者对linux的安全配置有个大概的了解,呵呵,因为我也看过一些关于这方面的文章,说的太空了,呵呵
其实我觉得linux机器要做一般的安全配置的话,分分钟就搞定了,嘿嘿
1,安装
安装的时候,大家都轻车熟路了,呵呵,首先,隔离网络进行系统安装,当然选择custom方式,安装你需要的软件包。
硬盘分区:如果用root分区纪录数据,如log文件和email,就可能因为拒绝服务产生大量日志或垃圾邮件。导致系统崩溃。所以建议为/var开
辟单独的分区,用来存放日志和邮件,以避免root分区被溢出啦,那就惨喽。最好为特殊的应用程序单独开一个分区,特别是可以产生大量日
志的程序,还有建议为/home单独分一个区,这样他们就不能填满/分区了,以下是我硬盘上的分区情况:
/   root
/var  log
/hacking  嘻嘻,我的一些黑软
swap   不多说了
/home
当系统安装完重新启动后,最好打上相应系统的安全补丁,请大家养成良好的习惯,记住,你不是在自己家里装98,你装的是一个linux服务器
,呵呵。对于redhat系统而言可以在:http://www.redhat.com/corp/support/errata/找到补丁。
在redhat6.1以后的版本带有一个工具up2date,它能够测定哪些rpm包需要升级,然后自动从redhat的站点下载并完成安装。
2,关闭服务
呵呵,有句话说的好,要想你的系统绝对安全,就是掐断网线,呵呵,当然我们的机器要对外提供服务,那是不现实的,所以关闭不必要的服
务是必要的,因为有些服务会为您的系统带来麻烦。
默认的linux就是一个强大的系统,运行了很多的服务。但,有许多服务是不需要的,很容易引起安全风险。第一个文件是/etc/inetd.conf,
它制定了/usr/sbin/inetd将要监听的服务,你可能只需要其中的两个:telnet和ftp,其他的许多如popd,imapd和rsh都是有可能引发安全问题
的。用下面的命令显示没有被注释掉的服务:
suneagle# grep -v “#” /etc/inetd.conf
ftp   stream tcp   nowait root  /usr/sbin/tcpd in.ftpd -l -a
telnet stream tcp   nowait root  /usr/sbin/tcpd in.telnetd
shell  stream tcp   nowait root  /usr/sbin/tcpd in.rshd
login  stream tcp   nowait root  /usr/sbin/tcpd in.rlogind
talk  dgram  udp   wait  nobody.tty   /usr/sbin/tcpd in.talkd
ntalk  dgram  udp   wait  nobody.tty   /usr/sbin/tcpd in.ntalkd
pop-3  stream tcp   nowait root  /usr/sbin/tcpd ipop3d
imap  stream tcp   nowait root  /usr/sbin/tcpd imapd
finger stream tcp   nowait nobody /usr/sbin/tcpd in.fingerd
linuxconf stream tcp wait root /bin/linuxconf linuxconf –http
exec  stream tcp   nowait root  /bin/sh sh -i
哈哈,大家看最后一行,不就被绑了个rootshell么?呵呵,有什么后果?呵呵看看,在远程的一台win2000机器上用如下命令:
E:\cmd>nc 192.0.0.88 512
bash# id
id
uid=0(root) gid=0(root) groups=0(root)
bash#
知道了吧?嘿嘿,大家注意哦*^_^*
我有写过一篇关于用这个文件绑后门的文章,呵呵,攻击性很强,这个命令可以帮你查出有没有后门,呵呵。
下个要启动的是.rc脚本,它们决定了init进程要启动哪些服务。redhat系统下,这些脚本在/etc/rc.d/rc3.d(如果你的系统以x为默认启动的
话,就是/etc/rc.d/rc5.d)。要在启动时禁止某个服务,只需要把大写的S替换为小写的s,同时,redhat也提供一个工具来帮助你关闭服务,
输入/usr/sbin/setup,然后选择”system services”,就可以定制系统启动时跑哪些服务。另外一个选择是chkconfig命令,很多linux版本的系
统都自带这个工具。脚本名字中的数字是启动的顺序,以大写的K开头的是杀死进程用的。
以下是一些主要的服务:
S05apmd   笔记本需要
S10xntpd   网络时间协议
S11portmap  运行rpc服务必需
S15sound   声卡相关
S15netfs   nfs客户端
S20rstatd   避免运行r服务,远程用户可以从中获取很多信息
S20rusersd
S20rwhod
S20rwalld
S20bootparamd 无盘工作站
S25squid   代理服务
S34yppasswdd NIS服务器,此服务漏洞很多
S35ypserv   NIS服务器,此服务漏洞很多
S35dhcpd   dhcp服务
S40atd    和cron很相似的定时运行程序的服务
S45pcmcia   pcmcia卡,笔记本
S50snmpd   SNMP,远程用户能从中获得许多系统信息
S55named   DNS服务
S55routed   RIP,没有必要就别运行它
S60lpd    打印服务
S60mars-nwe  Netware的文件和打印服务
S60nfs    NFS服务器,漏洞极多
S72amd    automount,mount远程用的
S75gated   另外一种路由服务,例如OSPF
S80sendmail 邮件服务,如关闭,仍然可以发信,只是不能收信和作中继
S85httpd   web服务器
S87ypbind   NIS客户端
S90xfs    X font服务器
S95innd    News服务器
Slinuxconf  这个都熟悉吧,呵呵,通过浏览器远程管理系统用的
用这个命令察看在关闭启动脚本之前有多少服务在运行:
suneagle# ps -eaf|wc -l
54
我的系统有54种服务在运行呢,呵呵
当你关闭一些服务以后,重新运行以上命令看看少了多少服务。运行的服务越少,系统自然越安全了,嘿嘿。用下面命令察看哪些服务在运行

suneagle# netstat -na –ip
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address      Foreign Address     State
tcp    0  136 192.0.0.88:23      192.0.0.5:1236     ESTABLISHED
tcp    0   0 192.0.0.88:23      192.0.0.8:1113     ESTABLISHED
tcp    0   0 192.0.0.88:139     192.0.0.8:1112     ESTABLISHED
tcp    0   0 192.0.0.88:1024     61.153.17.24:23     ESTABLISHED
tcp    0   0 192.0.0.88:23      192.0.0.8:1084     ESTABLISHED
tcp    0   0 0.0.0.0:139       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:80       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:25       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:515       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:512       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:98       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:79       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:143       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:110       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:513       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:514       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:23       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:21       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:113       0.0.0.0:*        LISTEN
tcp    0   0 0.0.0.0:111       0.0.0.0:*        LISTEN
udp    0   0 127.0.0.1:1024     0.0.0.0:*
udp    0   0 192.0.0.88:138     0.0.0.0:*
udp    0   0 192.0.0.88:137     0.0.0.0:*
udp    0   0 0.0.0.0:138       0.0.0.0:*
udp    0   0 0.0.0.0:137       0.0.0.0:*
udp    0   0 0.0.0.0:518       0.0.0.0:*
udp    0   0 0.0.0.0:517       0.0.0.0:*
udp    0   0 0.0.0.0:111       0.0.0.0:*
raw    0   0 0.0.0.0:1        0.0.0.0:*        7
raw    0   0 0.0.0.0:6        0.0.0.0:*        7
呵呵,我这个系统由于测试用,所以故意开了不少危险端口,呵呵,大家别学我哦,该关的就关啦,哈哈。
3,日志纪录和增强
关闭一些不必要的服务以后,日志也是需要我们关心的一块,配置好的unix系统日志非常强大,甚至可以做出陷阱,关于日志,我可以写长篇
大论,这里就不很详细讲述日志的原理了,感兴趣的朋友可以参考相关资料或阅读我的另一篇文章《solaris系统日志原理》。
好!所有的日志都在/var/log下(仅对linux系统而言),默认情况下linux的日志就很强大了,除了ftp。但我们可以通过修改/etc/ftpaccess
或者/etc/inetd.conf,来保证每一个ftp连接日志都能够纪录下来。下面是一个修改inetd.conf的例子:
ftp  stream  tcp  nowait  root  /usr/sbin/tcpd  in.ftpd -l -L -i -o
-l 每一个ftp连接都写到syslog
-L 纪录用户的每一个命令
-i 文件received,纪录到xferlog
-o 文件transmitted,记录到xferlog
账号的安全问题
删除/etc/passwd&/etc/shadow中的一些系统账号,如mail,news等等。尽量关闭匿名ftp服务,删掉ftp用户。
/etc/ftpusers文件,包含了不能使用ftp的用户列表,root应该在其中。
修改/etc/securetty,去除终端ttyp0-ttyp9,使root只能从console或者使用ssh登陆。/etc/issue,不要让次文件透露系统信息。同时要修改
/etc/rc.d/rc/local。
SUID程序是非常危险的,这些程序被普通用户以euid=0(即root)的身份执行,只能有少量程序被设置为SUID。用一下命令列出系统的SUID二
进制程序:
suneagle# find / -perm -4000 -print
用chmod -s去掉一些不需要程序的suid位。
4,连接服务器
作为系统管理员,需要经常对系统进行关系和上传文件,这些通过通信过程必须要保证是安全的。我介绍两个方法:ssh和tcp wrappers。
其实我比较偏向于用ssh,它把你和防火墙之间的通信全部进行了加密,而tcp wrappers没有做到加密一点,呵呵虽然现在先进的sniffer技术
也可以嗅探到ssh的数据包,但它依然还是最安全的。建议用ssh完全取代telnet/ftp,它能够确保数据在网络中的安全传输。ssh和tcpwrapper
都有它们自己的日志纪录,并设有访问控制策略,大家如果要深入了解ssh的话,可以参考想关书籍。
tcpwrappers尽管没有对数据进行加密,但它有日志系统并且可以控制哪些人可以访问你的系统,它在inetd中包装了其他的二进制文件,如
telnet,ftp,finger等等。系统用tcpwrapper进行inetd监听连接,记录了所有请求并且与访问控制列表作比较,如果允许连接,tcpwrapper将
调用实际的服务器进程来连接,如in.telnetd服务,如果拒绝,连接将断开。对linux用户比较幸运的是tcpwrapper已经被默认安装了,我们所
要做的就是编辑/etc/hosts.allow和/etc/hosts.deny两个文件,注意以下事项:
1,尽量使用ip
2,首先通过/etc/hosts.deny禁止来自任何地方对所有服务的访问:ALL:ALL
然后在/etc/hosts.allow中添加要授权的机器及服务。冒号左边为服务,冒号右边为授权机器。
5,加固系统
一上的措施足以应付一般的网络攻击,但你的系统不是100%安全的,从来就没有绝对安全的系统,不是么?嘿嘿。我们来进一步加固系统!
编辑/etc/groups,增加wheel组(其实我很喜欢freebsd的地方,就是默认freebsd这些工作做的很好)。这个组包含了一些用户,可以执行
/bin/su等强大的命令。对其他用户执行这些命令的控制,可以改善系统的安全。如下命令:
suneagle# /bin/chgrp wheel /bin/su
suneagle# /bin/chmod 4750 /bin/su
然后锁定一些文件:.rhosts,.netrc,/etc/hosts.equiv。r命令可以通过这些文件远程连入你的系统。先touch这些文件,然后chmod至0。
suneagle# /bin/touch /root/.rhosts /root/.netrc /etc/hosts.equiv;/bin/chmod 0 /root/.rhosts /root/.netrc /etc/hosts.equiv
linux还有一个众所周知的命令:chattr,呵呵+i操作,即使是root,也在-i之前改不了它们,先在你的系统的/etc/shadow,/etc/inetd.conf
等文件来个chattr +i可以避免一下exploit给你添后门什么的,呵呵。
bash的问题
对于bash用户来讲,有个.bash_history文件,可以记录你的所用的命令,谁也不希望其他人包括root知道自己敲了哪些命令吧?我有两种方法
来解决这个问题
1,在自己的.bash_profile文件中加入一行:
HISTFILESIZE=0
记住不要把HISTSIZE置零,那样就无法使用上下健来调用历史命令了。
2,删除自己目录下的.bash_history,然后建立一个连接:
suneagle$ ln -s /dev/null $HOME/.bash_history
这样,大家理解吧?历史命令都掉到黑洞洞里啦~~~~~
最后,保证物理安全,建立在/etc/lilo.conf中设置密码来控制linux的启动,呵呵,虽然也是可以被破解的,嘿嘿,因为它是明文存放,破解
方法吗,知者知之,不知者就不知啦,嘿嘿。
ok,写了这么多,大概把安全性讲了一下,但里面每个知识点又可以单独写文章,呵呵,学无止尽啊。