Peaceful mind Where there is a will, there is a way!

4Aug/090

从零开始快速搭建freebsd应用服务器

关键字:

phpize,m4,autoconf,jpgraph,postgresql,mysql,sqlite,gd,vmware,mysql-front

freebsd 4.10vmware为例进行说明
本文档没有对apache,mysql

的优化等方面进行讨论,只是针对初学者快速搭建自己的开发平台,应该能应付大部分的个人开发了。
1freebsd 的安装
我选择的是最小安装,不装图形界面,port都没安装(千万别鄙视我,虽然portfreebsd的最大特色).只安装了支持linux的那个包,其余全部选否,由于是自己用,我没考虑连到internet,只是在主机和虚拟机构成的网络中运行,因此vmware选择host-onlynat方式都可以.这个安装估计只要10分钟左右.
安装好后,执行/stand/sysintall启动安装,选择configure-networking,获得ip地址,这样你就获得了ip地址,这个地址就是你做服务器要用到的地址.然后选择configure-packages安装一些后面要用到的包.具体如下:samba,png,gettext,gmake,jpeg,freetype,libiconv,tiff,expat,就这几个包,具体那个包在那个类下,你自己慢慢找就可以了.为什么装samba?很明显就是为了和linux主机共享来用的,当然你也可以借助一些工具,ssh等来进行windowlinux之间的文件传输.具体就是修改/etc/ssh/sshd_config文件,把里面PermitRootLogin置为yes就可以了,因为freebsd默认只支持普通用户ssh登录,如果要用root远程登录,必须修改这里.samba安装好后,有几个步骤执行,步骤一:生成配置文件cp /usr/local/etc/smb.conf.default smb.conf ,修改2个地方就可以了.hosts allow,encrypt passwords.如果需要更复杂的配置的,可以用testparm命令来检查配置文件是否正确。步骤二,生成开机启动samba,cp /usr/local/etc/rc.d/samba.sh.sample samba.sh,第三步,添加samba用户,首先我们在系统中添加一个用户,比如lizl,然后用smbpasswd –a lizl,按提示输入用户密码,freebsd默认不会建立/home/lizl目录,我们在根目录下手动建立,并在lizl建立public_html目录(apache中将要提到).为了方便使用,我们一般建立网络映射到该目录.这样就能把安装包和程序等传到我的linux主机上了

2.apache的安装
关于apache的安装,强调二点,其一,动态编译apache,这样就可以到后面扩展其模块(比如sqlite),其二,apache版本的差异,编译选项不同.如下:
apache1
版本:
apache2版本:
 

./configure --prefix=/usr/local/apache --enable-module=so --enable-module=rewrite --enable-shared=max --enable-module=ssl

 

./configure --prefix=/usr/local/apache2 --enable-so --enable-mods-shared=most --enable-module=ssl --with-ssl=/usr/local/openssl

编译安装完成即可.修改配置文件httpd.conf,修改2个地方就可以了,增加

AddType application/x-httpd-php .php .htm;

然后把/home/*/public_html所在的块的前1,2

行注释掉

<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS PROPFIND>
#        Order allow
,deny
#        Allow from all
#    </Limit>
#    <LimitExcept GET POST OPTIONS PROPFIND>
#        Order deny
,allow
#        Deny from all
#    </LimitExcept>
</Directory>

配置完后,可以通过/usr/local/apache/bin/apachectl configtest 测试配置文件是否正确。

可以看到,上面的编译中有支持ssl。这需要在安装apache之前安装好openssl和mod_ssl(注意下和你php相一致的版本)
openssl的安装

./config --prefix=/usr/local/openssl 
make
make install

安装mod_ssl

./configure --with-apache = apache源代码路径 --with-ssl=openssl的源代码路径
#注意这里不需要安装,只要把mod_ssl编译进apache就okay

接下来就可以安装apache了。但要注意apache2中才有--with-ssl选项,并且安装前需要执行make certificate 生成证书,然后再make install
3.数据库的安装
1mysql安装
我这里使用的是mysql-4.1.13a版本,据说从这个版本开始,mysql的数据库有了比较大的改动,有兴趣的读者可以去研究下。
编译参数说明(具体可用./configure --help|more 查看):
Prefix:安装路径
Sysconfdirmysql配置文件my.cnf的路径;Cp /usr/local/mysql4/share/mysql/my-medium.cnf /etc/my.cnf
Localstatedir
:数据库存放路径
–with-charset:字符支持
–with-isam:支持老的isam类型的表
–with-unix-socket-pathmysql.sock所在位置

mysql常见问题
问题 1:Can’t connect to mysql server through socket ‘/tmp/mysql.sock’
解决:
1.mysqld是否启用,用top命令查看是否有mysqld进程
2./tmp/mysql.sock是否已经存在
3.

权限问题
添加专用的mysql组和mysql用户修改用户密码:
/usr/local/mysql4/bin/mysqladmin –u root –p password 123456;

问题2:Localhost

可以访问,远程机器不允许访问的问题
解决:
1.如果是mysql 4.1以上版本,mysql-front版本必须用3.2
2.修改mysql数据库中user表中的host%,允许任何主机访问(自己测试用嘛,安全性先不考虑,呵呵)

问题3:Client does not support authentication protocol requested by server; consider upgrading MySQL client cgi
解决:
1.SET PASSWORD FOR 'root'@'%' = OLD_PASSWORD('123456');
2.UPDATE mysql.user SET Password = OLD_PASSWORD('123456') where host='%' and user='root';flush privileges

 (2)Postgresql的安装
   注意postgresql需要用gmake编译安装,与我们用的make不同。
 (3)Sqlite的安装
由于php4是不支持sqlite3版本的,因此我们需要通过编译扩展模块来安装php对sqlite的支持
4.gd库的安装
如果要支持jpgraph库,非要gd2版本以上才行,这里png,jpeg的支持我们在freebsd安装的时候已经装上了,不用再重新下包安装编译完会有提示你xpm library font_config(gnome用到的)不可用,不用管它,继续make,这个时候会报错.我们需要编辑gdhelper.h文件,pthread相关的部分去掉.重新make&& make install就可以了.如果要支持gif图形,可以下载gd-1.8.3-gif.tar.gz相关包安装。

6.编译支持sqlite数据库
用的是phpize编译,用pear编译没试过,大家自己研究吧这里会提示你需要autoconf包,下载该包安装时编译autoconf时,出现
>  checking for m4... /usr/bin/m4
>  checking whether m4 supports frozen files... no
>  configure: error: GNU M4 1.4 is required
找不到m4,但我的m4确实安装了,不过目录不对,我安装在/usr/local/bin,而freebsd/usr/bin/下有个默认的m4,是freebsd版本的,不是gnu版本的,于是覆盖安装重新安装m4.下载安装后,发现还是编译不过,因为freebsd自带的m4 /usr/bin 被先找到,删除该m4,就可以重新安装好autoconf.
继续配置安装sqlite库
这样就在你在php.ini中指定的extensions_dirno_XXXX下生成sqlite3.so,将该扩展库拷贝到extensions_dir,并在php.ini中加入
Extensions=sqlite3.so.重启apache后既支持sqlite数据库了.注意对于sqlite3以下的版本,可以不用安装单独安装sqlite2,直接编译扩展库即可,方法为

tar -zxvf  sqlite3-0.4.tgz
cd sqlite3-
0.4
/usr/local/php4/bin/phpize

 

./configure –with-php-config=/usr/local/php4/bin/php-config –with-sqlite3=/usr/local/sqlite3

 

tar xzvf SQLite-1[1].0.3.tgz
cd SQLite-1[1].0.3
/usr/local/php4/bin/phpize
./configure –with-php-config
=/usr/local/php4/bin/php-config 

其它操作和sqlite3的安装一样

 

 

Groupadd mysql
Useradd mysql –g mysql
Chown –R mysql:mysql /usr/local/mysql4
Chown –R mysql:mysql /var/db/mysql4

 

./configure
Gmake
su
gmake install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data >logfile 
2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test

 

./configure –prefix=/usr/local/sqlite2 && make && make install
./configure –prefix
=/usr/local/sqlite3 && make && make install

 

./configure –prefix=/usr/local/gd2 –with-png=/usr/local –with-jpeg=/usr/local

 

5.安装php
我用的php版本是4.4.2版本,其它版本没有测试过。注意php.ini默认安装在/usr/local/php4/lib/php.ini下,但可以添加sysconfdir编译选项到你想要的任何位置

'./configure' '--prefix=/usr/local/php4' '--with-apxs=/usr/local/apache/bin/apxs' '--with-mcrypt=/usr/local/libmcrypt' '--with-iconv' '--with-gettext' '--with-mysql=/usr/local/mysql4' '--with-pgsql=/usr/local/pgsql8' '--with-gd=/usr/local/gd2' '--with-jpeg=/usr/local' '--with-png=/usr/local' '--with-zlib' '--enable-mbstring' '--enable-gd-native-tiff' '--with-tiff=/usr/local' '--with-freetype-dir=/usr/local'
./configure --prefix=/usr/local/mysql4/ --sysconfdir=/etc --localstatedir=/var/db/mysql4 –with-charset=gb2312 –with-isam –with-unix-socket-path=/tmp/mysql.sock

 

Tagged as: No Comments
31Jul/090

初识活动目录

活动目录只能安装装window平台上,并且只能是服务器版。
 
(1) 活动目录的安装很简单,网上资料很多。我碰到的问题:建立用户时提示密码不符合系统密码复杂策略”,此时需要到管理工具-》域安全策略=》密码策略中去修改相应的设置。由于是自己测试用,所以一般都是降低安全策略。当然你也可以不改,按默认的规定,有关密码规定可参考:http://support.microsoft.com/kb/279890/zh-cn

(2) 如何从活动目录上获取自己想要的数据

活动目录安装完成后,我们可以看到系统默认有很多组,ou,用户及其机器名等。此外,为了满足自身的要求,管理员也会自定义一些组织和用户等信息。而我们感兴趣的可能仅仅是我们自定义的那些内容,比如组织和用户。

2-1:获取用户的帐号名       ------ 使用samaccountname属性

2-2:获取用户的组织名       ------ 使用dn属性中的ou ,如 cn=tomou=computerdc=lizldc=com

2-3:如何区分机器,帐号和组 ------ 使用objectcategory属性的cnPerson:帐号;computer:机器;group:组)

2-4:如何获得帐号的中文名?

2-4-1:新建时没有设定中文名,后面再修改。使用displayname或者sngivename属性来构成中文名

2-4-2:新建时已经设置了中文名,直接用name属性或者displayname属性获取

经本人验证,活动目录在建立新的用户的时候,必须填入姓(对应givename属性),名(对应sn属性),而全名是自动由这2者构成。添加用户成功后,自动将displaynamecnname属性设为全名;其中cnname属性是不能修改的(我没有找到修改的地方,如果有知道的请告知,在此谢过)。我们在修改用户时修改的只是sngivennamedisplayname等属性。因此我们要想获得帐号的中文名,最好是通过displayname来取,而不用name属性。万一没有displayname属性怎么办?事实也确实如此,系统中有些自带的对象所对应的条目的确不存在displayname这样的属性。不用担心,我们可以先通过2-12-22-3等条件过滤后就可以保证取出的数据都含有displayname属性

30Jul/090

奇怪的AD查询限制

 出于保护AD免受拒绝服务攻击和过渡搜索的负面性能影响,在返回LDAP搜索结果时,AD默认设置了一个最大不超过1000的限制。可以用ntdsutil进行修改。具体请参见http://blog.csdn.net/myanm/archive/2006/06/22/822068.aspx。(所有版权归原作者所有,偶只是转载)除了AD外,openldap也有类似的限制,可以通过修改配置文件ldap.conf来更改。
此外,如果通过php中自带的ldap函数ldap_set_option来修改此设置,只有当设置的值比AD上设置的数字小时,可以获得想要的结果。当设置的值比AD的值大时,以AD默认的值为主。

Tagged as: No Comments
4Jul/090

DB连接oracle10g数据库

DB是PEAR中的一个包,提供了目前市面上绝大多数数据库的连接层。我的oracle 10g安装在window xp上,因为听说oracle在linux下的安装十分麻烦,当然舍繁求简啦(不过以后有机会还是可以试试)。。一路按照向导安装就可以了,一般都没什么问题。我曾经尝试在freebsd下连接oracle 10g数据库,但屡试屡败,最终放弃。。换成linux系统。。果然一试就灵。
客户端连接oracle数据库大体有2种方法,一种是在安装oracle标准的客户端,这种方法需要配置相关的参数,如oracle_sid等。这种情况在window系统下安装也很简单,但在linux下就没那么轻松了。另外一种是通过安装instant client客户端,这个不需要任何配置相关参数,当然还是要设置几个常见的环境变量以便解决用一些工具连接oracle乱码的问题。因此,我推荐如果是linux客户端,用instant client比较方便而且简单。
首先我们去oracle的官方网站下载instant client客户端,一般来说,和你oracle服务器的版本保持一致,我就用的是
oracle-instantclient-basic-10.2.0.3-1.i386.rpm
oracle-instantclient-devel-10.2.0.3-1.i386.rpm(这个不一定需要,安装也没啥影响)
使用rpm -Uvh安装好这2个包。。
重新编译安装php,使用如下配置命令

'./configure' '--prefix=/usr/local/php4' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-mcrypt=/usr/local/libmcrypt' '--with-iconv' '--with-gettext' '--with-mysql=/usr/local/mysql4' '--with-zlib' '--enable-mbstring' '--with-oci8-instant-client'

这是最简单的配置,仅仅用来验证连接oracle用的。我用的php版本是4.4.2,因此直接支持--with-oci8-instant-client,不知道php早期的版本支持不支持该编译选项,但早期的版本是支持--with-oci8的。。,php安装好后就可以用phpinfo查看是否支持oci8,见我的

OCI8 Support enabled
Revision $Revision: 1.183.2.18.2.3 $
Oracle Version 10.1
Compile-time ORACLE_HOME /usr/lib/oracle/10.2.0.3/client/lib
Libraries Used no value

其中/usr/lib/oracle/10.2.0.3/client/lib就是我们安装上面basic包产生的。
安装完毕后就可以用DB连接oracle数据库了。DB库的具体使用请参考pear.php.net
oracle的dsn为:oci8://username:password@myoracle,用户和密码就不用说了,myoracle是指你的数据库实例名,就和oracle默认的orcl一样,而不是你服务器的ip地址,这个地方我弄错过。。友情提醒一下。。具体调用请看下面调用代码

include_once "DB.php";
$dbconn = DB::connect($dsn, false);
if (DB::isError($dbconn))
    exit;
$sql   = "select * from v$parameter";
$result = $dbconn->getAll($sql,array(),DB_FETCHMODE_ASSOC);

本来以为这样就可以大功告成了,那知道当sql语句中的字段为小写时居然查不出数据。。。什么地方出毛病了?我开始以为是php少安装了某个库,但仔细查看,我用同样的配置连接mysql都没有任何问题,看来是oracle数据库的问题。。。网上有人通过改oracle的相关配置参数说可以实现大小写兼容。但我试过alert session set 参数=value还是不行。不过大多数人说通过oracle自带的lower和uper函数来实现。我觉得在每个字段加这么一个函数太麻烦。。。。于是在数据库连接层DB上动脑筋,DB提供的getall方法,如果修改一次,不就可以不必每次都加lower和uper函数了吗?于是找到DB/common.php文件,修改其中的getall方法。。将

$results[] = $row;这行改成$results[] = array_change_key_case($row);即可了。。
最后谈下oracle的客户端连接工具的乱码问题。。。我用toad和PL/SQL连接oracle数据库时,中文都出现乱码。。
于是我在linux里设置了以下环境变量

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
export LC_ALL="simplified chinese"
export LANG="simplified chinese"

注意上面=号2边千万不要有空白字符,这可不是写代码的良好习惯的体现。。否则根本就不能正确设置。。我又在这上面栽了半天。。。呵呵。
ok,基本上在linux用php连接oracle数据库就没什么问题了。。。。祝大家好运

 

Tagged as: , No Comments
3Jul/090

使用samba将linux主机加入AD域(一)

研究了2个星期的一点小成,写出来供大家分享。所有功能都在as3下调试通过。为了图方便,as3采用默认安装。

在研究中经常看到下面这些东东,还是先了解下理论依据
PDC:主域控制器,一般用来做验证
BDC:备份域控制器,一般用于和主域做同步帐号等操作
KDC:密钥分发中心,说白了,就是kerbrose服务器。这个需要对kerbrose有一定的了解,这里不多说了
PAM:可插拔认证模块,这玩意就是使用不同的验证方法来验证你所需要的服务,比如sshd,login,ftp等。这些服务都对应一个配置文件,这个配置文件位于/etc/pam.d/下。而支持这些验证的动态库位于/lib/security/下。
SRV:服务器定位资源记录,要使活动目录正常工作,DNS必须支持SRV。活动目录客户端和域控制器使用SRV记录决定域控制器的ip地址,具体请参见http://www.cnblogs.com/LCX/archive/2007/02/05/640843.html

下面言归正传,介绍如何将samba服务器加入到AD域中
(1)配置/etc/samba/smb.conf

workgroup = LIZL # 你要加入的域,比如你AD上建的域叫LIZL.COM,这里只需省略填入即可
# winbind
   netbios name 
= leeldap        #你的linux机器名,samba服务器
   idmap uid    
= 15000-20000
   idmap gid    
= 15000-20000
   winbind enum groups 
= yes
   winbind enum users  
= yes
   winbind separator   
= /
  
; winbind use default domain = yes
   template homedir = /home/%D/%U 
   template shell   
= /bin/bash
   security 
= domain
   password server 
= 192.168.115.128 #这里是你的安装ad的机器的ip
   encrypt passwords 
= yes
    hosts allow = 192.168.1. 192.168.2. 127. 192.168.115.
[homes]
   comment 
= Home Directories
   path 
= /home/%D/%U
   browseable 
= no
   writable 
= yes
   valid users 
= %D/%U    #这里记得把域名带上,否则你用ad帐号访问samba服务器时输入正确的ad帐号和密码仍然不能访问共享目录
     create mode = 0777
     directory mode = 0777

(2)配置/etc/nsswitch.conf

passwd:     files winbind
shadow:     files
group:      files winbind

(3)启用samba和winbind服务。

 service smb reload   #加这一句是用来解决有时候samba启动不了的问题 
  service smb start
  service winbind start

(4)使用net加入AD域

[root@leeldap pam.d]# net rpc join -S lee -U administrator
Password:
Joined domain LIZL.

(5)测试是否加入成功

[root@leeldap pam.d]# net rpc testjoin
Join to 'LIZL' is OK
[root@leeldap pam.d]# wbinfo -t
checking the trust secret via RPC calls succeeded
[root@leeldap pam.d]# wbinfo -u
LIZL/Administrator
LIZL/brown
LIZL/bruce
LIZL/Guest
LIZL/jet
LIZL/krbtgt
LIZL/lee
LIZL/lili
LIZL/lizl
LIZL/samba
LIZL/SUPPORT_388945a0
LIZL/test
[root@leeldap pam.d]# wbinfo -g
BUILTIN/System Operators
BUILTIN/Replicators
BUILTIN/Guests
BUILTIN/Power Users
BUILTIN/Print Operators
BUILTIN/Administrators
BUILTIN/Account Operators
BUILTIN/Backup Operators
BUILTIN/Users
[root@leeldap pam.d]# getent passwd
root:x:
0:0:root:/root:/bin/bash
。。。。。。。
LIZL/administrator:x:
15000:15000::/home/LIZL/administrator:/bin/bash
LIZL/brown:x:
15001:15000:Brown Lee:/home/LIZL/brown:/bin/bash
LIZL/bruce:x:
15002:15000:Bruce Lee:/home/LIZL/bruce:/bin/bash
LIZL/guest:x:
15003:15000::/home/LIZL/guest:/bin/bash
LIZL/jet:x:
15004:15000:Jet Chen:/home/LIZL/jet:/bin/bash
LIZL/krbtgt:x:
15005:15000::/home/LIZL/krbtgt:/bin/bash
LIZL/lee:x:
15006:15000:Jackie Lee:/home/LIZL/lee:/bin/bash
LIZL/lili:x:
15007:15000:lily:/home/LIZL/lili:/bin/bash
LIZL/lizl:x:
15008:15000:lizhili:/home/LIZL/lizl:/bin/bash
LIZL/samba:x:
15013:15000:samba:/home/LIZL/samba:/bin/bash
LIZL/support_388945a0:x:
15009:15000:CN=Microsoft Corporation,L=Redmond,S=Washington,C=US:/home/LIZL/support_388945a0:/bin/bash
LIZL/test:x:
15014:15000:test:/home/LIZL/test:/bin/bash
[root@leeldap pam.d]# getent group
root:x:
0:root
。。。。。
BUILTIN/System Operators:x:
15009:
BUILTIN/Replicators:x:
15010:
BUILTIN/Guests:x:
15011:
BUILTIN/Power Users:x:
15012:
BUILTIN/Print Operators:x:
15013:
BUILTIN/Administrators:x:
15014:
BUILTIN/Account Operators:x:
15015:
BUILTIN/Backup Operators:x:
15016:
BUILTIN/Users:x:
15017:

(5) 现在可以到ad机器上的活动目录中可以看到该机器了

接下来介绍加入AD域后的一个简单应用,要不就不知道这样加有啥子用了。既然samba服务器已经加入AD域中,那自然会想到,window域中的本地帐号是否能访问linux机器呢?答案是肯定的。这就是winbind的作用了,当window域中的本地帐号需要登录linux主机时,winbind服务去ad服务器去验证该帐号是否合法,而不是到linux本地的/etc/passwd中去验证,当然如果要用不同的验证方式,就可以用pam去进行复杂的设定.
(1)确保/etc/samba/smb.conf中配置了passwd server选项,这个折磨过我2天,一定要切记
(2)配置system-auth

auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/$ISA/pam_winbind.so use_first_pass
auth        required      /lib/security/$ISA/pam_deny.so

account     required      /lib/security/$ISA/pam_unix.so broken_shadow
account     
[default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_winbind.so
account     required     /lib/security/$ISA/pam_permit.so

password    required      /lib/security/$ISA/pam_cracklib.so retry
=3
password    sufficient    /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password    sufficient    /lib/security/$ISA/pam_winbind.so use_authok
password    required      /lib/security/$ISA/pam_deny.so

session     required      /lib/security/$ISA/pam_limits.so
session     required      /lib/security/$ISA/pam_unix.so

(3)配置sshd,使用ad帐号登录时,自动创建/home/LIZL/ad帐号目录

auth       sufficient   /lib/security/pam_winbind.so
auth       required     /lib/security/pam_stack.so service
=system-auth
auth       required     /lib/security/pam_nologin.so
account    sufficient   /lib/security/pam_winbind.so
account    required     /lib/security/pam_stack.so service
=system-auth
password   required     /lib/security/pam_stack.so service
=system-auth
session    required     /lib/security/pam_stack.so service
=system-auth
session    required     /lib/security/pam_limits.so
session    required     /lib/security/pam_mkhomedir.so
session    optional     /lib/security/pam_console.so

(4)顺便配置下samba这个pam

#auth       required    pam_nologin.so
auth       required     pam_stack.so service
=system-auth
account    required     pam_stack.so service
=system-auth
#session    required    pam_stack.so service
=system-auth
#session    required     pam_mkhomedir.so skel
=/etc/skel umask=0022
#password   required    pam_stack.so service
=system-auth

好了,接下来享受下用ad帐号登录linux主机的快乐吧。。如果要结合samba控制目录访问等权限的话,继续努力研究samba吧。。。

Tagged as: , No Comments
3Jul/090

freebsd 基础

1.如何修改其它用户密码?passwd -l lizl。

2.freebsd的密码文件有2个,/etc/passwd 和/etc/master.passwd,同时使用/etc/pwd.db和/etc/spwd.db数据库提高性能。使用vipw可以同步修改这2个文件
3.sh的全局配置文件 /etc/profile,csh的全局配置文件/etc/csh.cshrc,csh.login和csh.logout.

常见shell定义文件 /etc/shells(比如安装bash后需要修改该文件使之生效)

/usr/bin/chsh -s bash 修改当前用户默认的shell为bash,shell的默认配置文件在/usr/share/skel下

~/.bash-history 记录sh历史命令;~/.history记录csh历史命令

4./var/log/下的文件介绍

lastlog 保存每个用户最后一次登录信息

utmp 保存当前系统用户的登录记录 (who,u命令)

wtmp 保存所有登录,退出以及系统启动,关闭等记录 (last,ap命令)

/etc/syslog.conf 配置日志保存目录等信息

5.配置sudo组用户,修改visudo /etc/sudoers 

root    ALL=(ALL) ALL(用户)

%wheel ALL=(ALL) ALL(组)

6.只有wheel组的用户才能使用su

7./etc/fstab 开机加载的分区(mount,df命令)

/etc/fbtab change device protection upon login

8.检查磁盘命令 /stand/fsck

9.安装向导工具 /stand/sysinstall

10./stand/zcat 查看压缩包文件

11./etc/ttys 记录了所有允许你登录的端口,类似于window中的端口的概念,比如3306端口

12./usr/sbin/kbdcontrol 更改键盘设置 /usr/share/syscons/keymaps

13./usr/sbin/vidcontrol 更改字体设置 /usr/share/syscons/fonts

14./usr/sbin/vidcontrol 更改鼠标设置

15.查看版本信息 uname -v

16./etc/rc.conf 系统启动脚本

17./usr/sbin/tzsetup 设置时区 /usr/share/zoneinfo

18./usr/bin/jobs 查看正在后台运行的进程,fg $1(%1)切换到前台工作,使用ps查找进程号并用kill pid(kill -9 pid)杀死进程

19./usr/sbin/pstat,/usr/bin/vmstat/usr/bin/systat /usr/bin/fstat/usr/sbin/iostat/usr/bin/netstatusr/bin/nfsstat ,/usr/bin/top查看系统状态

20./etc/crontab  root的crontab文件 ,crontab -l 查看自己的crontab文件,crontab -e 编辑自己的crontab文件,crontab -r 删除自己的crontab文件

用户自己的crontab文件存放在/var/cron/tabs下( /usr/sbin/cron crontab)

21./var/at/at.allow 和/var/at/at.deny(atrm 删除at作业,atq查看没有执行的at命令)

22.pkg_info 查看所有安装的软件包(pkg_info -a查看详细)pkg_delete删除 pkg_add安装软件包

23./etc/inetd.conf 系统提供的服务,守护进程daemon为wait,非守护进程为nowait

24./etc/services端口定义应用程序类型

25./bin/hostname 设置机器名,/sbin/ifconfig IP地址用默认的掩码设置Ip地址,ifconfig (-a)查看网络信息 ifconfig lnc0 192.168.115.188 alias 设置网络别名ifconfig lnc0 delete 192.168.115.188 删除网络别名

26./sbin/route设置路由。设置默认网关route add default 192.168.115.255  设置静态路由 route add -net 192.168.10.0/24 192.168.1.253 查看路由表

/usr/bin/netstat -r

27./etc/hosts与/etc/resolv.conf计算机名字和ip的转换,/etc/host.conf定义解析的顺序

28./usr/sbin/traceroute 192.168.1.115 跟踪到达地址的所有请求,会产生大量的网络流量,慎用

29./usr/sbin/nslookup http://www.sina.com.cn/ 查找DNS服务器

30.串口设备标示sio1,sio2。光驱标示acd0c

31.BIND 服务程序/usr/sbin/named/etc/namedb/named.conf 域名服务配置文件

32./usr/sbin/sendmail 默认安装的邮件服务器

33.NFS(/usr/bin/showmount

34./etc/amd.map 自动安装守护进程AMD (/usr/sbin/amd)

35./usr/ports port软件包

36.tar.gz和tgz 使用gzip压缩,用/usr/bin/tar xzvf解压缩;tar.bz2使用bzip2压缩,/usr/bin/bunzip2解压缩.

37.静态链接,将库编译到可执行文件中。动态链接,库和程序分别载入,并且库是使用动态链接库实时链接;elf执行文件的动态链接库位置/usr/lib,a.out在/usr/lib/aout(/usr/bin/ldd /usr/sbin/vi 显示一个可执行程序vi使用的共享库)。

38.FreeBSD 3.x之后ELF格式成为缺省的执行文件格式

39./usr/compat/linux 兼容linux应用的根目录

40.mkdir -p /usr/compat/linux/var/local/lib/rpm嵌套生成目录,即使上级目录并不存在

41./usr/src/sys freebsd 内核源码,sys/i386/conf/为内核配置文件。注意最小化安装不会安装此项

42./usr/sbin/tcpdump

43.freebsd自带防火墙在内核中实现,需要在编译内核时打开下面选项重新定制内核options IPFIREWALL,/sbin/ipfw 设置包过滤规则,/etc/rc.firewall过滤规则文件,需要在rc.conf中用firewall_enable ="yes"启用并读取

44./sbin/natd(gateway_enable,natd_enable) 网络地址转换

45.ipfilter包过滤 规则文件/etc/ipnat.conf  /sbin/ipnat

46.基于IP数据包过滤的防火墙和基于代理的防火墙

47.可以使用C这样的编译型语言来编写CGI程序,也可以使用解释型的语言来编写CGI程序

48.基于DNS的负载均衡(yahoo)和反向代理的负载均衡,基于NAT的负载均衡

49.freebsd默认支持/usr/sbin/jail。(imprison process and his descendants)

50.安装源码/stand/sysintall Configure->Distributions->src->sys

51./usr/sbin/arp ,无需安装

52.dhcp需要安装软件包,并且内核支持伪设备bpfilter。DHCP客户机和服务器软件ISC-DHCP和WIDE-DHCP,前者更常用

53./etc/ssh/sshd_config 登录设置ssh

54.环境变量的设置根据shell的种类而不同,在sh中使用export设置环境变量;在csh中使用setenv来设置环境变量;

55./bin/echo $path 查看单个环境变量,set查看全部shell变量(本地变量),/usr/bin/env查看全部系统环境变量

56. /usr/bin/whereis和/usr/bin/which的区别。whereis查二进制文件、说明文档,源文件;which只在env中设置的path中寻找可执行文件

Filed under: Linux No Comments
3Jul/090

自己搭建的超简单的ldap服务器

一个简单的ldap服务器的搭建还是很容易的,因为验证方面不用复杂的ssl和sasl验证。不考虑和邮件帐号等的整合,也不用考虑统一验证机制,只是纯粹用来熟悉php里面提供的ldap API函数,这样一个简单的服务器还是够的。说实话,我也才瞎忙活了3天左右的时间,水平有限,只能先搭建个简单的凑合着用了。

首先我们先了解下ldap的基本概念
条目(entry):条目是以树型结构组织的,一个条目类似树的一个节点。
DN(distinguish name):每个条目都有一个DN,DN的构成是由Base DN和RDN构成
RDN:类似于树的叶子节点。
Base DN:类似于树的根节点到内部节点的路径,当然路径不是安装树组织的,而是按dc=xxx,dc=xxx这样来组织的
object Class:分为结构型,辅助型和抽象型。每个条目都必须有个结构类,每个条目可以有多个object Class
Schema:是一个数据类型,用来决定数据怎样存储,被跟踪数据的类型及存储在不同条目下数据之间的关系。

1.新建目录的根节点

dn: dc=lizl,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: lizl
o: lizl.com

dn: cn
=Manager,dc=lizl,dc=com
objectClass: organizationalRole
cn: Manager
description: Derectory Manager

dn: ou
=people,dc=lizl,dc=com
ou: people
objectClass: organizationalUnit

新建时,需停止slapd进程,否则会出现问题

bdb_db_open: database already in use
backend_startup_one: bi_db_open failed! (-
1)

使用

kill -INT cat /usr/local/openldap/var/run/slapd.pid`
/usr/local/openldap/sbin/slapadd -v -l ./init.ldif 

2.添加基础数据

dn: cn=Jack,ou=people,dc=lizl,dc=com
cn: Jack
sn: white
mail: jack@
126.com
telephoneNumber: 
07285230251
objectClass: inetOrgPerson

# /usr/local/openldap/bin/ldapadd -D "cn=Manager,dc=lizl,dc=com" -W -x  -f  base.ldif
Enter LDAP Password: secret

3.sladp.conf

#
# See slapd.conf(
5) for details on configuration options.
# This file should NOT be world readable.
#
include        /usr/local/openldap/etc/openldap/schema/core.schema
include         /usr/local/openldap/etc/openldap/schema/cosine.schema
include         /usr/local/openldap/etc/openldap/schema/inetorgperson.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral    ldap://root.openldap.org

pidfile        /usr/local/openldap/var/run/slapd.pid
argsfile    /usr/local/openldap/var/run/slapd.args

# Load dynamic backend modules:
# modulepath    /usr/local/openldap/libexec/openldap
# moduleload    back_bdb.la
# moduleload    back_ldap.la
# moduleload    back_ldbm.la
# moduleload    back_passwd.la
# moduleload    back_shell.la

# Sample security restrictions
#    Require integrity protection (prevent hijacking)
#    Require 
112-bit (3DES or better) encryption for updates
#    Require 
63-bit encryption for simple bind
# security ssf
=1 update_ssf=112 simple_bind=64

# Sample access control policy:
#    Root DSE: allow anyone to read it
#    Subschema (sub)entry DSE: allow anyone to read it
#    Other DSEs:
#        Allow self write access
#        Allow authenticated users read access
#        Allow anonymous users to authenticate
#    Directives needed to implement policy:
# access to dn.base
="" by * read
# access to dn.base
="cn=Subschema" by * read
# access to *
#    by self write
#    by users read
#    by anonymous auth
#
# if no access controls are present
, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g.
, "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#######################################################################
# BDB database definitions
#######################################################################

database    bdb
suffix        
"dc=lizl,dc=com"
rootdn        
"cn=Manager,dc=lizl,dc=com"

# Cleartext passwords
, especially for the rootdn, should
# be avoid.  See slappasswd(
8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw        secret
# The database directory MUST exist prior to running slapd AND 
# should only be accessible by the slapd and slap tools.
# Mode 
700 recommended.
directory    /usr/local/openldap/var/openldap-data
# Indices to maintain
index    objectClass    eq

安装一些ldap工具

Tagged as: No Comments
26Jun/090

word-wrap,word-break和nowrap的区别

个人总结的三句话:
(1)word-wrap 对中文字符始终换行
(2)word-break的keep-all可使中文不换行;normal/break-all使中文换行
       normal/keep-all使英文不换行;keep-all使中文换行
(3)nowrap与td的width属性有关,并且width的优先级高,如果设置了width,nowrap失效;否则nowrap有效

26Jun/090

FPDF中的编码

最近在用FPDF生成pdf时,用UTF-8编码的日文或者繁体文字始终都是乱码。查了相关资料后,才发现FPDF本身并不支持UTF-8,除此之外,FPDF对中,日,韩支持的扩展类中使用的是CID字体,和我们window中用到的字体的都不同。因此当你使用支持中文的扩展类时,生成pdf时对日文肯定是不支持的。而TCPDF据说是支持UTF-8,但使用后发现对中文的支持很烂,还要手工转换字体,其方式和UFPDF是一样的。而我们很难找到一种同时对中,日,韩都支持的字体。用msgothic也只是对日文和繁体支持的比较好而已,对简体中文用华文中宋等字体显示更好一些,因此我的结论是,用FPDF生成pdf时,如果文件包含中文,日文,韩文等内容时,生成的pdf肯定有乱码或者空白。除非我们确切的知道文件中哪些地方显示中文,哪些地方显示日文,那我们就可以在开始的时用addfont添加这些字体,然后在输出的时候用setfont指定要输出的内容采取哪种字体。

此外,在解决乱码问题时容易遇到的以下问题:
现象一:当修改页面字符集为UTF-8,页面出现空白,不显示任何内容
都是字符集charset惹的祸,理由在于用charset指定为UTF-8之前,已经有非UTF-8编码文字的输出。比如一般html页面都是把title标签放在meta标签前面,因此80%的可能是title内容的编码和UTF-8引起的,最好的解决方法就是把title用UTF-8编码后再输出,或者在meta之后指定title。

现象二:页面报js错误,但仔细查看源代码后,发现没有任何问题。
同样是编码不一致导致的。这时要仔细查看页面是否引用了非UTF-8编码的文件,一个典型的情况就是外部js文件中的中文(包含注释等)引起的,解决方法就是把中文去掉,或者全部改为英文即可。

Tagged as: No Comments
20Jun/090

Shell入门

(1)shell中的单引号比双引号的区别:单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略

(2)求字符串长度  ----- (1)expr $x:‘.*’(2)${#x}

(3)求字符串子串  ----- ${x:$pos:$len},其中$pos位置,$len长度,其中$len可省略

(4)字符串替换    ----- ${x/a/b} 用b替换a ; ${x//a/b}用b替换所有的a

(5)字符串首尾截取----- ${x##*/}去掉所有/左边的字符,也可用其它匹配代替*/  ${x#*/}只去掉第一次出现/左边所有的字符。顺序为从左到右.${x%%/*}去掉所有/右边的字符,${x%/*}去掉第一次出现/右边的字符,顺序为从右到左.

(6)Shell数组定义 a=(1 2 3 4),不能有空格,比如a =(1 2 3 4)和a=(1 2 3 4)都是不允许的。

(7)数组长度: ${#a[@]}或者 ${#a[*]} ;全部数组 ${a[@]}或{$a[*]}返回1 2 3 4

(8)数组元素的长度   ${#a[i]},i为下标,和其它语言一样,从0开始,数组元素${a[i]}

(9)awk默认使用空格作为域分隔符,

"+"和"?"只适用awk而不适用sed和grep

awk条件操作符:<,<=,>=,==,!=,~,!~

awk字符串处理函数:gsub(r,s),gsub(r,s,t),index(s,t)等

awk自定义环境变量:FILENAME,FNR,FS,NF,NR等

awk -F : '{print $1}' /etc/passwd 打印第一列的值, $0 打印全部的值

awk -F : 'BEGIN {print "name       passwd\n-----------------"} {print $1"\t"$5}' END {print "End of file"}' /etc/passwd 输出增加头尾

awk '{if($0~/root/) print $0}' /etc/passwd 输出匹配"root"的行,等价于awk '$0~/root/' /etc/passwd

(10)无论命令是什么?sed并不与初始化文件打交道,它操作的只是文件的一个拷贝。如果不重定向到一个文件,直接在标准输出(显示屏)显示。

搜索替换是sed的拿手好戏。

sed -n '1,$p' /etc/passwd 打印从1到最后一行的所有内容

sed -e '/root/=' /etc/passwd 打印出现"root"的行号和所有行

sed -n '/root/=' /etc/passwd 只打印行号

sed -n -e '/root/p'  /etc/passwd  只打印出现"root"的匹配行

sed -n -e '/root/p' -e '/root/=' /etc/passwd 打印匹配行和行号

sed 's/^M//g' /etc/passwd 删除行尾控制字符(^M)= ctrl+v+m

sed 's/^0*//g' /etc/passwd 删除行首的多个零

(11)grep 一般用来搜索字段或字串,sed用来搜索或者替换,awk可以进行复杂的运算和定制操作

(12)先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量

系统变量:

$# 传递到脚本的参数个数;

$$脚本运行的当前进程id;

$?最后命令的退出状态,0表成功;

$!上一个命令的PID ;

$@ 以"参数1" "参数2" ... 形式保存所有参数 ;

$* 以"参数1 参数2 ... " 形式保存所有参数 ;$0表示脚本名称

用户变量:用set命令查看

环境变量:用setenv查看

(13)不同的shell版本有不同数组赋值方法,而bourne shell (如bash)中不支持数组方式。

(14)查看目录或者文件,符号链接:ls -l | grep '^d' 或者 ls -l | grep '^-',ls -l | grep '^l'

(15)查看最后一列的指:ls -l | grep '^l' | awk '{print $NF}' (默认以空格分隔),在awk中,NF表示字段数,$NF表示最后一个字段

Tagged as: No Comments
Page 2 of 4123...Last »