关于作者

姓名:

性别:其他

出生日期:--

地区:

联系电话:

QQ:20020287婚否:保密
用户名:clay111
笔名:clay111
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



新华联锦园

访问统计:
文章个数:114
评论个数:14
留言条数:8




Powered by BlogDriver 2.1

clay111的备忘文章收集

 

所有文章大部分从网络上面收集,少部分为原创文章。收集的文章都是一些在工作当中对我帮助很大的文章,在这里首先对原创作者表示感谢,由于很多文章不知道具体的作者是谁,所以我一般在题目加上ZT字样,如果你是文章的原创作者,可以和我留言,我把文章的署名改成您自己。

文章

源码升级-(OpenSSL + OpenSSH) ZT

源码升级-(OpenSSL + OpenSSH)

 

升级OpenSSL

  CODE:[Copy to clipboard]  
cd /usr/local/src
wget http://www.openssl.org/source/openssl-0.9.7e.tar.gz
tar xzvf openssl-0.9.7e.tar.gz
cd openssl-0.9.7e
./config --prefix=/usr/local/openssl-0.9.7e
make
make test
make install

升级OpenSSH(依照最新的OpenSSL)

  CODE:[Copy to clipboard]  
cd /usr/local/src
wget http://gulus.usherbrooke.ca/pub/appl/ssh/OpenSSH/portable/openssh-3.9p1.tar.gz
tar xzvf openssh-3.9p1.tar.gz
cd openssh-3.9p1
./configure --prefix=/usr --with-pam --with-zlib=/usr/local/zlib --with-ssl-dir=/usr/local/openssl-0.9.7e --with-md5-passwords --mandir=/usr/share/man
(如果你自己编译安装了zlib,就加--with-zlib=DIR这个参数,如果默认安装,就换成--with-zlib)

make
make install

OK,现在ssh -V看一下版本吧

- 作者: clay111 2008年03月25日, 星期二 18:59  回复(0) |  引用(0) 加入博采

apache配置虚拟机

(总是忘,记下来)

 NameVirtualHost *:80
 <VirtualHost *:80>
    ServerAdmin webmaster@5zuiai.com
    DocumentRoot /usr/local/apache2/htdocs/lhjweb
    ServerName www.5zuiai.com
    <Directory "/usr/local/apache2/htdocs/lhjweb">
       Options -Indexes FollowSymLinks
       AllowOverride None
       Order allow,deny
       Allow from all
    </Directory>
 
    ErrorLog logs/5zuiai-error_log
    TransferLog logs/5zuiai-access_log
 </VirtualHost>

- 作者: clay111 2007年12月22日, 星期六 05:03  回复(0) |  引用(1) 加入博采

DL360服务器的SCSI安装gentoo(Z)

本文转自:http://blog.tom.com/blog/read.php?bloggerid=240728&blogid=59519

难点:DL360服务器的SCSI不是常见的adapter类型,所以设备里面没有sda这样的设备,貌似需要 modprobe cciss加载一下,加载以后,设备的名字也不是sda而是 /dev/cciss/c0d0

(以上未经验证,感谢瞿峰提供如此重要的线索)

转自http://yayami.spaces.live.com/blog/cns!AD65E5A17F330895!148.entry

dl360 gentoo 安装笔记

fdisk /dev/cciss/c0d0
tar xvjpf stage3-*.tar.bz2
tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
nano -w /mnt/gentoo/etc/make.conf
CFLAGS="-march=nocona -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j2"
mirrorselect -i -o >> /mnt/gentoo/etc/make.conf
mirrorselect -i -r -o >> /mnt/gentoo/etc/make.conf
GENTOO_MIRRORS="http://linux.ntcu.net/ftp/dists/gentoo"
SYNC="rsync://linux.ntcu.net/gentoo-portage"

cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf
mount -t proc none /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
chroot
# chroot /mnt/gentoo /bin/bash
# env-update
>> Regenerating /etc/ld.so.cache...
# source /etc/profile
# export PS1="(chroot) $PS1"
emerge --sync
emerge portage
ls -FGg /etc/make.profile
emerge gentoo-sources
emerge genkernel

/dev/cciss/c0d0p1  /boot        ext2      defaults,noatime     1 2
/dev/cciss/c0d0p4   none         swap     sw                   0 0
/dev/cciss/c0d0p2  /             xfs       noatime              0 1
/dev/cciss/c0d0p3  /var/websquid/cache          reiserfs   noatime              0 0
proc        /proc        proc    nodev,nosuid,noexec  0 0
shm         /dev/shm     tmpfs   nodev,nosuid,noexec  0 0
/dev/cdrom  /mnt/cdrom   auto    noauto,user          0 0
cciss grub 安装
echo '(hd0)     /dev/cciss/c0d0' /boot/grub/device.map
grub --batch --device-map=/boot/grub/device.map --config-file=/boot/grub/grub.conf --no-floppy
grub >root (hd0,0)
grub >setup (hd0)
grub >quit
 
default 0
timeout 30
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
boot=/dev/cciss/c0d0
title=Gentoo Linux 2.6.20-r8
root (hd0,0)
kernel /boot/kernel-genkernel-x86-2.6.20-gentoo-r8 root=/dev/cciss/c0d0p2 vga=791
initrd /boot/initramfs-genkernel-x86-2.6.20-gentoo-r8
内核编译加入
device drivers->block derives->
compaq smart2 support(如果你使用HP smart2阵列卡)
compaq smart array 5XXX support (HP smart array系列阵列卡的支持)

- 作者: clay111 2007年11月1日, 星期四 12:22  回复(0) |  引用(1) 加入博采

让卡巴挂掉的代码
ping -n 45 localhost > nul是什么意思,回答“应该什么也没有吧”。确实,这个命令运行后就是什么显示也没有,除了能浪费时间。。。。
随后他给我看了如下的代码:

以下内容为程序代码:

@echo off
set date=%date%
date 1987-10-18
ping -n 45 localhost > nul
date %date%




很明显这个批处理是为了让卡巴斯基挂掉,先把当前的系统日期保存,然后将当前系统日期改为1987年10月18日(病毒作者的生日?或者是他GF的生日?呵呵),随后ping本机45次,并且将显示结果传到nul设备上,就是在屏幕上什么也不显示。这一句其实是起到延时的作用,目的是等卡巴挂掉。然后再恢复回系统时间。

由于卡巴斯基会实时检测系统日期,以判断软件是否已经超过授权的使用期限。当发现软件许可过期时会立即(这个过程需要几秒到几十秒,前面的那个ping就是为了等待这个)关闭所有的监控,同时主程序也无法扫描病毒,并且需要用户输入新的序列号。

目前,很多的病毒都会先运行一个批处理程序,先让卡巴关掉,然后再大摇大摆地入侵用户的计算机。由于这个批处理只是修改了系统日期,卡巴斯基几乎不太可能将这个批处理作为病毒进行处理。目前,越来越多的病毒通过修改系统时间来对卡巴斯基进行攻击,可以说这是它的一个比较严重的漏洞,目前最新卡巴斯基仍然存在这个问题。  

- 作者: clay111 2007年10月8日, 星期一 11:22  回复(0) |  引用(1) 加入博采

gentoo 安装NTPf服务
1、安装软件
emerge ntp
2、修改配置文件
vi /etc/ntp.conf
restrict default ignore
#restrict default nomodify notrap noquery

restrict 0.asia.pool.ntp.org
restrict 1.asia.pool.ntp.org
restrict 2.asia.pool.ntp.org
restrict 3.asia.pool.ntp.org

restrict 127.0.0.1 mask 255.0.0.0
restrict 192.168.1.0 mask 255.255.255.0 nomodify

server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
server 2.asia.pool.ntp.org
server 3.asia.pool.ntp.org
broadcastdelay 0.008
logfile /var/log/ntp.log

3、查看ntp有没有工作

ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
+arteq.com.tw 220.130.158.51 3 u 29 64 377 93.116 38.782 7.695
211.22.55.116 .INIT. 16 u - 64 0 0.000 0.000 0.000
*203.116.5.254 130.207.244.240 2 u 33 64 377 82.320 31.845 11.375
+q037240.ppp.asa 200.23.51.205 2 u 221 64 150 405.989 -117.80 40.170

ntptrace xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx: stratum 3, offset -0.029005, synch distance 0.365843
203.116.5.254: timed out, nothing received
***Request timed out

4、查看log文件

tail -f /var/log/ntp.log

12 Jul 15:35:35 ntpd[2089]: synchronized to 59.124.71.8, stratum 3
12 Jul 15:35:35 ntpd[2089]: kernel time sync status change 0001

5、启动服务

/etc/init.d/ntpd start|stop|restart

6、注意事项

服务启动之后,大约5分钟左右才能进行时间服务。看到日志文件出现同步信息,基本服务就好了, 如果过了很长时间没有同步信息或者不能提供时间服务,请检查配置文件。

参考文档:

http://linux.vbird.org/linux_server/0440ntp.php#server_ntp.conf

- 作者: clay111 2007年07月12日, 星期四 16:01  回复(0) |  引用(1) 加入博采

Local time zone must be set--see zic

cp /usr/share/zoneinfo/Europe/Chongqing /etc/localtime

是因为没有设置localtime,也就是没有自己的时区,拷贝一个就好了。

- 作者: clay111 2007年07月11日, 星期三 16:23  回复(0) |  引用(1) 加入博采

shell date日期应用(ZT)
neo:
如果是linux上的date,直接用
date -d yesterday
date -d yesterday +%Y%m%d
另外如
date -d '3 days ago'
date -d tomorrow
date -d '3 days'
如果不是gnu/linux上的date命令,请往下看
----------------------------------------------------------------

好象有date 有-24 有+%y%m%d等,谢了。
还有有办法获得3天前的日期吗?

唉,在b shell没有这个用法了,要想用纯shell做几天前后的运算,只有自己想办法了,+%y%m%d用于控制输出格式,作用有限,要想做的话,参见这个帖子大家的发言:

我的确在哪儿看到用一条命令就可以取昨天或明天的日期,
参数中有-24或+24。没那么复杂

好象用到了参数TZ=-24;export TZ什么的

改变时区,应该可以实现,确实是个好方法。

不会吧,你说的俺都明白了,你自己还不懂?

date命令的显示是与环境变量TZ有关的
看以下的命令操作,你应该便明白了,

$#看当前时区
$echo $TZ
CST-8
$#显示当前时间
$date
Mon Apr 2 15:48:36 CST 2002
$#改变当前时区,
TZ=CST+16;export TZ
$#显示当前时间(中间未改变系统时间,但date命令的显示已为昨天)
Mon Apr 1 15:48:33 CST 2002



#!/bin/sh

# ydate: A Bourne shell script that
# prints yestarday's date
# Output form: Month Day Year
# From Focus on Unix: http://unix.about.com

# Set the current month day and year.
month=`date +%m`
day=`date +%d`
year=`date +%Y`

# Add 0 to month. This is a
# trick to make month an unpadded integer.
month=`expr $month + 0`

# Subtract one from the current day.
day=`expr $day - 1`

# If the day is 0 then determine the last
# day of the previous month.
if [ $day -eq 0 ]; then

# Find the preivous month.
month=`expr $month - 1`

# If the month is 0 then it is Dec 31 of
# the previous year.
if [ $month -eq 0 ]; then
month=12
day=31
year=`expr $year - 1`

# If the month is not zero we need to find
# the last day of the month.
else
case $month in
1|3|5|7|8|10|12) day=31;;
4|6|9|11) day=30;;
2)
if [ `expr $year % 4` -eq 0 ]; then
if [ `expr $year % 400` -eq 0 ]; then
day=29
elif [ `expr $year % 100` -eq 0 ]; then
day=28
else
day=29
fi
else
day=28
fi
;;
esac
fi
fi

# Print the month day and year.
echo $month $day $year
exit 0


时区转换实在是太精妙了!:-)

如果在shell中改了时区,执行完后,系统真正的时区还是正确的吗?

回楼上:最好你要把TZ的设置该回去了。
不过我在实践中用的方法是:
如果你的主机能够连接到数据库的话,比如可以连接到SYBASE数据库,那就可以利用数据库里面计算时间的丰富的函数了,比如
dateadd(day,getdate(),-1)
就能得到最天的日期了

因为这个贴子被版主盖过章,所以在此跟一下。
最近经常看到有网友关于相对日期问题的贴子,这在shell下进行解决时比较头疼。现将我作的几个程序贴出来与大家分享。虽然是用c写的,把它们贴在这里,我想大家也不会太反对的。其中一个程序以前发表在sco版下,现在早已淹没在汪洋大海中了,无从查找。
因为是早先刚学c时的作品,且英文又不行,故写出的程序比较难看,请大家别见笑。
相关链接:



date=`expr `date +%m%d` - 1`

这儿有一个我写的计算昨天的函数,可能是纯shell中唯一的简单解决方案吧,要想将其应用在计算任意天前后,恐怕还是不太方便的,看看,能否满足?
yesterday ()
{
_year=$1;_month=$2;_day=$3
if [ $_day -eq 1 ];then
if [ $_month -eq 1 ];then
_year=`expr $_year - 1`
_month=12
else
_month=`expr $_month - 1`
fi
_day=`echo `cal $_month $_year`|awk '{print $NF}'`
else
_day=`expr $_day - 1`
fi
echo "$_year $_month $_day"|awk '{if (length($2)==1) $2=0$2;if (length($3)==1) $3=0$3;print $1,$2,$3}'
}



unix 我没有试过,linux上可以用
date --date "1 days ago"


yy=`date +%Y` #Year yyyy
mm=`date +%m` #Month mm
dd=`date +%d` #Day dd

if [ $dd = "01" ] #如果为月初则计算上月末的日期
then
lm=`expr $mm - 1 ` #lm 上月
if [ $lm -eq 0 ]
then lm=12
fi
case $Fm in
1|3|5|7|8|10|12) Yesterday=31 ;;
4|6|9|11) Yesterday=30 ;;
2) #计算闰月
if [ ` expr $yy % 4 ` -eq 0 -a `expr $yy % 100 ` -ne 0 -o ` expr $yy % 400 ` -eq 0 ]
then Yesterday=29
else Yesterday=28
fi ;;
esac

else #如果不是月初的处理
Yesterday=`expr $dd - 1 `
if [ $Yesterday -lt 10 ] ###上旬日期处理
then Yesterday=0$Yesterday
fi
fi

结果: today=20020301 yesterday=28

- 作者: clay111 2007年07月11日, 星期三 11:23  回复(0) |  引用(1) 加入博采

无光驱安装gentoo

                                   无光驱安装gentoo
原理:服务器启动,通过网络从DHCP服务器获取TFTP服务器地址,服务器从TFTP服务器下载pxelinux并且执行,pxelinux读取配置文件,从网络下载gentoo内核和引导文件,从而引导gentoo系统,系统引导成功以后,可以正常安装gentoo。
1、环境介绍
   一台gentoo服务器(IP:192.168.1.251),一个交换机,一个需要安装系统的无光驱服务器
2、安装DHCP服务器
   首先配置gentoo服务器,gentoo服务器需要安装配置DHCP、TFTP服务。
   Emerge dhcp
   安装完成之后,修改DHCP配置文件
 
   Nano –w /etc/dhcp/dhcpd.conf
   文件内容如下所示:
    ddns-update-style interim;
ignore client-updates;
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
option vendor-class-identifier "PXEClient";
vendor-option-space PXE;
option PXE.mtftp-ip 0.0.0.0;
filename "pxelinux.0";
next-server 192.168.1.251;
}
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
range  192.168.1.80 192.168.1.100;
}
启动DHCP服务
/etc/init.d/dhcpd start
3、配置TFTP服务器
   首先建立TFTP工作目录
   Mkdir  /diskless
   安装TFTP软件
   Emerge  tftp-hpa
   配置TFTP
   Nano –w /etc/conf.d/in.tftpd
   配置文件内容如下所示:
# /etc/init.d/in.tftpd
INTFTPD_PATH="/diskless"
INTFTPD_USER="nobody"
#INTFTPD_OPTS="-u ${INTFTPD_USER} -l -vvvvvv -p -c -s ${INTFTPD_PATH}"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"

  启动TFTP
/etc/init.d/in.tftpd start

 
4、制作gentoo网络启动文件(关键步骤)
   首先下载
   LiveCD+PXE-0.0.1.tar.bz2 和 install-x86-universal-2004.2.iso
   Cp install-x86-universal-2004.2.iso /tmp

   解压文件 LiveCD+PXE
   Tar zxjpf LiveCD+PXE-0.0.1.tar.bz2
   Cd LiveCD+PXE-0.0.1

   修改LiveCD+PXE.sh
   Vi LiveCD+PXE.sh

   查找PXE_HOST和PXE_DIR 修改成自己的服务器地址
    PXE_HOST="192.168.1.251"
PXE_DIR="/diskless"

   . /LiveCD+PXE.sh smp init 
   ./ LiveCD+PXE.sh smp finish
  
   此步骤为制作gentoo网络启动文件的关键步骤(生成:smp和smp.igz文件),如果制作不成功,则无法通过网络启动gentoo
5、安装pxelinux
   Emerge syslinux
   cp /usr/lib/syslinux/pxelinux.0 /diskless
mkdir /diskless/pxelinux.cfg
   touch /diskless/pxelinux.cfg/default
  
   vi /diskless/pxelinux.cfg/default
  内容如下:
  prompt 1
timeout 10
default livecd

label livecd
        kernel smp
        append init=/linuxrc initrd=smp.igz ramdisk_size=80000 ip=dhcp root=/dev/ram0 looptype=squashfs loop=/livecd.squashfs cdroot PXE keymap=us

6、启动需要安装系统的服务器

启动服务器,选择通过PXE启动,尽情享受gentoo网络启动带来的乐趣吧。


注意事项:
1、启动文件为gentoo 2004版 ,linux内核是2.4,如果安装gentoo 2007 LiveCD,安装时会提示linux 内核版本太低,不能安装。只能用install-x86-universal-2004.2.iso进行安装,然后升级系统软件。
2、LiveCD+PXE-0.0.1.tar.bz2 和 install-x86-universal-2004.2.iso 安装包在192.168.1.251上面都有,有需要安装测试的可以从这上面拷贝安装。

另类安装gentoo

通过正常步骤安装gentoo
此处省略2000字安装步骤。注意事项:一定要用genkernel -all来生成系统内核,因为genkernel 生成的内核和liveCD比较类似,系统兼容性比较好。如果不用genkernel生成内核,

挂上需要安装系统的硬盘,用LiveCD启动系统
Fdisk /dev/hda
系统分区
livecd ~ # fdisk -l /dev/hda

Disk /dev/hda: 78 GB,
255 heads, 63 sectors/track, 72943 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1               1          12       96358+  83  Linux
/dev/hda2              13         110      787185   82  Linux swap / Solaris
/dev/hda3             111       72943   585031072+  83  Linux
   
/hda1目录为grub 和系统启动文件
/hda3为linux系统文件
我们知道linux一切都是文件,所以我们只要把所有的文件都拷贝过来就好了。
   
Fdisk –l /dev/hdb       (这个是需要安装系统的硬盘)
/dev/hdb1               1          12       96358+  83  Linux
/dev/hdb2              13         110      787185   82  Linux swap / Solaris
/dev/hdb3             111       72943   585031072+  83  Linux

Mkdir   /mnt/sroot     linux系统文件目录
Mkidr   /mnt/sboot     启动文件目录

Mkdir  /mnt/groot
Mkidr  /mnt/gboot

Mount /dev/hda3 /mnt/sroot     mount 原目录
Mount /dev/hda1 /mnt/sboot     mount 原目录

Mount /dev/hdb3 /mnt/groot     mount 目标目录
Mount /dev/hdb1 /mnt/gboot     mount 目标目录

Cp –a /mnt/sroot /mnt/groot   拷贝需要安装的文件到目标目录
Cp –a /mnt/sboot /mnt/gboot   拷贝系统启动文件到目标目录

拷贝完成以后,linux系统基本安装完成。只要在目标盘重新安装grub启动就好了。

3、摘下原盘,用liveCD启动。

重新安装grub就好了。

此方法与克隆安装互有优缺点:
克隆安装,只能在两个同等大小的硬盘之间克隆,如果原盘比目标盘大,则不能用克隆方法。
克隆安装比较方便,克隆完成之后,克隆盘可直接启动。
硬盘对拷方法适用于硬盘大小不统一之间的安装linux。


- 作者: clay111 2007年07月10日, 星期二 14:40  回复(0) |  引用(1) 加入博采

vmstat 说明(ZT )
实时查看内存使用情况

vmstat 2(秒数)
vmstat 5 40

vmstat 可用來紀錄 processes, memory, paging, block IO, traps, 與 cpu activity。

例如

$ vmstat 1 # 1 是更新速度,單位為秒
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 549368 13316 102388 91992 12 6 9 8 2 12 72 3 25 0
2 0 549368 13316 102388 91992 0 0 0 0 156 1516 98 2 0 0
2 0 549368 13312 102388 91992 0 0 0 0 125 534 99 1 0 0

....

第一列與第二列所代表是執行程式的資訊,接下來的是記憶體、swap、io、systm 與 cpu。

Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.

Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)

Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).

IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).
System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second.

CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.

- 作者: clay111 2007年07月6日, 星期五 11:09  回复(0) |  引用(1) 加入博采

gentoo 没有加载网卡怎么办?

错误提示:

ERROR: problem starting needed services 

“netmount” was not started

查看网卡型号:

lspci   

察看编译了哪些模块:

ls /lib/modules/`uname -r`/kernel/drivers/net

动态加载模块:

modprobe e100

加入自动加载模块组:

nano -w /etc/modules.autoload.d/kernel-2.4

在文件里面直接写模块名字,例如:

e100  #(我这里是网卡的型号)

修改/etc/conf.modeles,没有效果。开始在google乱搜,最后仔细阅读gentoo文档,发现:
原始碼 10: 搜尋提供的模組

# ls /lib/modules/`uname -r`/kernel/drivers/net


如果您找到您的網路卡所用的驅動程式,使用 modprobe 載入這個核心模組:

原始碼 11: 使用 modprobe 載入核心模組

(舉例來說,我們將載入 pcnet32 模組)
# modprobe pcnet32


尝试modprobe不同文件,包括ne2k,8139cp。最后modprobe 8139too。安装成功!
但现在还是无法使用文档中说的net-setup,难道是目录不对,我find / 没有发现net-setup的文件名。

注册7年,首次发现一点和别人遇到的情况不同的,首次发帖。但最后解决方法还是在手册中,呵呵!还是那个道理多看手册,问题几乎都能解决。(不知道发在安装版还是gentoo,由斑竹定夺吧!)

- 作者: clay111 2007年06月25日, 星期一 01:51  回复(1) |  引用(1) 加入博采

gentoo syslog-ng的设置(ZT)

原文摘自:http://blog.sina.com.cn/u/4707c9270100075v

log对于一个系统的重要性是显而易见的,然而不幸的是我发现我的系统并没有很好地记录应该记录的东西,至少昨天半夜它自动重启了,我却找不到为什么。

安装的时候安装的syslog-ng,查了一下它的配置文件,似乎记录的东西很少,对于系统安全来说是很不够的,于是自己man了很多东西,修改了一下设置,过程如下:

1
man其实没什么用,大概我基础不好,里面说的东西我看不懂。

2
syslog-ng的配置文件在/etc/syslog-ng/syslog-ng.conf,里面似乎只记录了messeges,没有其他东西,不确信的话可以自己打开看看。

3
、安全起见,先将文件备份。

4
、查看syslog-ng的配置说明,参考这个例子:/usr/share/doc/syslog-ng-1.6.9/syslog-ng.conf.sample.gz,然后修改/etc/syslog-ng/syslog-ng.conf,按格式按自己的需要修改。我的修改后的文件如下:

# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo,v 1.5 2005/05/12 05:46:10 mr_bones_ Exp $#
# Syslog-ng default configuration file for Gentoo Linux
# contributed by Michael Sterrett

options {
chain_hostnames(off);
sync(0);

# The default action of syslog-ng 1.6.0 is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# how many messages syslog-ng missed (0).
stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };

destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination user { file("/var/log/user.log"); };
destination messages { file("/var/log/messages"); };

# By default messages are logged to tty12...
destination console_all { file("/dev/tty12"); };
# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination console_all { file("/dev/console"); };


log { source(src); destination(authlog); };
log { source(src); destination(syslog); };
log { source(src); destination(user); };
log { source(src); destination(messages); };
log { source(src); destination(console_all); };

要注意的是sample文件里面有filter的内容,如果你不知道这个是干什么的,man一下syslog-ng。需要的话照sample里面的样子,先添加filter段,再在log段里面添加相应内容。如果你不需要,就象我这样,把需要log的内容直接cp进来,把filter段去掉。

修改:今天查了一下,似乎有几个log里面的内容是差不多的,syslogauth记录了重复的东西,想必是filter没定义的缘故,于是修改如下(增加了filter段):

# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo,v 1.5 2005/05/12 05:46:10 mr_bones_ Exp $#
# Syslog-ng default configuration file for Gentoo Linux
# contributed by Michael Sterrett

options {
chain_hostnames(off);
sync(0);

# The default action of syslog-ng 1.6.0 is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# how many messages syslog-ng missed (0).
stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };

destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination user { file("/var/log/user.log"); };
destination messages { file("/var/log/messages"); };

# By default messages are logged to tty12...
destination console_all { file("/dev/tty12"); };
# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination console_all { file("/dev/console"); };
filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_user { facility(user); };

log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_user); destination(user); };
log { source(src); destination(messages); };
log { source(src); destination(console_all); };

设置iptables log 如下所示:

vi  /etc/syslog-ng/syslog-ng.conf

destination kern { file("/var/log/iptables.log"); };

filter f_kern { facility(kern); };

log { source(src); filter(f_kern); destination(kern); };

保存退出

shell下面运行:

/etc/init.d/syslog-ng reload

iptables -A INPUT  -p icmp -j LOG  --log-level debug --log-prefix "This is a test!"

查看:

tail -f /var/log/iptables.log

输出类似如下:

Jun  8 19:42:02 localhost szkingrose test---------IN=eth0 OUT= MAC=00:15:58:10:6f:70:00:18:39:84:7a:bc:08:00 SRC=59.151.18.182 DST=192.168.1.251 LEN=84 TOS=0x00 PREC=0x00 TTL=51 ID=20409 PROTO=ICMP TYPE=0 CODE=0 ID=2371 SEQ=5
Jun  8 19:42:02 localhost szkingrose test---------IN=eth0 OUT= MAC=00:15:58:10:6f:70:00:1b:fc:1a:09:c7:08:00 SRC=192.168.1.122 DST=192.168.1.251 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=59970 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=19727
Jun  8 19:42:03 localhost szkingrose test---------IN=eth0 OUT= MAC=00:15:58:10:6f:70:00:1b:fc:1a:09:c7:08:00 SRC=192.168.1.122 DST=192.168.1.251 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=59973 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=19983
Jun  8 19:42:04 localhost szkingrose test---------IN=eth0 OUT= MAC=00:15:58:10:6f:70:00:1b:fc:1a:09:c7:08:00 SRC=192.168.1.122 DST=192.168.1.251 LEN=60 TOS=0x00 PREC=0x00 TTL=128 ID=59976 PROTO=ICMP TYPE=8 CODE=0 ID=512 SEQ=20239

 

- 作者: clay111 2007年06月8日, 星期五 19:46  回复(0) |  引用(1) 加入博采

博客中国实在是太滥了

用了这么长时间,也懒得搬家了,但是实在是不爽,我要骂两句。

你们的文章总数准么?  你们的文章年度文件夹文章数对么?

你们怎么测试的产品,就拿着东西出来唬人了?

博客中国实在是太滥了,什么时候新浪推出博客中国的搬家工具,我搬到新浪去。

- 作者: clay111 2007年06月7日, 星期四 19:20  回复(0) |  引用(1) 加入博采

c与mysql连接和一个简单查询的例子(ZT)
(此程序经过编译验证,没有问题,确实可用,如果在你的环境不能工作,也许是你的环境问题)

今天给新来的同事做mysql培训,用到的一个例子:
连接数据库test 用户名root密码abc
在里面有一个username的表,describe username结果如下
mysql> describe username;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(10)     | YES  |     | NULL    |       |
| username | varchar(32) |      | PRI |         |       |
+----------+-------------+------+-----+---------+-------+

mysql> select * from username;
+------+----------+ 
| id   | username |
+------+----------+
|    1 | sfs      |
+------+----------+
1 row in set (0.00 sec)


[b:f09d522785]本文目的查找执行select id from username这个语句并打印结果[/b:f09d522785]
[code:1:f09d522785]
#include <unistd.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <mysql/mysql.h>
#include <signal.h>
#include <errno.h>
#include <syslog.h>
MYSQL mysql;
main()
{
char host[32]="localhost";
char user[32]="root";
char passwd[32]="abc";
char dbname[32]="test";

if( mysql_init(&mysql) == NULL )
{
syslog(LOG_USER|LOG_INFO,"inital mysql handle error\n");
return 1;
}
if (mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0) == NULL)
{
syslog(LOG_USER|LOG_INFO, "Failed to connect to database: Error: %s\n",mysql_error(&mysql));
return 1;
}
else syslog(LOG_USER|LOG_INFO, "connect to database: \n");
find_ps();
db_close();
return 0;
}
int db_close()
{
       mysql_close(&mysql);
        return 0;
}


int  find_ps ()
{
MYSQL_ROW m_row;
MYSQL_RES *m_res;
char sql[1024],username[32];
int res=1;
int *id;
sprintf(sql,"select id from username");
if(mysql_query(&mysql,sql) != 0)
{
syslog(LOG_USER|LOG_INFO, "select ps_info Error: %s\n",mysql_error(&mysql));
return res;
}
m_res = mysql_store_result(&mysql);
if(m_res==NULL)
{
syslog(LOG_USER|LOG_INFO, "select username Error: %s\n",mysql_error(&mysql));
res = 3;
return res;
}
if(m_row = mysql_fetch_row(m_res))
{
printf("m_row=%d\n",atoi(m_row[0]));
res = 0;
}
mysql_free_result(m_res);
return res;
}
[/code:1:f09d522785]
编译命令
gcc -g connect_db.c -L/usr/lib/mysql -lmysqlclient -lz
注意:
如果/tmp/ccTGmMS21.o: In function `main':
/tmp/ccTGmMS21.o(.text+0x11): undefined reference to `mysql_init'
那么参数增加-L/usr/lib/mysql -lmysqlclient  
如果
usr/lib/mysql/libmysqlclient.a(my_compress.o): In function `my_uncompress':
my_compress.o(.text+0xaa): undefined reference to `uncompress'
那么增加-lz参数

我自己是这么编译的  呵呵

gcc -o ttmysql ttmysql.c -L /usr/lib/mysql/lib -lmysqlclient -lz

- 作者: clay111 2007年06月7日, 星期四 19:15  回复(0) |  引用(1) 加入博采

C语言中关于时间的函数
本文摘自:

C语言中关于时间的函数

     逍遥天子 发表于 2007-2-27 16:13:00

本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。

关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)

1.概念
在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.

通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:

Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。

Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。

epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。

2. 计时

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000)

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:

void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}

当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:

#i nclude “stdio.h”
#i nclude “stdlib.h”
#i nclude “time.h”

int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}

在笔者的机器上,运行结果如下:

Time to do 10000000 empty loops is 0.03000 seconds

上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。

3.与日期和时间相关的数据结构

在标准C/C++中,我们可通过tm结构来获得日期和时间,tm结构在time.h中的定义如下:

#ifndef _TM_DEFINED
struct tm {
int tm_sec; /* 秒 – 取值区间为[0,59] */
int tm_min; /* 分 - 取值区间为[0,59] */
int tm_hour; /* 时 - 取值区间为[0,23] */
int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
int tm_year; /* 年份,其值等于实际年份减去1900 */
int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */
int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */
int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/
};
#define _TM_DEFINED
#endif

ANSI C标准称使用tm结构的这种时间表示为分解时间(broken-down time)。

而日历时间(Calendar Time)是通过time_t数据类型来表示的,用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:

#ifndef _TIME_T_DEFINED
typedef long time_t; /* 时间值 */
#define _TIME_T_DEFINED /* 避免重复定义 time_t */
#endif

大家可能会产生疑问:既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?对time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分07秒。为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的整形数来保存日历时间。比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存3001年1月1日0时0分0秒(不包括该时间点)之前的时间。

在time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);
time_t mktime(struct tm * timeptr);
time_t time(time_t * timer);
char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

此外,time.h还提供了两种不同的函数将日历时间(一个用time_t表示的整数)转换为我们平时看到的把年月日时分秒分开显示的时间格式tm:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

通过查阅MSDN,我们可以知道Microsoft C/C++ 7.0中时间点的值(time_t对象的值)是从1899年12月31日0时0分0秒到该时间点所经过的秒数,而其它各种版本的Microsoft C/C++和所有不同版本的Visual C++都是计算的从1970年1月1日0时0分0秒到该时间点所经过的秒数。

4.与日期和时间相关的函数及应用
在本节,我将向大家展示怎样利用time.h中声明的函数对时间进行操作。这些操作包括取当前时间、计算时间间隔、以不同的形式显示时间等内容。

4.1 获得日历时间

我们可以通过time()函数来获得日历时间(Calendar Time),其原型为:

time_t time(time_t * timer);

如果你已经声明了参数timer,你可以从参数timer返回现在的日历时间,同时也可以通过返回值返回现在的日历时间,即从一个时间点(例如:1970年1月1日0时0分0秒)到现在此时的秒数。如果参数为空(NUL),函数将只通过返回值返回现在的日历时间,比如下面这个例子用来显示当前的日历时间:

#i nclude "time.h"
#i nclude "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
printf("The Calendar Time now is %d\n",lt);
return 0;
}

运行的结果与当时的时间有关,我当时运行的结果是:

The Calendar Time now is 1122707619

其中1122707619就是我运行程序时的日历时间。即从1970年1月1日0时0分0秒到此时的秒数。

4.2 获得日期和时间

这里说的日期和时间就是我们平时所说的年、月、日、时、分、秒等信息。从第2节我们已经知道这些信息都保存在一个名为tm的结构体中,那么如何将一个日历时间保存为一个tm结构的对象呢?

其中可以使用的函数是gmtime()和localtime(),这两个函数的原型为:

struct tm * gmtime(const time_t *timer);
struct tm * localtime(const time_t * timer);

其中gmtime()函数是将日历时间转化为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转化为本地时间。比如现在用gmtime()函数获得的世界标准时间是2005年7月30日7点18分20秒,那么我用localtime()函数在中国地区获得的本地时间会比世界标准时间晚8个小时,即2005年7月30日15点18分20秒。下面是个例子:

#i nclude "time.h"
#i nclude "stdio.h"
int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}

运行结果是:

Local hour is: 15
UTC hour is: 7

4.3 固定的时间格式

我们可以通过asctime()函数和ctime()函数将时间以固定的格式显示出来,两者的返回值都是char*型的字符串。返回的时间格式为:

星期几 月份 日期 时:分:秒 年\n\0
例如:Wed Jan 02 02:03:55 1980\n\0

其中\n是一个换行符,\0是一个空字符,表示字符串结束。下面是两个函数的原型:

char * asctime(const struct tm * timeptr);
char * ctime(const time_t *timer);

其中asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串。这样的话,asctime()函数只是把tm结构对象中的各个域填到时间字符串的相应位置就行了,而ctime()函数需要先参照本地的时间设置,把日历时间转化为本地时间,然后再生成格式化后的字符串。在下面,如果t是一个非空的time_t变量的话,那么:

printf(ctime(&t));

等价于:

struct tm *ptr;
ptr=localtime(&t);
printf(asctime(ptr));

那么,下面这个程序的两条printf语句输出的结果就是不同的了(除非你将本地时区设为世界标准时间所在的时区):

#i nclude "time.h"
#i nclude "stdio.h"
int main(void)
{
struct tm *ptr;
time_t lt;
lt =time(NUL);
ptr=gmtime(<);
printf(asctime(ptr));
printf(ctime(<));
return 0;
}

运行结果:

Sat Jul 30 08:43:03 2005
Sat Jul 30 16:43:03 2005

4.4 自定义时间格式

我们可以使用strftime()函数将时间格式化为我们想要的格式。它的原型如下:

size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);

我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。

函数strftime()的操作有些类似于sprintf():识别以百分号(%)开始的格式命令集合,格式化输出结果放在一个字符串中。格式化命令说明串strDest中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面,它们是区分大小写的。

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

如果想显示现在是几点了,并以12小时制显示,就象下面这段程序:

#i nclude “time.h”
#i nclude “stdio.h”
int main(void)
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NUL);
ptr=localtime(<);
strftime(str,100,"It is now %I %p",ptr);
printf(str);
return 0;
}

其运行结果为:
It is now 4PM

而下面的程序则显示当前的完整日期:

#i nclude <stdio.h>
#i nclude <time.h>

void main( void )
{
struct tm *newtime;
char tmpbuf[128];
time_t lt1;
time( <1 );
newtime=localtime(<1);
strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);
printf(tmpbuf);
}

运行结果:

Today is Saturday, day 30 of July in the year 2005.

4.5 计算持续时间的长度

有时候在实际应用中要计算一个事件持续的时间长度,比如计算打字速度。在第1节计时部分中,我已经用clock函数举了一个例子。Clock()函数可以精确到毫秒级。同时,我们也可以使用difftime()函数,但它只能精确到秒。该函数的定义如下:

double difftime(time_t time1, time_t time0);

虽然该函数返回的以秒计算的时间间隔是double类型的,但这并不说明该时间具有同double一样的精确度,这是由它的参数觉得的(time_t是以秒为单位计算的)。比如下面一段程序:

#i nclude "time.h"
#i nclude "stdio.h"
#i nclude "stdlib.h"
int main(void)
{
time_t start,end;
start = time(NUL);
system("pause");
end = time(NUL);
printf("The pause used %f seconds.\n",difftime(end,start));//<-
system("pause");
return 0;
}

运行结果为:
请按任意键继续. . .
The pause used 2.000000 seconds.
请按任意键继续. . .

可以想像,暂停的时间并不那么巧是整整2秒钟。其实,你将上面程序的带有“//<-”注释的一行用下面的一行代码替换:

printf("The pause used %f seconds.\n",end-start);

其运行结果是一样的。

4.6 分解时间转化为日历时间

这里说的分解时间就是以年、月、日、时、分、秒等分量保存的时间结构,在C/C++中是tm结构。我们可以使用mktime()函数将用tm结构表示的时间转化为日历时间。其函数原型如下:

time_t mktime(struct tm * timeptr);

其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作了,下面的例子可以计算出1997年7月1日是星期几:

#i nclude "time.h"
#i nclude "stdio.h"
#i nclude "stdlib.h"
int main(void)
{
struct tm t;
time_t t_of_day;
t.tm_year=1997-1900;
t.tm_mon=6;
t.tm_mday=1;
t.tm_hour=0;
t.tm_min=0;
t.tm_sec=1;
t.tm_isdst=0;
t_of_day=mktime(&t);
printf(ctime(&t_of_day));
return 0;
}
运行结果:
Tue Jul 01 00:00:01 1997
现在注意了,有了mktime()函数,是不是我们可以操作现在之前的任何时间呢?你可以通过这种办法算出1945年8月15号是星期几吗?答案是否定的。因为这个时间在1970年1月1日之前,所以在大多数编译器中,这样的程序虽然可以编译通过,但运行时会异常终止。

- 作者: clay111 2007年05月24日, 星期四 14:53  回复(0) |  引用(1) 加入博采

freebsd安装及安全设置


yeye2005-05-02 12:39
内容简介:本文将详细介绍一个网站服务器的系统安装、针对安全因素的系统调整。该服务器通过Apache+PHP4+MySQL提供动态网站服务,通过自带的FTPD提供网页上传服务,通过自带的OpenSSH提供管理维护服务。本文将不涉及Apache和MySQL的管理。
  一、安装操作系统

  1.选择发行版本

  安装生产服务器,应当尽量选择最新的稳定版本。本文将采用FreeBSD 4.8 RELEASE。

  4.8-RELEASE是成文时候最新的-STABLE版本。5.0-RELEASE和即将推出的5.1-RELEASE都是-CURRENT分支的发行版本,其稳定性和性能可能不如-STABLE,仅适合于开发者和发烧友。对于生产服务器来说,miniinst或disc1就足够了。请下载4.8-RELEASE-i386-mini.iso这个文件,刻录成安装光盘。
本文所叙述操作系统的安装就将采用光盘安装方式。

  2.安装要点

  通过安装向导可以很轻松的完成系统安装,这里不加详细叙述,仅仅指出如下两点:

  (1)硬盘分区的注意事项:

  分区的大小根据应用的实际情况而异,特别指出的是,网站文件、数据库文件、日志文件、临时文件应当单独分区存储,以防止攻击者滥用磁盘空间导致系统崩溃。下面是一块容量为18G SCSI硬盘的分区例子:

分区 大小 备注
/ 128M
SWAP 1008M 至少是内存数量的2倍(本系统采用512M内存)
/tmp 256M
/usr 3G 系统和Apache等应用软件、源码存储于这个分区
/usr/home 7G 网站文件存储于此
/var 3G 数据库将使用这个分区
/var/log 2811M 日志文件单独分区

  (2)选择要安装的文件(distributions):

  只安装必要的基本系统即可,绝对不要安装全部软件。在custom项目中,选取如下安装内容:

  bin,基本的FreeBSD系统文件;
  man,系统帮助文件;
  src—》sys,操作系统核心源码,定制内核时候将使用到。

  接下来,安装程序询问是否安装PORTS,为了方便安装软件,我们选择安装。但在高安全要求的系统上,最好不要使用ports或者packages,尽量自己下载源代码在本地编译,手动安装。

  提示:有时,安全和易用是相互矛盾的。

  然后是拷贝文件,直至安装完毕。

  3.安装后的初步设置

  安装完之后,建议您安装cvsup-without-gui(从bento.freebsd.org可以下在最新版本),并同步代码。对系统进行初步设置:

  增加用户帐号;
  设置网络参数,将主机连接到网络上(全部设置完成后移动到Internet);
  配置网络服务,打开FTP、SSH服务,后续的配置工作都将远程进行。


  二、定制系统内核

  定制系统内核内容:

  支持特定硬件,如SMP、RAID、大容量内存;
  删除多余硬件驱动支持;
  增强系统安全性,增加IP过滤防火墙支持。

  编辑内核设置文件,为增强安全特性,增添或修改如下内容:

  #启用ipfw过滤
  options IPFIREWALL #打开IPFW过滤功能
  options IPFIREWALL_VERBOSE #设置过滤日志记录
  options IPFIREWALL_VERBOSE_LIMIT=100 #设置日志记录限制
  options IPFIREWALL_DEFAULT_TO_ACCEPT #设置缺省行为
  options NOLKM#关闭LKM
  options TCP_DROP_SYNFIN #丢弃SYNFIN包,需要在rc.conf中打开

  #关于虚拟终端
  #取消历史记录,在登出系统后刷新虚拟终端缓冲中的内容
  SC_NO_HISTORY
  #取消debug键
  SC_DISABLE_DDBKEY
  #取消ctl+alt+del键
  SC_DISABLE_REBOOT


  重新编译系统内核并使之生效。

  三、系统配置

  1.修改/etc/inetd.conf文件内容,配置inetd服务

  (1)telnet服务

  我们将使用SSH远程管理这台服务器,因此禁止telnet服务:在行前加"#"标记。

  (2)FTP服务

  使用系统自带的FTP服务,并作如下设置:

  ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l -l -h

  -l 参数,记录每个成功或者失败的FTP登录尝试;
  -l -l 参数,所有的下载、上传、删除更动作和文件名都会被记录下来(设置syslog.conf)
  -h参数,将禁止主机相关信息的输出,例如ftpd版本、主机名等;
  -P参数,指定FTPD进程监听端口号

  FTP服务其他安全方面的设置:

  把网站编辑帐号放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录,防止浏览其他目录。
  编辑/etc/hosts.allow 文件,限制对FTPD的访问。
  可以编辑/etc/ftpwelcome,防止泄露系统信息。

  2.修改/etc/rc.conf文件,配置系统初始参数

  #配置开机器后自动启动或关闭的守护进程
  #可以关闭inetd,使用SSH代替了telnet服务,使用其他的FTP服务程序代替系统的ftpd。
  inetd_enable="NO"

  #如果决定使用inetd则启动inetd的日志选项,并提高一个服务每分钟启动的上限数目(默认是256,建议提高到1024),防止DoS攻击;

  inetd_enable="YES"
  inetd_flags="-l -R 1024"

  #打开SSHD
  sshd_enable="YES"

  #禁止syslogd记录其他主机日志(关闭端口514)
  syslogd_enable="YES"
  syslogd_flags="-s -s"

  #关闭不必要的服务。本服务器没有NFS、NIS登需要,可以关闭portmap (关闭端口111)
  portmap_enable="NO"
  nfs_server_enable="NO"
  nfs_client_enable="NO"

  #使sendmail只监听localhost,允许邮件客户程序发送邮件
  sendmail_enable="NO"
  #设置为"NONE",将彻底关闭25端口

  #设置内核安全级别(Securelevels)
  #内核安全级别从-1到3,-1和0级别是非安全级别。
  #系统在多用户模式下,安全级别只能提升不能降低。
  #Securelevel -1,永久不安全模式
  #Securelevel 0,不安全模式
  #Securelevel 1,安全模式
  #Securelevel 2,高安全模式
  kern_securelevel_enable="YES"
  kern_securelevel="2"

  #计算机启动时候发现文件系统失效,将以-y参数运行fsck

  fsck_y_enable="YES"

  #打开磁盘配额
  enable_quotas="YES"
  check_quotas="YES"

  #在系统启动时清空/tmp
  clear_tmp_enable="YES"

  #防止系统自动加入信息到motd
  update_motd="NO"

  #启动防火墙设置
  firewall_enable="YES"
  firewall_logging="YES"
  firewall_script="/etc/firewall.rules"

  #丢弃SYNFIN信息包。缺省时设置为”NO”,当设置为”YES”的时候,系统内核将忽略同时设置了syn和fin位的TCP桢(需要内核的支持:options tcp_drop_synfin)
  tcp_drop_synfin="YES"

  #丢弃ICMP重定向。可以防止DOS攻击或劫持进程(hijack sessions)
  icmp_drop_redirect="YES"
  icmp_log_redirect="YES" #记录ICMP重定向
  #在CISCO路由器上关闭重定向:no ip send-redirects

  log_in_vain="YES" #记录每一个到关闭端口的连接企图。
  accounting_enable="YES" #打开系统审计功能


  3.修改/etc/sysctl.conf文件,调整IP堆栈


  #关闭对广播类型的响应,过滤ICMP响应后,服务器无法ping 通,可以提高部分安全性能
net.inet.icmp.bmcastecho=0
  #对UDP包的校验和进行计算,防止不正确的UDP包的攻击
  net.inet.udp.checksum=1

  #在默认情况下,操作系统在关闭的端口上接受到TCP SYN段的时候,会发送RST信息包,告诉攻击者这个端口关闭了,导致攻击者继续扫描下一个端口,使端口扫描简单化,浪费了本机CPU时间在DOS上。我们可以使用blackhole来控制对没有socket监听的TCP或者UDP端口接受到连接请求时的行为。
  #当设置这个选项后,系统将马上丢弃这个包而不发RST包,连接端将看到"Connection reset by peer."

  net.inet.tcp.blackhole=2
  net.inet.udp.blackhole=1

  4.防火墙规则设置

  尽管按照上面的叙述已经能够形成一定的防护,但是若要实现安全程度更高的主机系统,就要借助于IPFW这样的包过滤软件,通过设置防火墙规则,严格限制对服务器的访问。

  过滤ICMP服务,命令格式:

  ipfw add pass log icmp from $ip to any [要处理的协议]

  icmp是使用类型规定出站的信息。
  0 echo-reply ping
  3 destination unreachable Any TCP/UDP traffic(主机不可到达)
  5 redirect routing if not running routing daemon(如果未运行路由守护程序,复位向路由)
  8 echo-request ping (入站信息)
  11 time-exceeded traceroute (traceroute 超时)

  配置文件的例子:
  ip="你自己的IP"

  #强制清除所有规则
  ipfw -f flush

  ipfw add pass log udp from $ip to any
  ipfw add pass log icmp from $ip to any icmp 8#接受回答
  ipfw add pass log icmp from not $ip to $ip icmp 0#拒绝请求
  ipfw add pass log icmp from not $ip to any icmp 11# traceroute 超时
  ipfw add pass log icmp from not $ip to any icmp 3#目标主机不可到达

  #SYN、FIN组合的包一般是nmap、queso扫描器使用,所以过滤。
  ipfw add deny log tcp from any to any in tcpflags syn,fin

  #检查通信状态
  ipfw add check-state
  ipfw add deny tcp from any to any in established
  ipfw add allow ip from any to any out keep-state

  #允许ident请求
  ipfw add allow tcp from any to any 113 keep-state setup

  5.日志管理

  (1)启动日志
  修改/etc/rc.conf文件。使用 "-s -s"标志启动syslogd,防止打开UDP 514端口;

  (2)修改/etc/syslog.conf文件,配置syslogd

  #可以将本地日志记录到其他主机loghost上:
  *.*@loghost

  #为FTP增加日志条目:
  ftp.* /var/log/ftpd
  #相关命令:touch /var/log/ftpd

  #记录SSH连接记录
  security.*;auth.info /var/log/security #记录连接到SSH的日志信息
  auth.* /var/log/authlog

  #使ipfw能够用syslog记录
  !ipfw
  *.* /var/log/ipfw.log

  (3)使用newsyslog压缩日志
  newsyslog程序能够定时压缩日志文件并清除旧的文件是,freebsd默认安装的,它是从crontab启动的:

  #grep newsyslog /etc/crontab
  0 * * * * root /usr/sbin/newsyslog

  可以修改/etc/newsyslog.conf以符合你的需求。通常把文件属性从664变为640,不让一般用户查看系统记录。

  /var/log/authlog root.wheel 640 7 100 * Z
  /var/log/ipfw.log root.wheel 640 3 100 * Z
  #这会在日志文件达到100K时将它压缩并编号,将mode改成640,chown成root.wheel,并删除旧的日志文件。

  #相关操作:
  #cd /var/log
  #chmod g-w,o-r *;chmod a+r wtmp
  #把所有文件的组属性改为wheel的。

  #防止一般用户读日志配置文件
  #chmod 600 /etc/syslog.conf
  #chmod 600 /etc/newsyslog.conf

  四、用户管理


  1.限制登录条件

  (1)把个人用户放到/etc/ftpchroot文件中,把他们限制在自己的HOME目录

  (2)修改/etc/shells文件,增加不能用来登录的shell,如passwd或者nologin,赋予仅需要FTP功能的用户以/usr/bin/passwd的shell 阻止他们使用SHELL命令。

  (3)拒绝直接以root身份登录:

  在/etc/ttys文件中,将"secure"标记改为"insecure"标记,使系统在进入单用户模式时会要求root密码。但是这样以来也为恢复root密码制造了障碍——安全和易用再次形成了矛盾的两个对立面。

  console none unknown off insecure

  (4)使用 tcp wrapper (/etc/hosts.allow)允许/拒绝访问特定的TCP服务。

  tcp_wrappers 可以在访问者要求服务前先检查/etc/hosts.allow 文件中设定的规则,符合放行规则的才会去启动服务程序,可以达到有条件开放系统服务的目的。

  在/etc/host.allow文件中,注释掉"ALL:ALL:allow",去掉其他无关服务访问,增加如下内容:

  sshd: localhost : allow
  sshd: friendlycomputer : allow
  sshd: all : deny

  另外需要注意的是:

  注意规则的先后顺序,因为tcp_wrappers的规则有first match 的特性,最好把放行的规则写在前面,然后在后面加一条全部禁止的规则;

  为避免 DNS 欺骗,规则尽量使用IP表示;

  FreeBSD缺省的/etc/hosts.allow中第一条规则是 ALL : ALL : allow,自己的规则一定要放在他前面才有效。

  (5)使用 allowuser/allowgroup SSH配置选项以允许特定的用户和组使用SSH连接。

  (6)限制登录的用户、组以及登录地方,修改/etc/login.access。

  (7)利用login.conf对用户的登录环境和资源许可进行设置。

  FreeBSD系统使用/etc/login.conf中描述的数据将用户按照登录环境、强制性的资源限制以及记帐管理登分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中该用户的设置中。

  每次修改login.conf后,都要进行更新登录数据库的操作:

  #cap_mkdb /etc/login.conf

  由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别,如果要进行修改,必须使用vipw来修改/etc/master.passwd文件中的5个域。


  2.登录环境


  (1)编辑/etc/motd文件,阻止计算机泄露系统信息

  (2)删除版权信息
  #touch /etc/COPYRIGHT

  (3)防止系统自动加入信息,修改/etc/rc.conf
  update_motd="NO"

  (4)修改登录提示,编辑/etc/gettytab,找到default:小节,他以下面的文字开头:
  :cb:ce:ck:lc

  小心的修改r:之间的文字来适应自己的需要。

  3.crontab的问题

  建议 www、nobody、bind等用户不能使用crontab,建立/etc/cron/allow文件把需要使用的用户放进去,如:
  #echo root>/var/cron/allow
  #chmod 600 /var/cron/allow

  如果不使用at命令,就关闭这个服务,在/etc/crontab文件中注释掉
  # */5 * * * * root /usr/libexec/atrun

  4.保护文件系统

  (1)锁住文件系统

  A.修改/etc/fstab文件,设置系统启动时自动挂接的文件系统,使用nosuid参数挂接/usr 或 /(目的是/sbin)文件系统,尤其是一般用户可以写入的文件系统,应单独划分分区:

  /home or /usr/home
  /tmp or /var/tmp

  /etc/fstab文件内容:
  /dev/sd0s1e /var/tmp ufs rw,nosuid 2 2

  B.搜寻并去除不用的二进制文件的suid位,(尤其是uucp——setgid)
  C.使用chflags设置变量,例如,给日志文件设置sappnd,给系统二进制文件设置schg标志;

  #相关命令:
  #找出你所有的可写入目录,
  #find / -perm -0777 -type d -ls

  找出那些程序是suid 或者sgid的命令:

  #find / -perm -2000 -ls
  #find / -perm -4000 –ls

  (2)文件保护,严格限制系统配置文件权限,只对root用户开放读写权利:

  #chflags schg /bin/*
  #chflags schg /sbin/*

  #chmod 600 /etc/firewall.rules
  #chmod 600 /etc/crontab
  #chmod 600 /etc/newsyslog.conf
  #chmod 600 /etc/rc.sysctl
  #chmod 600 /etc/rc.conf
  #chmod 600 /etc/syslog.conf
  #chmod 600 /etc/sysctl.conf
  #防止一般用户读日志文件
  # chmod 640 /var/log/httpd-access.log

  (3)可以把不是很有用的程序 chmod 000,如uustat,uucico。如果你从来不碰uucp或是PPP和PPPD的话,你绝不会用到他们。如果不用打印机的话,把lpr lprd也chmod 000了吧。

  5.其他相关

  修改计算机相关设置,如BIOS,不允许软盘启动、CDROM启动,即在装载硬盘驱动之前不允许其他媒介启动,设置BIOS密码,保护机器物理安全。

  五、配置SSH


  修改/etc/ssh/ssh_config文件

  (1)使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻击者通过修改携带的版本banner来劫持(hijacking)启动会话进程并降低到protocol 1。注释掉protocol 2,1 改用下面语句代替:

  protocol 2

  (2)合理设置最大连接数量, 防止DOS攻击

  MaxStartups 5:50:10

  (3)禁止远程root和空密码登录,建议关闭X11forwording

  X11Forwarding no

  (4)强烈建议不使用静态密码,而使用DSA 或RSA KEY,修改如下内容可以关闭使用密码认证:

  PasswordAuthentication no

  (5)可以限制组或光是单个用户访问shell

  AllowGroups wheel
  AllowUsers xundi

  (6)使用TCP wrappers来限制一些访问,修改/etc/hosts.allow文件,注释掉"ALL : ALL : allow",增加如下内容:

  sshd:localhost:allow
  sshd:friendlcomputer:allow
  sshd:all : deny

  #相关命令:
  #chsh -s /sbin/nologin user

  六、总结和补充

  使用最新版本的操作系统;推荐使用STABLE或者最新RELEASE分支。
  修改系统前,首先备份系统。
  修改/etc/inetd.conf和rc.conf关闭可有可无和不必要的服务。
  立即禁用telnet,使用SSH代替之——OpenSSH在freebsd安装时即被包括。
  使用SSH2协议中内建的sftp服务代替标准的ftp
  建立SSH公钥防止口令传输。
  使用包过滤软件类如ipfw或者ipfilter限制服务的获取。
  禁止不需要的帐户
  应用组和用户的概念
  设置正确的文件权限
  以chroot环境运行具有潜在危险的程序,例如bind
  使用sudo,非严格root级访问
  限制某些强大命令的访问
  如何检查你的安全性

  /usr/ports/security/nmap 对自己进行端口扫描,以发现异常服务
  /usr/ports/security/whisker 对WEB服务器进行审计,防止潜在破坏
  /usr/ports/security/tripwire-
  /usr/ports/security/snort

  日常操作

  (1)经常查看http://www.freebsd.org/security/index.html的安全公告;
  (2)订阅security bugtraq和freebsd官方安全邮件列表了解安全动态;
  (3)每天查看系统日志,关于检查系统日志,你可以通过其他工具增加多信息的捕获,如snort可以比较完全的记录信息;
  (4)如果你的硬盘够大,信息处理够快,可以定时使用 netstat -an >> /.../.../netstat.log来记录信息,因为netstat能记录连接信息,所以如有些后门日志不能记录,但netstat却在一定时间里总有连接记录。
  (5)如果你对文件系统有原始的记录,可以定时使用一些系统完整性检查工具进行检验;
  (6)如果你有防火墙,经常查看防火墙信息。


另一相关帖子内容

http://www.jgwy.net/bbs/read.php?tid=103238&keyword=

闲趣---转自金光


- 作者: clay111 2007年05月24日, 星期四 12:18  回复(0) |  引用(1) 加入博采

vsftp配置大全
原文摘自:
http://bbs.bitscn.com/64783

环境 vmware+solaris9+vsftpd 2.0.3

1.从哪里下载vsftp的安装包
2.如何编译vsftp安装包
前两步就不赘述了,坛子里有好多帖里都有,search一下就能找到。

3.编译完成的文件需要如何安装到系统中去?
需要将编译完成的哪些文件拷贝到系统的哪些目录下
      编译完后将产生vsftp文件,其他的配置文件,帮助文件(man)应该是编译前已经存在的了
     。应此需要拷贝的文件有:
      vsftpd
      vsftpd.conf.5
      vsftpd.8
      vsftpd.conf
     拷贝路径为:
      vsftpd          /usr/local/sbin/
      vsftpd.conf.5   /usr/local/man/man5/
      vsftpd.8        /usr/local/man/man8/
      vsftpd.conf     /etc/
      (ps 安装文档中说可以用make install,但是我运行时,总是不成功)

4.运行vsftpd的最小设置:
  4.1 需要系统中有一个nobody用户,如果没有自己创建。
  4.2 需要系统中有一个ftp用户(作为vsftpd的匿名用户),要修改宿主目录为其他用户所有,
       并去掉改目录og的可写属性,例如,ftp的宿主目录是/var/ftp/,修改宿主目录属性:
       chown root:root /var/ftp
       chmod og-w /var/ftp
  4.3 需要创建/usr/share/empty/目录,这是vsftpd要求的默认配置,我也不知道做什么用的,:)

5.运行方式的选择:
5.1 standalone 方式:
     独立运行模式,不需要inetd作为"中间人"的方式:
     在/etc/vsftpd.conf 最后添加一行:
     listen=YES (注意,vsftpd.conf中的所有"="两边不能有空格。)
5.2 inetd 方式:
      把/etc/inetd.conf 中的ftp stream....  中in.ftpd 改成vsftpd,最后是启动参数vsftpd /etc/vsftpd.conf(替换掉 in.ftpd -a)就可以了
      设置/etc/vsftpd.conf中的listen=NO(如果不改的话,第一次ftp会失败,ctrl+c中止后,再ftp时,就可以用了,我试了两次,是这个结果)


在5.1后,vsftpd最小配置已经完成,就可以使用/usr/local/sbin/vsftp & 直接运行vsftpd,尝试用
ftp用户来登录,感受一把,呵呵。

6.增加自启动功能:

   将/etc/inetd.conf中的 ftp stream ..... in.ftpd 用#注释掉
   /etc/services 中的ftp  21/tcp 不要注释,否则无法连接到服务器上。

   vi /etc/rc3.d/S83vsftpd

     #!/sbin/sh
     case "$1" in
     start)
            /usr/local/bin/vsftpd &
     ;;
     stop)
            pkill vsftpd
     ;;
     *)
            echo "Usage: $0 { start | stop }"
            exit 1
     ;;
     esac
     exit 0  
    这个应该是standalone的自启动脚本,inted方式则不用。
    写好脚本后,将脚本增加执行权限:u+x,如果愿意可以把用户和组都改为和系统默认一致:root:sys


7.vsftp功能详细配置:

  先假设一下需求:
  7.1 需要能匿名登录vsftp server,只允许下载公开的内容,不允许匿名用户上传和和其他操作。

    根据需求,在vsftpd.conf中加入
     anonymous_enable=YES
     anon_world_readable_only=YES
     non_upload_enable=NO
     anon_mkdir_write_enable=NO
     anon_other_write_enable=NO
    其实这些采用默认值就可以了,也就是说,对于匿名用户,采用默认的设置已经可以实现7.1的需求了。
    只要在/var/ftp/放入给匿名用户下载的文件就可以了。

   
                 


以下时匿名用户和本地用户配置文件的主要参数值。

加入你想配置匿名ftp,把如下的参数存成vsftpd.conf,放到/etc下,不用安装包提供的那个示例配置文件(vsftpd.conf)

匿名ftp的以上控制分别为:
用户控制

anonymous_enable=YES         启用匿名用户
no_anon_password=YES         需要密码
anon_root=/var/ftp           匿名用户的主目录(默认为/var/ftp)
local_enable=NO              禁用本地用户
guest_enable=NO              禁用gust用户
ftp_username=ftp             匿名用户的用户名(默认还有anonymous可使用)

权限控制

write_enable=NO                 匿名用户不可写
local_umask=022                 上传文件的umask
file_open_mode=0666             上传文件的总权限,与umask共同决定了上传文件的实际权限
anon_upload_enable=NO           匿名用户不可以上传
anon_mkdir_write_enable=NO      匿名用户不可以建目录等写操作
anon_other_write_enable=NO      匿名用户不可以做其他的写操作
anon_world_readable_only=YES    匿名用户可以读文件
#chown_uploads=YES               修改上传的文件的属主
#chown_username=ftpadmin         修改上传的文件的属主为XXX
ascii_upload_enable=NO          不使用ascii上传文件
ascii_download_enable=NO        不使用ascii下载文件

secure_chroot_dir=/usr/share/empty  默认值

超时控制

idle_session_timeout=600          空闲超时600秒
data_connection_timeout=120       传输超时120秒