写点今天都干了点什么吧。。

apache+php+mysql   配置。。。

还是搞不太懂apache..只能是瞎配。。不管咋说。。都是配出来了。。但原理还是不大懂。。

软件:

httpd-2.0.61.tar.gz

mysql-5.0.51a-linux-i686.tar.zip

php-5.2.5.tar.gz

都是从官方下的最新版。。

先装mysql…

>cd /usr/local

>tar zxvf mysql-5.0.51a-linux-i686.tar.zip

>unzip mysql-5.0.51a-linux-i686.tar.zip

>tar xvf mysql-5.0.51a-linux-i686.tar

>cd mysql-5.0.51a-linux-i686

>chown root .

>chown mysql data

>chown mysql .

这个版本的mysql是编绎好的。。

>ln -s mysql-5.0.51a-linux-i686 mysql

>groupadd mysql

>useradd -g mysql mysql

>scripts/mysql_install_db –user=mysql &

然后按照网上的教程就是

>bin/safe_mysqld –user=mysql &

出现的错误是。。一大堆英语。。英文不好。。看不大懂。只能看个大概。。

意思是权限没有设置好。。一般来说。。mysql出错的原因都是这样。。权限设置不好。。

不出意外的话。。mysql..就successfully

然后就是编绎apache

>tar zxvf httpd-2.0.61.tar.gz

>cd httpd-2.0.61

>./configure –with-prefix=/etc –enable-module-so

>make

>make install

好。。完成

下面开始装php

>tar zxvf php-5.2.5.tar.gz

>cd php-5.2.5

>./configure –with-apxs2=/usr/local/apache/bin/apxs –with-mysql=/usr/local/mysql –with

MySQL show的用法

a. show tables或show tables from database_name; // 显示当前数据库中所有表的名称


   b. show databases; // 显示mysql中所有数据库的名称


   c. show columns from table_name from database_name; 或show columns from database_name.table_name;   // 显示表中列名称


   d. show grants for user_name@localhost;   //   显示一个用户的权限,显示结果类似于grant 命令


   e. show index from table_name;   // 显示表的索引


   f. show status;   // 显示一些系统特定资源的信息,例如,正在运行的线程数量


   g. show variables; // 显示系统变量的名称和值

  

   h. show   processlist; // 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看

         他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。


   i. show table status; // 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间


   j. show privileges;   // 显示服务器所支持的不同权限


   k. show create database database_name; // 显示create database 语句是否能够创建指定的数据库


   l. show create table table_name; // 显示create database 语句是否能够创建指定的数据库


   m. show engies;   // 显示安装以后可用的存储引擎和默认引擎。


   n. show innodb status; // 显示innoDB存储引擎的状态


   o. show logs; // 显示BDB存储引擎的日志


   p. show warnings; // 显示最后一个执行的语句所产生的错误、警告和通知


   q. show errors; // 只显示最后一个执行语句所产生的错误

mysql常用其它函数。。

DATABASE()
返回当前的数据库名字。

mysql> select DATABASE();
        -> 'test'

如果没有当前的数据库,DATABASE()返回空字符串。

USER()
 
SYSTEM_USER()
 
SESSION_USER()
返回当前MySQL用户名。

mysql> select USER();
        -> 'davida@localhost'

在MySQL 3.22.11或以后版本中,这包括用户名和客户主机名。你可以象这样只提取用户名部分(值是否包括主机名部分均可工作):

mysql> select substring_index(USER(),"@",1);
        -> 'davida'
PASSWORD(str)
从纯文本口令str计算一个口令字符串。该函数被用于为了在user授权表的Password列中存储口令而加密MySQL口令。

mysql> select PASSWORD('badpwd');
        -> '7f84554057dd964b'

PASSWORD()加密是非可逆的。PASSWORD()不以与Unix口令加密的相同的方法执行口令加密。你不应该假定如果你的Unix 口令和你的MySQL口令是一样的,PASSWORD()将导致与在Unix口令文件存储的相同的加密值。见ENCRYPT()

ENCRYPT(str[,salt])
使用Unix crypt()系统调用加密strsalt参数应该是一个有2个字符的字符串。(MySQL 3.22.16中,salt可以长于2个字符。)

mysql> select ENCRYPT("hello");
        -> 'VxuFAJXVARROc'

如果crypt()在你的系统上不可用,ENCRYPT()总是返回NULLENCRYPT()只保留str起始8个字符而忽略所有其他,至少在某些系统上是这样。这将由底层的crypt()系统调用的行为决定。

ENCODE(str,pass_str)
使用pass_str作为口令加密str。为了解密结果,使用DECODE()。结果是一个二进制字符串,如果你想要在列中保存它,使用一个BLOB列类型。
DECODE(crypt_str,pass_str)
使用pass_str作为口令解密加密的字符串crypt_strcrypt_str应该是一个由ENCODE()返回的字符串。
MD5(string)
对字符串计算MD5校验和。值作为一个32长的十六进制数字被返回可以,例如用作哈希(hash)键。

mysql> select MD5("testing")
        -> 'ae2b1fca515949e5d54fb22b8ed95575'

这是一个“RSA数据安全公司的MD5消息摘要算法”。

LAST_INSERT_ID([expr])
返回被插入一个AUTO_INCREMENT列的最后一个自动产生的值。见20.4.29 mysql_insert_id()

mysql> select LAST_INSERT_ID();
        -> 195

产生的最后ID以每个连接为基础在服务器被维护,它不会被其他客户改变。如果你更新另外一个有非魔术值(即,不是NULL和不是0的一个值)的AUTO_INCREMENT列,它甚至不会被改变。如果expr作为一个参数在一个UPDATE子句的LAST_INSERT_ID()里面给出,那么参数值作为一个LAST_INSERT_ID()值被返回。这可以用来模仿顺序:首先创建表:

mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);

然后表能被用来产生顺序号,象这样:

mysql> update sequence set id=LAST_INSERT_ID(id+1);

你可以不调用LAST_INSERT_ID()而产生顺序,但是这样使用函数的实用程序在服务器上自动维护ID值作为最后自动产生的值。你可以检索新的ID值,就像你能读入正常MySQL中的任何正常的AUTO_INCREMENT值一样。例如,LAST_INSERT_ID()(没有一个参数 )将返回新ID。C API函数mysql_insert_id()也可被用来得到值。

FORMAT(X,D)
格式化数字X为类似于格式'#,###,###.##',四舍五入到D为小数。如果D0,结果将没有小数点和小数部分。

mysql> select FORMAT(12332.123456, 4);
        -> '12,332.1235'
mysql> select FORMAT(12332.1,4);
        -> '12,332.1000'
mysql> select FORMAT(12332.2,0);
        -> '12,332'
VERSION()
返回表明MySQL服务器版本的一个字符串。

mysql> select VERSION();
        -> '3.22.19b-log'
GET_LOCK(str,timeout)
试图获得由字符串str给定的一个名字的锁定,第二个timeout为超时。如果锁定成功获得,返回1,如果尝试超时了,返回0,或如果发生一个错误,返回NULL(例如从存储器溢出或线程用mysqladmin kill被杀死)。当你执行RELEASE_LOCK()时、执行一个新的GET_LOCK()或线程终止时,一个锁定被释放。该函数可以用来实现应用锁或模拟记录锁,它阻止其他客户用同样名字的锁定请求;赞成一个给定的锁定字符串名字的客户可以使用字符串执行子协作建议的锁定。

mysql> select GET_LOCK("lock1",10);
        -> 1
mysql> select GET_LOCK("lock2",10);
        -> 1
mysql> select RELEASE_LOCK("lock2");
        -> 1
mysql> select RELEASE_LOCK("lock1");
        -> NULL

注意,第二个RELEASE_LOCK()调用返回NULL,因为锁"lock1"自动地被第二个GET_LOCK()调用释放。

RELEASE_LOCK(str)
释放字符串str命名的通过GET_LOCK()获得的锁。如果锁被释放,返回1,如果锁没被这个线程锁定(在此情况下锁没被释放)返回0,并且如果命名的锁不存在,返回NULL。如果锁从来没有通过调用GET_LOCK()获得或如果它已经被释放了,锁将不存在。
BENCHMARK(count,expr)
BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。

mysql> select BENCHMARK(1000000,encode("hello","goodbye"));
+----------------------------------------------+
| BENCHMARK(1000000,encode("hello","goodbye")) |
+----------------------------------------------+
|                                            0 |
+----------------------------------------------+
1 row in set (4.74 sec)

报告的时间是客户端的经过时间,不是在服务器端的CPU时间。执行BENCHMARK()若干次可能是明智的,并且注意服务器机器的负载有多重来解释结果。

GRANT和REVOKE语法–MySql数据库

GRANT<em>priv_type</em>[(<em>column_list</em>)] [,<em>priv_type</em>[(<em>column_list</em>)]] ...
    ON [<em>object_type</em>] {<em>tbl_name</em>| * | *.* |<em>db_name</em>.*}
    TO<em>user</em>[IDENTIFIED BY [PASSWORD] '<em>password</em>']
        [,<em>user</em>[IDENTIFIED BY [PASSWORD] '<em>password</em>']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER '<em>cipher</em>' [AND]]
        [ISSUER '<em>issuer</em>' [AND]]
        [SUBJECT '<em>subject</em>']]
    [WITH<em>with_option</em>[<em>with_option</em>] ...]<em>object_type</em>=
    TABLE
  | FUNCTION
  | PROCEDURE<em>with_option</em>=
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR<em>count</em>| MAX_UPDATES_PER_HOUR<em>count</em>| MAX_CONNECTIONS_PER_HOUR<em>count</em>| MAX_USER_CONNECTIONS<em>count</em>
REVOKE<em>priv_type</em>[(<em>column_list</em>)] [,<em>priv_type</em>[(<em>column_list</em>)]] ...
    ON [<em>object_type</em>] {<em>tbl_name</em>| * | *.* |<em>db_name</em>.*}
    FROM<em>user</em>[,<em>user</em>] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM<em>user</em>[,<em>user</em>] ...

GRANTREVOKE语句允许系统管理员创建MySQL用户 账户,授予权限和撤销权限。

MySQL账户信息存储在mysql数据库的表中。在第5章:数据库管理中对本数据库和访问控制系统进行了详尽的讨论。要了解更多详细信息,您应该查询此章。

如果授权表拥有含有mixed-case数据库或表名称的权限记录,并且lower_case_table_names系统变量已设置,则不能使用REVOKE撤销权限,必须直接操纵授权表。(当lower_case_table_names已设置时,GRANT将不会创建此类记录,但是此类记录可能已经在设置变量之前被创建了。)

授予的权限可以分为多个层级:

        全局层级

全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*REVOKE ALL ON *.*只授予和撤销全局权限。

        数据库层级

数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.dbmysql.host表中。GRANT ALL ONdb_name.*REVOKE ALL ONdb_name.*只授予和撤销数据库权限。

        表层级

表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ONdb_name.tbl_nameREVOKE ALL ONdb_name.tbl_name只授予和撤销表权限。

        列层级

列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。

        子程序层级

CREATE ROUTINE, ALTER ROUTINE, EXECUTEGRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。

当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLEFUNCTIONPROCEDURE。当从旧版本的MySQL升级时,要使用本子句,您必须升级您的授权表。请参见2.10.2节,“升级授权表”

要使用GRANTREVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。

要撤销所有权限,需使用以下语法。此语法用于取消对于已命名的用户的所有全局层级、数据库层级、表层级和列层级的权限。

<span>REVOKE ALL PRIVILEGES, GRANT OPTION FROM<span><em>user</em></span>[,<span><em>user</em></span>] ...</span>

要使用本REVOKE语法,您必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。

对于GRANTREVOKE语句,priv_type可以被指定为以下任何一种:

权限

意义

ALL [PRIVILEGES]

设置除GRANT OPTION之外的所有简单权限

ALTER

允许使用ALTER TABLE

ALTER ROUTINE

更改或取消已存储的子程序

CREATE

允许使用CREATE TABLE

CREATE ROUTINE

创建已存储的子程序

CREATE TEMPORARY TABLES

允许使用CREATE TEMPORARY TABLE

CREATE USER

允许使用CREATE USER, DROP USER, RENAME USERREVOKE ALL PRIVILEGES

CREATE VIEW

允许使用CREATE VIEW

DELETE

允许使用DELETE

DROP

允许使用DROP TABLE

EXECUTE

允许用户运行已存储的子程序

FILE

允许使用SELECT…INTO OUTFILELOAD DATA INFILE

INDEX

允许使用CREATE INDEXDROP INDEX

INSERT

允许使用INSERT

LOCK TABLES

允许对您拥有SELECT权限的表使用LOCK TABLES

PROCESS

允许使用SHOW FULL PROCESSLIST

REFERENCES

未被实施

RELOAD

允许使用FLUSH

REPLICATION CLIENT

允许用户询问从属服务器或主服务器的地址

REPLICATION SLAVE

用于复制型从属服务器(从主服务器中读取二进制日志事件)

SELECT

允许使用SELECT

SHOW DATABASES

SHOW DATABASES显示所有数据库

SHOW VIEW

允许使用SHOW CREATE VIEW

SHUTDOWN

允许使用mysqladmin shutdown

SUPER

允许使用CHANGE MASTER, KILL, PURGE MASTER LOGSSET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections

UPDATE

允许使用UPDATE

USAGE

“无权限”的同义词

GRANT OPTION

允许授予权限

当从旧版本的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINEALTER ROUTINE权限,您必须首先升级您的授权表。请参见2.10.2节,“升级授权表”

REFERENCES权限目前未被使用。

当您想要创建一个没有权限的用户时,可以指定USAGE

使用SHOW GRANTS来确定帐户拥有什么权限。请参见13.5.4.10节,“SHOW GRANTS语法”

您可以通过使用ON *.*语法赋予全局权限,或通过使用ONdb_name.*语法赋予数据库层级权限。如果您指定了ON *并且您已经选择了一个默认数据库,则权限被赋予到这个数据库中。(警告:如果您指定了ON *同时您没有选择一个默认数据库,则权限是全局的。)

FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWNSUPER权限是管理性权限,只能进行全局授权(使用ON *.*语法)。

其它权限可以被全局授权,或被赋予为其它层级。

对于一个表,您可以指定的priv_type值只能是SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEXALTER

对于一个列(也就是,当您使用一个column_list子句时),您可以指定的priv_type值只能是SELECT, INSERTUPDATE

在子程序层级,您可以指定的priv_type值只能是ALTER ROUTINE, EXECUTEGRANT OPTIONCREATE ROUTINE不是一个子程序层级的权限,因为您必须拥有此权限,才能创建一个子程序。

对于全局、数据库、表和子程序层级,GRANT ALL只能赋予在您正在授权的层级中存在的权限。例如,如果您使用GRANT ALL ONdb_name.*,这是一个数据库层级语句,因此不会授予全局权限,如FILE等。

MySQL允许您对不存在的数据库目标授予权限。在此情况下,将被授予的权限必须包括CREATE权限。这个性质是有意设计的,目的是允许数据库管理员为将在此后被创建的数据库目标预备用户 账户和权限。

要点:当您取消一个表或数据库时,MySQL不会自动撤销任何权限。但是,如果您取消一个子程序,则被赋予该子程序的所有子程序层级的权限都被撤销。

注意:GRANT语句用于在全局层级或数据库层级赋予权限。当在GRANT语句中指定数据库名称时,允许使用‘_’和‘%’通配符。这意味着,如果您想要使用‘_’字符作为一个数据库名称的一部分,您应该在GRANT语句中指定它为‘_’,以防止用户可以访问其它符合此通配符格式的数据库;例如,GRANT … ON `foo_bar`.* TO …

为了接纳对来自任意主机的用户授权的权利,MySQL支持以user_name@host_name的形式指定user值。如果一个user_namehost_name与一个不加引号的标识符一样是合法的,那么您不需要对它加引号。不过,要指定一个包含特殊字符(如‘’)的user_name字符串,或一个包含特殊字符或通配字符(如‘%’),则引号是必要的;例如,‘test-user’@’test-hostname’。分别对usernamehostname加引号。

您可以在hostname中指定通配符。例如user_name@’%.loc.gov’适用于在loc.gov域中的任何主机的user_name。同时user_name@’144.155.166.%’适用于144.155.166 C级子网中的任何主机的user_name

简单形式user_nameuser_name@’%’的同义词。

MySQL不支持usernames中的通配符。通过把带有User=”的登录项插入到mysql.user表中,或通过使用GRANT语句创建一个带有空名称的用户,可以定义匿名用户:

<span>mysql&gt;<span><strong>GRANT ALL ON test.* TO ''@'localhost' ...</strong></span></span>

当把带引号的值是,需使用反勾号(`)为数据库、表、列和子程序名称加引号。使用单引号()hostnamesusernames和 密码加引号。

警告:如果您允许匿名用户连接到MySQL服务器,则您应该同时向所有本地用户授予user_name@localhost权限。否则,当有名称的用户试图从本地机器登录MySQL服务器时,mysql.user表中的用于localhost的匿名用户帐户会被使用。

您可以通过执行以下查询来确定是否这适合于您。以下查询列举了所有匿名用户:

<span>mysql&gt;<span><strong>SELECT Host, User FROM mysql.user WHERE User='';</strong></span></span>

如果您想要删除本地匿名用户账户,以避免出现刚才谈到的问题,则需使用以下语句:

<span>mysql&gt;<span><strong>DELETE FROM mysql.user WHERE Host='localhost' AND User='';</strong></span></span>
<span>mysql&gt;<span><strong>FLUSH PRIVILEGES;</strong></span></span>

GRANT支持最长为60个字符的hostnames。数据库、表、列和子程序名称最长可为64个字符。Usernames最长可为16个字符。 注释:不能通过更改mysql.user表来改变usernames的允许长度。如果试图这么做,会导致出现不可预见的问题,可能会造成用户无法登录MySQL服务器。除了采用由MySQL公司提供的用于升级MySQL服务器的mysql_fix_privilege_tables原稿之外,请您不要以任何方式变更授权表。

对于表或列的权限是作为各个权限层级的逻辑OR权限被附加形成的。例如,如果mysql.user表指定一个用户拥有全局SELECT权限,则该权限不能被数据库、表或列层级的登录项定义。

可以按下列方法计算列权限:

<span>global privileges</span>
<span>OR (database privileges AND host privileges)</span>
<span>OR table privileges</span>
<span>OR column privileges</span>

在多数情况下,您只在一个权限层级下向用户授予权利,所以寿命通常不是那么复杂。有关权限检查规程的细节,请参见5.7节,“MySQL访问权限系统”

如果您对一个在mysql.user表中不存在的username/hostname组合授予权限,则增加一个登录项并保持在此处,直到使用DELETE语句删除为止。换句话说,GRANT可以创建用户表登录项,但是REVOKE不会取消它们;您必须使用DROP USERDELETE明确地操作。

如果创建了一个新的用户,或者如果您拥有全局授权权限,则用户密码被设置为由IDENTIFIED BY子句指定的密码(如果给定了一个)。如果用户已拥有了一个密码,则此密码被新密码替代。

警告:如果您创建了一个新用户,但是不指定IDENTIFIED BY子句,则用户没有 密码。这是很不安全的。不过,您可以启用NO_AUTO_CREATE_USER SQL模式,来防止GRANT创建一个新用户(否则GRANT会这么做),除非给定了IDENTIFIED BY来为新用户提供一个密码。

使用SET PASSWORD语句也可以设置密码。请参见13.5.1.5节,“SET PASSWORD语法”

IDENTIFIED BY子句中,密码应被作为文字密码只被给定。没有必要使用PASSWORD()函数,因为该函数用于SET PASSWORD语句。例如:

<span>GRANT ... IDENTIFIED BY 'mypass';</span>

如果您不想以明白的文字发送密码,并且您知道PASSWORD()返回给密码的混编值,则您可以指定混编值,前面加入关键词PASSWORD

<span>GRANT ...</span>
<span>IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';</span>

在一个C程序中,您可以通过使用make_scrambled_password()C API函数得到混编值。

如果您为一个数据库授予权限,则在mysql.db表中,会根据需要创建登录项。如果使用REVOKE删除了所有的数据库权限,则本登录项被删除。

如果一个用户不拥有表权限,则当用户申请表清单时(例如,使用SHOW TABLES语句),表名称不显示。

SHOW DATABASES权限允许账户通过发布SHOW DATABASE语句来观看数据名称。不拥有此权限的账户只能看到他们拥有部分权限的数据库,并且如果使用–skip-show-database选项启动服务器,则根本不能使用本语句。

WITH GRANT OPTION子句给予用户能力,可以在指定的权限层级,向其它用户给定其拥有的任何权限。您应该留心您给予了谁GRANT OPTION权限,因为拥有不同权限的两个用户可以联合使用权限!

您不能向其它用户授予您自己没有的权限;GRANT OPTION权限只允许您赋予您自己拥有的权限。

要注意,当您在某个特定权限层级向一个用户授予GRANT OPTION权限时,用户拥有的该层级的任何权限(或未来将被给定的权限)也可以由该用户授予。假设您向一个用户赋予了数据库INSERT权限。如果您然后赋予数据库SELECT权限,并指定了WITH GRANT OPTION,则该用户不仅可以向其它用户给予SELECT权限,还可以给予INSERT。如果您然后向用户授予数据库UPDATE权限,则用户可以授予INSERT, SELECTUPDATE

您不应该向一个常规用户授予ALTER权限。如果您这么做,则该用户可以尝试通过对表重新命名来破坏授权系统!

TheMAX_QUERIES_PER_HOURcount,MAX_UPDATES_PER_HOURcount, andMAX_CONNECTIONS_PER_HOURcountoptions limit the number of queries, updates, and logins a user can perform during any given one-hour period. Ifcountis0(the default), this means that there is no limitation for that user.     MAX_QUERIES_PER_HOURcount,MAX_UPDATES_PER_HOURcountMAX_CONNECTIONS_PER_HOURcount选项限制了在任何给定的一小时期间,用户可以执行的查询、更新和登录的数目。如果count0(默认值),这意味着,对该用户没有限制。

MAX_USER_CONNECTIONScount选项限制了账户可以同时进行的连接的最大数目。如果count0(默认值),则max_user_connections系统可以决定该 账户同时连接的数目。

注释:要对一个原有的用户指定任何这类资源限制型选项,同时又不影响原有的权限,需使用GRANT USAGE ON *.* … WITH MAX_…

5.8.4节,“限制账户资源”

除了根据username和密码进行常规鉴定外,MySQL还可以检查X509证明属性。要为MySQL账户指定与SSL有关的选项,需使用GRANT语句的REQUIRE子句。(要了解有关在MySQL中使用SSL的背景信息,请参见5.8.7节,“使用安全连接”。)

对于一个给定的账户,有多种可能性可以限制连接类型:

        如果账户没有SSLX509要求,并且如果username和 密码是有效的,则允许不加密连接。但是,如果客户端有正确的证明和关键文件,则根据客户端的选择,也可以使用加密连接。

        REQUIRE SSL选项用于告知服务器,对于该账户只允许SSL加密连接。注意,如果有允许任何非SSL连接的访问控制记录,则本选项可以被忽略。

<span>・<span>               </span></span><span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret' REQUIRE SSL;</strong></span></span>

        REQUIRE X509意味着客户端必须拥有一个有效证明,除非不需要确切的证明、发布者和主题。唯一的要求是,应可以使用CA证明其中之一来验证签名。

<span>・<span>               </span></span><span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret' REQUIRE X509;</strong></span></span>

        REQUIRE ISSUER ‘issuer用于对连接尝试进行限定,客户端必须出示一个由CAissuer’发布的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的发布者,则服务器会拒绝连接。使用X509证明就意味着要加密,所以在这种情况下,SSL选项是不必要的。

<span>・<span>               </span></span><span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/</strong></span></span>
<span>・<span>               </span></span><span>         O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';</span>

注意,ISSUER值应被作为一个单一字符串输入。

        REQUIRE SUBJECT ‘subject用于对连接尝试进行限定,客户端必须出示一个包含主题subject的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的主题,则服务器会拒绝连接。

<span>・<span>               </span></span><span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/</strong></span></span>
<span>・<span>               </span></span><span>         O=MySQL demo client certificate/</span>
<span>・<span>               </span></span><span>         CN=Tonu Samuel/Email=tonu@example.com';</span>

注意,SUBJECT值应被作为一个单一字符串输入。

        需要REQUIRE CIPHER ‘cipher来确认使用了密码和足够长度的关键字。如果使用了采用短型加密关键字的旧算法,SSL本身会比较脆弱。使用本选项,您可以要求使用特定的密码方法来许可一个连接。

<span>・<span>               </span></span><span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret'</strong></span></span>
<span>・<span>               </span></span><span>      -&gt;<span><strong>REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';</strong></span></span>

SUBJECT, ISSUERCIPHER选项可以在REQUIRE子句中结合,如下:

<span>mysql&gt;<span><strong>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'</strong></span></span>
<span>      -&gt;<span><strong>IDENTIFIED BY 'goodsecret'</strong></span></span>
<span>      -&gt;<span><strong>REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/</strong></span></span>
<span>         O=MySQL demo client certificate/</span>
<span>         CN=Tonu Samuel/Email=tonu@example.com'</span>
<span>      -&gt;<span><strong>AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/</strong></span></span>
<span>         O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'</span>
<span>      -&gt;<span><strong>AND CIPHER 'EDH-RSA-DES-CBC3-SHA';</strong></span></span>

注意,SUBJECTISSUER值各自应被作为一个单一字符串输入。

REQUIRE各选项之间,AND关键词是自选的。

选项的顺序无所谓,但是选项不能被指定两次。

mysqld启动后,所有的权限被读入存储器中。要了解详细说明,请参见5.7.7节,“权限更改何时生效”

注意,如果您正在使用表权限或列权限,即使只对一个用户使用,服务器也会对所有用户检查表权限和列权限,这会略微降低MySQL的速度。与此类似,如果您对某些用户限制查询、更新或连接的数目,则服务器必须监测这些值。

标准SQL版本和MySQL版本的GRANT之间的最大区别是:

        MySQL中,权限与hostnameusername的组合有关,与 单一的username无关。

        标准SQL不拥有全局层级或数据库层级权限,也不支持MySQL支持的所有权限类型。

        MySQL不支持标准SQL TRIGGERUNDER权限。

        标准SQL权限以一种分等级的方式进行组织。如果您取消一个用户,则用户被授予的所有权限都被撤销。在MySQL中,如果您使用DROP USER,也会如此。请参见13.5.1.2节,“DROP USER语法”

        在标准SQL中,当您取消一个表时,对一个表的所有权限会被撤销。在标准SQL中,当您撤销一个权限时,根据该权限被授予的所有权限也会被撤销。在MySQL中,只有使用明确的REVOKE语句,或通过操作存储在MySQL授权表中的值,才能取消权限。

        MySQL中,可以只对一个表中的部分列拥有INSERT权限。在此情况下,如果您忽略您不拥有INSERT权限的那些列,,您仍然可以对表执行INSERT语句。如果没有启用严格的SQL模式,则被忽略的列被设置为各自隐含的默认值。在严格模式下,如果某个被忽略的列没有默认值,则该语句被拒绝。5.3.2节,“SQL服务器模式”对严格模式进行了讨论。13.1.5节,“CREATE TABLE语法”对隐含默认值进行了讨论。

您不拥有INSERT权限的列被设置为各自的默认值。标准SQL要求您拥有所有列的INSERT权限。

MySQL中,如果您只拥有一个表中的部分列的INSERT权限,同时,如果您从INSERT语句中忽略您不拥有权限的列,则您仍然可以对表执行INSERT语句;那些列将被设置为各自的默认值。在严格模式下(即当sql_mode=’traditional’时,如果某些被忽略的列没有默认值,则INSERT语句将被拒绝。

mysql数据库学习小记。。

>mysql -h localhost -u root -p

mysql>show databases;

mysql>use 数据库名;

mysql>show tables;

mysql>select * from 表名;

mysql>create database 数据库名;

mysql>create table 表名();

添加,删除,赋予用户权限。

1.添加用户并赋予其权限

mysql>grant all on test.* to hacker@localhost identified by “密码”;

mysql>grant select,insert,update,delete on test.* to hacker@localhost identified by “密码”;

2.查看用户的登陆权限

mysql>select Host from mysq.user where User=”用户名”;

3.添加用户的登陆权限

mysql>insert into mysql.user(Host) values(“登陆地址”) where mysql.User=”用户名”;

或者

mysql>grant all on *.* to ‘root’@’%’;             “%”代表所有地址

转载“局域网实现VLAN实例”

局域网实现VLAN实例

局域网实现VLAN实例计算机网络技术的发展犹如戏剧舞台,你方唱罢我登台。从传统的以太网(10Mb/s)发展到快速以太网(100Mb/s)和千兆以太网(1000Mb/s)也不过几年的时间,其迅猛的势头实在令人吃惊。而现在中大型规模网络建设中,以千兆三层交换机为核心的所谓“千兆主干跑、百兆到桌面”的主流网络模型已不胜枚举。 现在,网络业界对“三层交换”和VLAN这两词已经不感到陌生了。


一、什么是三层交换和VLAN要回答这个问题我们还是先看看以太网的工作原理。以太网的工作原理是利用二进制位形成的一个个字节组合成一帧帧的数据(其实是一些电脉冲)在导线中进行传播。


首先,以太网网段上需要进行数据传送的节点对导线进行监听,这个过程称为CSMA/CD(Carrier Sense Multiple Access with Collision Detection带有冲突监测的载波侦听多址访问)的载波侦听。如果,这时有另外的节点正在传送数据,监听节点将不得不等待,直到传送节点的传送任务结束。如果某时恰好有两个工作站同时准备传送数据,以太网网段将发出“冲突”信号。这时,节点上所有的工作站都将检测到冲突信号,因为这时导线上的电压超出了标准电压。这时以太网网段上的任何节点都要等冲突结束后才能够传送数据。也就是说在CSMA/CD方式下,在一个时间段,只有一个节点能够在导线上传送数据。而转发以太网数据帧的联网设备是集线器,它是一层设备,传输效率比较低。冲突的产生降低了以太网的带宽,而且这种情况又是不可避免的。所以,当导线上的节点越来越多后,冲突的数量将会增加。显而易见的解决方法是限制以太网导线上的节点,需要对网络进行物理分段。将网络进行物理分段的网络设备用到了网桥与交换机。网桥和交换机的基本作用是只发送去往其他物理网段的信息。所以,如果所有的信息都只发往本地的物理网段,那么网桥和交换机上就没有信息通过。这样可以有效减少网络上的冲突。网桥和交换机是基于目标MAC(介质访问控制)地址做出转发决定的,它们是二层设备。


我们已经知道了以太网的缺点及物理网段中冲突的影响,现在,我们来看看另外一种导致网络降低运行速度的原因:广播。广播存在于所有的网络上,如果不对它们进行适当的控制,它们便会充斥于整个网络,产生大量的网络通信。广播不仅消耗了带宽,而且也降低了用户工作站的处理效率。由于各种各样的原因,网络操作系统(NOS)使用了广播,TCP/IP使用广播从IP地址中解析MAC地址,还使用广播通过RIP和IGRP协议进行宣告,所以,广播也是不可避免的。网桥和交换机将对所有的广播信息进行转发,而路由器不会。所以,为了对广播进行控制,就必须使用路由器。路由器是基于第3层报头、目标IP寻址、目标IPX寻址或目标Appletalk寻址做出转发决定。路由器是3层设备。


在这里,我们就容易理解三层交换技术了,通俗地讲,就是将路由与交换合二为一的技术。路由器在对第一个数据流进行路由后,将会产生一个MAC地址与IP地址的映射表,当同样的数据流再次通过时,将根据此映射表直接从二层进行交换而不是再次路由,提供线速性能,从而消除了路由器进行路由选择而造成网络的延迟,提高了数据包转发的效率。采用此技术的交换机我们常称为三层交换机。


那么,什么是VLAN呢?VLAN(Virtual Local Area Network)就是虚拟局域网的意思。VLAN可以不考虑用户的物理位置,而根据功能、应用等因素将用户从逻辑上划分为一个个功能相对独立的工作组,每个用户主机都连接在一个支持VLAN的交换机端口上并属于一个VLAN。同一个VLAN中的成员都共享广播,形成一个广播域,而不同VLAN之间广播信息是相互隔离的。这样,将整个网络分割成多个不同的广播域(VLAN)。一般来说,如果一个VLAN里面的工作站发送一个广播,那么这个VLAN里面所有的工作站都接收到这个广播,但是交换机不会将广播发送至其他VLAN上的任何一个端口。如果要将广播发送到其它的VLAN端口,就要用到三层交换机。


二、如何配置三层交换机创建VLAN


以下的介绍都是基于Cisco交换机的VLAN。Cisco的VLAN实现通常是以端口为中心的,与节点相连的端口将确定它所驻留的VLAN。将端口分配给VLAN的方式有两种,分别是静态的和动态的.

形成静态VLAN的过程是将端口强制性地分配给VLAN的过程。即我们先在VTP (VLAN Trunking Protocol)Server上建立VLAN,然后将每个端口分配给相应的VLAN的过程。这是我们创建VLAN最常用的方法。

动态VLAN形成很简单,由具体的机器决定自己属于哪个VLAN。即我们先建立一个VMPS(VLAN Membership Policy Server)VLAN管理策略服务器,里面包含一个文本文件,文件中存有与VLAN映射的MAC地址表。交换机根据这个映射表决定将端口分配给何种VLAN。这种方法有很大的优势,但创建数据库是一项非常艰苦而且非常繁琐的工作。


下面以实例说明如何在一个典型的快速以太局域网中实现VLAN。


所谓典型局域网就是指由一台具备三层交换功能的核心交换机接几台分支交换机(不一定具备三层交换能力)。我们假设核心交换机名称为:COM;分支交换机分别为:PAR1、PAR2、PAR3,分别通过Port 1的光线模块与核心交换机相连;并且假设VLAN名称分别为COUNTER、MARKET、MANAGING……


需要做的工作:

1、设置VTP DOMAIN(核心、分支交换机上都设置)

2、配置中继(核心、分支交换机上都设置)

3、创建VLAN(在server上设置)

4、将交换机端口划入VLAN

5、配置三层交换



1、设置VTP DOMAIN。 VTP DOMAIN 称为管理域。


交换VTP更新信息的所有交换机必须配置为相同的管理域。如果所有的交换机都以中继线相连,那么只要在核心交换机上设置一个管理域,网络上所有的交换机都加入该域,这样管理域里所有的交换机就能够了解彼此的VLAN列表。


COM#vlan database 进入VLAN配置模式

COM(vlan)#vtp domain COM 设置VTP管理域名称 COM

COM(vlan)#vtp server 设置交换机为服务器模式


PAR1#vlan database 进入VLAN配置模式

PAR1(vlan)#vtp domain COM 设置VTP管理域名称COM

PAR1(vlan)#vtp Client 设置交换机为客户端模式


PAR2#vlan database 进入VLAN配置模式

PAR2(vlan)#vtp domain COM 设置VTP管理域名称COM

PAR2(vlan)#vtp Client 设置交换机为客户端模式


PAR3#vlan database 进入VLAN配置模式

PAR3(vlan)#vtp domain COM 设置VTP管理域名称COM

PAR3(vlan)#vtp Client 设置交换机为客户端模式


注意:这里设置核心交换机为Server模式是指允许在该交换机上创建、修改、删除VLAN及其他一些对整个VTP域的配置参数,同步本VTP域中其他交换机传递来的最新的VLAN信息;Client模式是指本交换机不能创建、删除、修改VLAN配置,也不能在NVRAM中存储VLAN配置,但可同步由本VTP域中其他交换机传递来的VLAN信息。


2、配置中继为了保证管理域能够覆盖所有的分支交换机,必须配置中继。


Cisco交换机能够支持任何介质作为中继线,为了实现中继可使用其特有的ISL标签。ISL(Inter-Switch Link)是一个在交换机之间、交换机与路由器之间及交换机与服务器之间传递多个VLAN信息及VLAN数据流的协议,通过在交换机直接相连的端口配置ISL封装,即可跨越交换机进行整个网络的VLAN分配和进行配置。


在核心交换机端配置如下:


COM(config)#interface gigabitEthernet 2/1

COM(config-if)#switchport

COM(config-if)#switchport trunk encapsulation isl 配置中继协议

COM(config-if)#switchport mode trunk


COM(config)#interface gigabitEthernet 2/2

COM(config-if)#switchport

COM(config-if)#switchport trunk encapsulation isl 配置中继协议

COM(config-if)#switchport mode trunk


COM(config)#interface gigabitEthernet 2/3

COM(config-if)#switchport

COM(config-if)#switchport trunk encapsulation isl 配置中继协议

COM(config-if)#switchport mode trunk


在分支交换机端配置如下:


PAR1(config)#interface gigabitEthernet 0/1

PAR1(config-if)#switchport mode trunk


PAR2(config)#interface gigabitEthernet 0/1

PAR2(config-if)#switchport mode trunk


PAR3(config)#interface gigabitEthernet 0/1

PAR3(config-if)#switchport mode trunk


……


此时,管理域算是设置完毕了。



3、创建VLAN一旦建立了管理域,就可以创建VLAN了。


COM(vlan)#Vlan 10 name COUNTER 创建了一个编号为10 名字为COUNTER的 VLAN

COM(vlan)#Vlan 11 name MARKET 创建了一个编号为11 名字为MARKET的 VLAN

COM(vlan)#Vlan 12 name MANAGING 创建了一个编号为12 名字为MANAGING的 VLAN


……


注意,这里的VLAN是在核心交换机上建立的,其实,只要是在管理域中的任何一台VTP 属性为Server的交换机上建立VLAN,它就会通过VTP通告整个管理域中的所有的交换机。但如果要将具体的交换机端口划入某个VLAN,就必须在该端口所属的交换机上进行设置。



4、将交换机端口划入VLAN


例如,要将PAR1、PAR2、PAR3……分支交换机的端口1划入COUNTER VLAN,端口2划入MARKET VLAN,端口3划入MANAGING VLAN……


PAR1(config)#interface fastEthernet 0/1 配置端口1

PAR1(config-if)#switchport access vlan 10 归属COUNTER VLAN


PAR1(config)#interface fastEthernet 0/2 配置端口2

PAR1(config-if)#switchport access vlan 11 归属MARKET VLAN


PAR1(config)#interface fastEthernet 0/3 配置端口3

PAR1(config-if)#switchport access vlan 12 归属MANAGING VLAN



PAR2(config)#interface fastEthernet 0/1 配置端口1

PAR2(config-if)#switchport access vlan 10 归属COUNTER VLAN


PAR2(config)#interface fastEthernet 0/2 配置端口2

PAR2(config-if)#switchport access vlan 11 归属MARKET VLAN


PAR2(config)#interface fastEthernet 0/3 配置端口3

PAR2(config-if)#switchport access vlan 12 归属MANAGING VLAN



PAR3(config)#interface fastEthernet 0/1 配置端口1

PAR3(config-if)#switchport access vlan 10 归属COUNTER VLAN


PAR3(config)#interface fastEthernet 0/2 配置端口2

PAR3(config-if)#switchport access vlan 11 归属MARKET VLAN


PAR3(config)#interface fastEthernet 0/3 配置端口3

PAR3(config-if)#switchport access vlan 12 归属MANAGING VLAN


……



5、配置三层交换


到这里,VLAN已经基本划分完毕。但是,VLAN间如何实现三层(网络层)交换呢?这时就要给各VLAN分配网络(IP)地址了。给VLAN分配IP地址分两种情况,其一,给VLAN所有的节点分配静态IP地址;其二,给VLAN所有的节点分配动态IP地址。下面就这两种情况分别介绍。


假设给VLAN COUNTER分配的接口Ip地址为172.16.58.1/24,网络地址为:172.16.58.0,

VLAN MARKET 分配的接口Ip地址为172.16.59.1/24,网络地址为:172.16.59.0,

VLAN MANAGING分配接口Ip地址为172.16.60.1/24, 网络地址为172.16.60.0

……

如果动态分配IP地址,则设网络上的DHCP服务器IP地址为172.16.1.11。


(1)给VLAN所有的节点分配静态IP地址。


首先在核心交换机上分别设置各VLAN的接口IP地址。核心交换机将vlan做为一种接口对待,就象路由器上的一样,如下所示:


COM(config)#interface vlan 10

COM(config-if)#ip address 172.16.58.1 255.255.255.0 VLAN10接口IP


COM(config)#interface vlan 11

COM(config-if)#ip address 172.16.59.1 255.255.255.0 VLAN11接口IP


COM(config)#interface vlan 12

COM(config-if)#ip address 172.16.60.1 255.255.255.0 VLAN12接口IP


……


再在各接入VLAN的计算机上设置与所属VLAN的网络地址一致的IP地址,并且把默认网关设置为该VLAN的接口地址。这样,所有的VLAN也可以互访了。


(2)给VLAN所有的节点分配动态IP地址。


首先在核心交换机上分别设置各VLAN的接口IP地址和同样的DHCP服务器的IP地址,如下所示:


COM(config)#interface vlan 10

COM(config-if)#ip address 172.16.58.1 255.255.255.0 VLAN10接口IP

COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP


COM(config)#interface vlan 11

COM(config-if)#ip address 172.16.59.1 255.255.255.0 VLAN11接口IP

COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP


COM(config)#interface vlan 12

COM(config-if)#ip address 172.16.60.1 255.255.255.0 VLAN12接口IP

COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP


……


再在DHCP服务器上设置网络地址分别为172.16.58.0,172.16.59.0,172.16.60.0的作用域,并将这些作用域的“路由器”选项设置为对应VLAN的接口IP地址。这样,可以保证所有的VLAN也可以互访了。


最后在各接入VLAN的计算机进行网络设置,将IP地址选项设置为自动获得IP地址即可。



三、总结


本文是笔者在实际工作中的一些总结。笔者力图用通俗易懂的文字来阐述创建VLAN的全过程。并且给出了详细的设置步骤,只要你对Cisco交换机的IOS有所了解,看懂本文并不难。按照本文所示的步骤一步一步地做,你完全可以给一个典型的快速以太网络建立多个VLAN。

vsftpd服务器配置。。练手…

下午网络中心开了会。。张老师给我们介绍了一下中心的设备。。。

开完会。。没事整了。昨天刚复习了samba服务器。今天复习一下vsftpd服务器的配置吧。。

下载文件

mkdir /var/ftp

useradd nobody

chown root.root /var/ftp

chmod og-w /var/ftp

usermod -d /var/ftp ftp

mkdir /usr/share/empty

cp vsftpd.conf /etc/vsftpd.conf

make

make install

cp RedHat/vsftpd.pam /etc/pam.d/ftp

由于最后一步没有认真看。。导致本地用户不能登陆。。浪费了一个小时的时间。。。认真。。认真。。再认真。。。继续了。。

匿名用户:

浏览权限

anon_world_readable_enalbe=YES

上传权限

anon_upload_enable=YES

建立文件夹权限

anon_mkdir_write_enable=YES

修改及删除文件权限

anon_other_write_enable=YES

_____________________________________________________________

本地用户只能待在自家目录chroot环境

chroot_local_user=YES

还有一种用法,列表中用户待在自家目录chroot环境

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

(前提是chroot_local_user=no)

在/etc/vsftpd.chroot_list文件中的用户名都是chroot环境

………………………………………………………………………………………………

限制用户

/etc/ftpusers   向该文件中写入用户名就可以决定该用户是否能登陆(或只允许)

由/etc/pam.d/ftp文件控制

限制本地用户连接(没有实验成功)



Userlist_enable=yes (在指定的文件中的用户不可以访问)


Userlist_deny=yes


Userlist_file=/指定的路径/vsftpd.user_list

…………………………………………………………………………………………………………

(1)配置虚拟用户vsftpd服务器

useradd test

chgrp /home/test test

chmod g+wr /home/test

(2)编辑vsftpd.conf文件,添加

guest_enable=YES

guest_username=test

pam_service_name=ftp    #默认就是ftp

user_config_dir=/etc/vsftpd_user_conf

(3)建立虚拟用户

编辑test文件,内容如下

用户名1

密码

用户名2

密码

。。。。。

保存退出

db_load -T -t hash -f test /etc/vsftpd_login

( 4 )编辑/etc/pam.d/ftp文件

注释全部,添加以下

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

保存退出

重启vsftpd服务器

测试。。。

接着玩。。。。

进入/etc/vsftpd_user_conf文件夹下

建文件,文件名为虚拟用户名

anon_world_readable_only=no

anon_upload_enable=yes

anon_mkdir_write_enable=yes

anon_other_write_enable=yes

local_root=/var/test

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

差不多行了。。还有一个选项

ftp_username=local_username 这个用户是匿名登陆时的用户,默认为ftp

windowsxp访问工作组计算机慢的原因

机子刚换回了XP。。。。。装了VMare。。。。。。

试验了linux下的samba服务器。。不过访问慢的出奇。。。

查看工作组计算机也慢。。得等上半分钟。。

网上找原因。。以下转自网上:

在WinXP和Win2000中浏览网上邻居时系统默认会延迟30秒,Windows将使用这段时间去搜寻远程计算机是否有指定的计划任务(甚至有可能到Internet中搜寻)。如果搜寻时网络时没有反应便会陷入无限制的等待,那么10多分钟的延迟甚至报错就不足为奇了。下面是具体的解决方法。       

   1.关掉WinXP的计划任务服务(Task    Scheduler)       

   可以到“控制面板/管理工具/服务”中打开“Task    Scheduler”的属性对话框,单击“停止”按钮停止该项服务,再将启动类型设为“手动”,这样下次启动时便不会自动启动该项服务了。     

   2.删除注册表中的两个子键       

   到注册表中找到主键“       

   HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer/RemoteComputer/NameSpace”       

   删除下面的两个子健    :   

   {2227A280-3AEA-1069-A2DE-08002B30309D}       

   {D6277990-4C6A-11CF-87-00AA0060F5BF}       

   其中,第一个子健决定网上邻居是否要搜索网上的打印机(甚至要到Internet中去搜寻),如果网络中没有共享的打印机便可删除此键。第二个子健则决定是否需要查找指定的计划任务,这是网上邻居很慢的罪魁祸首,必须将此子健删除。

不过还是慢。。。

突然想起来装了Vmare虚拟机。。多了两块虚拟网卡。会不会这个原因。。。。

禁用两块网卡。。。快多了。。呵呵。。找到原因了。。~~~

Linux下SUID、SGID的解析

一、LINIX下关于文件权限的表示方法和解析

SUID 是 Set User ID, SGID 是 Set Group ID的意思。

Linux下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:

9 8 7 6 5 4 3 2 1 0

– r w x r – x r – x

第9位表示文件类型,可以为p、d、l、s、c、b和-:

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket文件

c表示字符设备文件

b表示块设备文件

第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:

r表示可读,可以读出文件的内容

w表示可写,可以修改文件的内容

x表示可执行,可运行这个程序

没有权限的位置用-表示

例子:

ls -l myfile显示为:

-rwxr-x— 1 foo staff 7734 Apr 05 17:07 myfile

表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。

所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。

如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置

2、-rwSr–r– 表示SUID被设置,但所有者权限中可执行位没有被设置

3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置

4、-rw-r-Sr– 表示SGID被设置,但同组用户权限中可执行位没有被社

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是

1,表示有相应的权限:

11 10 9 8 7 6 5 4 3 2 1 0

S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

11 10 9 8 7 6 5 4 3 2 1 0

上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr–的值为: 0 1 0 1 1 0 1 0 0 1 0 0

给文件加SUID和SUID的命令如下:

chmod u+s filename 设置SUID位

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID位

chmod g-s filename 去掉SGID设置

另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。

二、SUID和SGID的详细解析

由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。

首先讲普通文件的SUID和SGID的作用。例子:

如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:

-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。

除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问 的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

下面讨论一个例子:

Linux系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,

权限设为:cr–r—– 1 root system 2, 1 May 25 1998 kmem

但ps等程序要读这个文件,而ps的权限设置如下:

-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置 SUID来访问kmem,但bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文 件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。

SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序.

SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

三、关于SUID和SGID的编程

和SUID和SGID编程比较密切相关的有以下的头文件和函数:

#include

#include

uid_t getuid(void);

uid_t geteuid(void);

gid_t getgid (void);

gid_t getegid (void);

int setuid (uid_t UID);

int setruid (uid_t RUID);

int seteuid (uid_t EUID);

int setreuid (uid_t RUID,uid_t EUID);

int setgid (gid_t GID);

int setrgid (gid_t RGID);

int setegid (git_t EGID);

int setregid (gid_t RGID, gid_t EGID);

具体这些函数的说明在这里就不详细列出来了,要用到的可以用man查。

SUID/SGID :

假如你有文件a.txt

#ls -l a.txt

-rwxrwxrwx

#chmod 4777 a.txt

-rwsrwxrwx ======>注意s位置

#chmod 2777 a.txt

-rwxrwsrwx ======>注意s位置

#chmod 7777 a.txt

-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省系统再加载的时间.

现在再看前面设置 SUID/SGID作用:

#cd /sbin

#./lsusb

#su aaa(普通用户)

$./lsusb

是不是现在显示出错?

$su

#chmod 4755 lsusb

#su aaa

$./lsusb

本来是只有root用户才能执行的命令,加了SUID后,普通用户就可以像root一样的用,权限提升了。上面是对于文件来说的,对于目录也差不多!

录的S属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组,目录的T属性使得该目录的所有者及root才能删除该目录。还有对于s与S,设置SUID/SGID需要有运行权限,否则用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用

    r — 读访问

   w — 写访问

   x — 执行许可

   s — SUID/SGID

   t — sticky位

那么 suid/sgid是做什么的? 为什么会有suid位呢?

要想明白这个,先让我们看个问题:如果让每个用户更改自己的密码?

用户修改密码,是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件,而passwd的文件的属性是:

#ls -l /etc/passwd

-rw-r–r– 1 root root 2520 Jul 12 18:25 passwd

我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢?

为了解决这个问题,SUID/SGID便应运而生。而且AT&T对它申请了专利。 呵呵。

SUID和SGID是如何解决这个问题呢?

首先,我们要知道一点:进程在运行的时候,有一些属性,其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。

而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时,是采用了进程的有效用户ID来进行判断的。

知道了这点,我们来看看SUID的解决途径:

当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。举个例子:

[root@sgrid5 bin]# ls -l passwd

-r-s–s–x 1 root root 16336 Feb 14 2003 passwd

虽然你以test登陆系统,但是当你输入passwd命令来更改密码的时候,由于 passwd设置了SUID位,因此虽然进程的实际用户ID是test对应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID, 因此可以修改/etc/passwd文件。

让我们看另外一个例子。

ping命令应用广泛,可以测试网络是否连接正常。ping在运行中是采用了ICMP协议,需要发送ICMP报文。但是只有root用户才能建立ICMP报文,如何解决这个问题呢?同样,也是通过SUID位来解决。

[root@sgrid5 bin]# ls -l /bin/ping

-rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping

我们可以测试一下,如果去掉ping的SUID位,再用普通用户去运行命令,看会怎么样。

[root@sgrid5 bin]#chmod u-s /bin/ping

[root@sgrid5 bin]# ls -l ping

-rwxr-xr-x 1 root root 28628 Jan 25 2003 ping

[root@sgrid5 bin]#su test

[test@sgrid5 bin]$ ping byhh.net

ping: icmp open socket: Operation not permitted

SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。

因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。

因此在安全方面特别要注意那些设置了SUID的程序。

通过以下的命令可以找到系统上所有的设置了suid的文件:

[root@sgrid5 /]# find / -perm -04000 -type f -ls

对于这里为什么是4000,大家可以看一下前面的st_mode的各bit的意义就明白了。

在这些设置了suid的程序里,如果用不上的,就最好取消该程序的suid位。

set uid, set gid, sticky bit的三个权限的详细说明(zz)

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组.


如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid 可以来改变这种设置.


setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.


setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.


sticky bit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件.


下面说一下如何操作这些标志:


操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,


1) chmod u+s temp — 为temp文件加上setuid标志. (setuid 只对文件有效)


chmod g+s tempdir — 为tempdir目录加上setgid标志 (setgid 只对目录有效)


chmod o+t temp — 为temp文件加上sticky标志 (sticky只对文件有效)


2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,


abc


a – setuid位, 如果该位为1, 则表示设置setuid


b – setgid位, 如果该位为1, 则表示设置setgid


c – sticky位, 如果该位为1, 则表示设置sticky


设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如


rwsrw-r– 表示有setuid标志


rwxrwsrw- 表示有setgid标志


rwxrw-rwt 表示有sticky标志


那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)


这三个权限的数字位可以这么理解


[root@server3 test]# 1 1 1


[root@server3 test]# rw s rws rwt


[root@server3 test]#


[root@server3 test]# SUID SGID Sticky


所以,可以得出


chmod 4777是设sid


chmod 2777是设置gid


chmod 1777是设sticky


常用操作


找出所有危险的目录(设置目录所有人可读写却没有设置sticky位的目录)


find / -perm -0007 -type d


找出所有设置了suid的文件


find / -perm -4000 -type f