Author: 云厉

MySQL中utf8编码:utf8_bin,utf8_general_ci,utf8_unicode_ci的区别

[font=微软雅黑][size=3][b]我们在使用 MySQL 的UTF8编码 时 普遍使用的校对规则都是:[/b][/size][/font]
[url=thread-80-1-1.html]utf8_bin[/url] , [url=thread-80-1-1.html]utf8_general_ci[/url] , [url=thread-80-1-1.html]utf8_general_cs[/url] , [url=thread-80-1-1.html]utf8_unicode_ci[/url]

[table=98%]

utf8_bin compare strings by the binary value of each character in the string 将字符串每个字符串用二进制数据编译存储。
区分大小写,校对规则和 utf8_general_cs 一样,而且可以存二进制的内容 utf8_general_ci 不区分大小写,即 “大小写不敏感”,a 和 A 会在字符判断中会被当做一样的,例如:
SELECT * FROM `table` WHERE `field`= ‘a’
结果将是 field等于A 和 field等于a 的所有记录集合 utf8_general_cs 区分大小写,例如:
SELECT * FROM `table` WHERE `field`= ‘a’
结果只有 field等于a 的记录集合 utf8_unicode_ci 不区分大小写,支持部分Unicode校对规则算法

[font=微软雅黑][size=3][b]举例说明:[/b][/size][/font]
如果你的Sql查询语句: SELECT * FROM `table` WHERE `field`=‘SINA’
下面哪些字段内容会返回匹配:
[table=98%]

‘SINA’ utf8_bin、utf8_general_ci、utf8_general_cs、utf8_unicode_ci ‘Sina’ utf8_general_ci、utf8_unicode_ci

[font=微软雅黑][size=3][b]utf8_unicode_ci 与 utf8_general_ci 区别:[/b][/size][/font]

当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。
并且,不能完全支持组合的记号。
这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。

utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。
utf8_general_ci是一个遗留的校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用 utf8_unicode_ci 的校对规则相比,比较正确性较差)。

例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:
Ä = A
Ö = O
Ü = U

两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
ß = s

但是,对于utf8_unicode_ci下面等式成立:
ß = ss

对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。
否则,使用 utf8_unicode_ci,因为它比较准确

ubuntu中Libreoffice汉化方法

libreoffice是一个跨平台的office办公软件,功能强大,文档格式类型兼容Microsoft Office办公套件,通过在ubuntu,xubuntu软件中心安装之后都是英文版本的,如何汉化,能够更加方便的使用呢?

方法很简单,只要安装了两个语言包即可:

libreoffice-l10n-zh-cn
libreoffice-help-zh-cn

直接在软件中心搜索并安装

倒流’s Bolg

mysql的grant命令,对mysql用户权限的增删改查

[size=4][b]本文实例,运行于 MySQL 5.0 及以上版本[/b][/size]
MySQL 赋予用户权限命令的简单格式可概括为:

grant 权限 on 数据库对象 to 用户

[font=微软雅黑][size=5][b][color=SeaGreen]一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利[/b][/size][/font]
[code]grant select on testdb.* to common_user@’%’
grant insert on testdb.* to common_user@’%’
grant update on testdb.* to common_user@’%’
grant delete on testdb.* to common_user@’%'[/code]
或者,用一条 MySQL 命令来替代:
[code]grant select, insert, update, delete on testdb.* to common_user@’%'[/code]

[font=微软雅黑][size=5][b][color=SeaGreen]二、grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。[/b][/size][/font]

grant 创建、修改、删除 MySQL 数据表结构权限:
[code]grant create on testdb.* to developer@’192.168.0.%’;
grant alter on testdb.* to developer@’192.168.0.%’;
grant drop on testdb.* to developer@’192.168.0.%’;[/code]

grant 操作 MySQL 外键权限:
[code]grant references on testdb.* to developer@’192.168.0.%’;[/code]

grant 操作 MySQL 临时表权限:
[code]grant create temporary tables on testdb.* to developer@’192.168.0.%’;[/code]

grant 操作 MySQL 索引权限:
[code]grant index on testdb.* to developer@’192.168.0.%’;[/code]

grant 操作 MySQL 视图、查看视图源代码 权限:
[code]grant create view on testdb.* to developer@’192.168.0.%’;
grant show view on testdb.* to developer@’192.168.0.%’;[/code]

grant 操作 MySQL 存储过程、函数 权限:
[code]grant create routine on testdb.* to developer@’192.168.0.%’;
grant alter routine on testdb.* to developer@’192.168.0.%’;
grant execute on testdb.* to developer@’192.168.0.%’;[/code]

[font=微软雅黑][size=5][b][color=SeaGreen]三、grant 普通 DBA 管理某个 MySQL 数据库的权限。[/b][/size][/font]

[code]grant all privileges on testdb to dba@’localhost'[/code]
其中,关键字 “privileges” 可以省略。

[font=微软雅黑][size=5][b][color=SeaGreen]四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。[/b][/size][/font]

[code]grant all on *.* to dba@’localhost'[/code]

[font=微软雅黑][size=5][b][color=SeaGreen]五、MySQL grant 权限,分别可以作用在多个层次上。[/b][/size][/font]

1. grant 作用在整个 MySQL 服务器上:
dba 可以查询 MySQL 中所有数据库中的表
[code]grant select on *.* to dba@localhost;[/code]
dba 可以管理 MySQL 中的所有数据库
[code]grant all on *.* to dba@localhost;[/code]

2. grant 作用在单个数据库上:
dba 可以查询 testdb 中的表
[code]grant select on testdb.* to dba@localhost;[/code]

3. grant 作用在单个数据表上:
[code]grant select, insert, update, delete on testdb.orders to dba@localhost;[/code]

这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
[code]grant select(user_id,username) on smp.users to mo_user@’%’ identified by ‘123345’;
grant select on smp.mo_sms to mo_user@’%’ identified by ‘123345’;[/code]

4. grant 作用在表中的列上:
[code]grant select(id, se, rank) on testdb.apache_log to dba@localhost;[/code]

5. grant 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to ‘dba’@’localhost’
grant execute on function testdb.fn_add to ‘dba’@’localhost’

[font=微软雅黑][size=5][b][color=SeaGreen]六、查看 MySQL 用户权限[/b][/size][/font]

查看当前用户(自己)权限:
[code]show grants;[/code]
查看其他 MySQL 用户权限:
[code]show grants for dba@localhost;[/code]

[font=微软雅黑][size=5][b][color=SeaGreen]七、撤销已经赋予给 MySQL 用户权限的权限。[/b][/size][/font]

revoke 跟 grant 的语法差不多,只需要把关键字 “to” 换成 “from” 即可:
[code]grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;[/code]

[font=微软雅黑][size=5][b][color=SeaGreen]八、MySQL grant、revoke 用户权限注意事项[/b][/size][/font]

1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 “grant option“
[code]grant select on testdb.* to dba@localhost with grant option;[/code]

这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。

修改完用户权限,请执行:(刷新系统权限)[code]flush privileges;[/code]

MySQL无法使用外网IP或内网IP访问 解决办法

ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.209.69’ (111)

常见服务器环境场景:
[list]
[*]一台机器两个网卡,一个内网IP,一个外网IP
[*]一台机器只有一个内网IP(服务器集群什么)
[/list]一般我们内网通讯(例如 A机器 访问 B机器 的 Memcache、MySQL 等),都是使用内网IP,原因我就不多说了。
[code]mysql -h 192.168.209.69 -u test -p 123456 -D fuck
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.209.69’ (111)[/code][b]出现上述问题,可能有以下几种可能:[/b]

1、my.cnf 配置文件中 skip-networking 被配置

skip-networking 这个参数,导致所有TCP/IP端口没有被监听,也就是说出了本机,其他客户端都无法用网络连接到本mysql服务器
所以需要把这个参数注释掉。

2、my.cnf 配置文件中 bindaddress 的参数配置

bindaddress,有的版本是bind-address ,这个参数是指定哪些ip地址被配置,使得mysql服务器只回应哪些ip地址的请求,
所以需要把这个参数注释掉。

3、防火墙的原因
通过 /etc/init.d/iptables stop 关闭防火墙

[hr]
如果是下面这种错误:

ERROR 1045 (28000): Access denied for user ‘test’@’localhost’ (using password: YES)

那必然是用户权限问题,请参考:[url=thread-72-1-1.html]mysql的grant命令,对mysql用户权限的增删改查[/url]

Apache配置文件解析错误和启动失败总结

httpd not running, trying to start
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

80端口被占用,尚无可用套接字可以使用,导致apache关闭了。apache觉得,自己很没存在感,最爱的80端口被占用,连个可以说话的sokets都没有,于是apache很郁闷地选择了关闭。解决办法是,先把占用80端口的进程给揪出来,干掉它!

关于怎么找的问题:1.如果是windows平台,使用这条:netstat -aon|findstr “80”,可以找到进程ID,直接杀掉;
2.如果linux平台,使用:lsof -i:80 ,看到pid没?不要犹豫,杀掉。
3.如果是unix,那像得网上再找办法啦··
—–

service httpd restart 再试试,看是不是能正常启动,Good Luck!


Invalid command ‘Order’, perhaps misspelled or defined by a module not included in the server configuration

这个错误是是没有加载 mod_authz_host.so 导致的,添加进去就行了
[code lang=”shell”]LoadModule authz_host_module modules/mod_authz_host.so[/code]


Invalid command ‘AddLanguage’, perhaps misspelled or defined by a module not included in the server configuration


sudo apachectl restart

apache未启动,也没有报错,

等待更新….

PHP一行代码获取目录及子目录下所有文件名

常用方法一:读取文件目录
<?php
$dir = "file";
if (is_dir($dir)) { 
   if ($dh = opendir($dir)) {
       while (($file = readdir($dh)) !== false) {
            if ($file!="." && $file!="..") {
                echo "<a href=file/".$file.">".$file."</a><br>";
            }
       }
       closedir($dh);
   }
}
常用方法二:glob方法
<?php
$dirs = glob($tPath . '/*');
    foreach ($dirs as $path) {
        if (is_dir($path)) {
            $path = basename($path);
            $dirs_arr[] = $path;
        }
    }
}
其实一行代码就可以
<?php
$dirs = array_map('basename', glob ('*', GLOB_ONLYDIR))

linux下杀死进程的N种方法

[font=微软雅黑][size=4][b][color=SeaGreen]常规篇:[/b][/size][/font]

 首先,用ps查看进程,方法如下:

[code]ps -ef[/code]

……
smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
smx 1824 1822 0 11:38 pts/0 00:00:02 bash
smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 1822 0 11:38 pts/1 00:00:00 bash
smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
……
smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef

或者:
[code]ps -aux[/code]

……
smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
smx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash
smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin
smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash
smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
……
smx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux

此时如果我想杀了火狐的进程就在终端输入:
[code]kill -s 9 1827[/code]

其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。

1827则是上面ps查到的火狐的PID。

简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,
无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。

[font=微软雅黑][size=4][b][color=SeaGreen]改进1:[/b][/size][/font]

把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

[code]ps -ef | grep firefox[/code]

smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
smx 12029 1824 0 21:54 pts/0 00:00:00 grep –color=auto firefox

这次就清爽了。然后就是
[code]kill -s 9 1827[/code]

还是嫌打字多?

[font=微软雅黑][size=4][b][color=SeaGreen]改进2 ———使用pgrep:[/b][/size][/font]

一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

[code]pgrep firefox[/code]

1827

看到了什么?没错火狐的PID,接下来又要打字了:
[code]kill -s 9 1827[/code]

[font=微软雅黑][size=4][b][color=SeaGreen]改进3 ——使用pidof:[/b][/size][/font]

看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

[code]pidof firefox-bin[/code]

1827

和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:
[code]kill -s 9 1827[/code]

无论使用ps 然后慢慢查找进程PID
还是用grep查找包含相应字符串的进程,
亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。
有没有更方便的方法?有!

[font=微软雅黑][size=4][b][color=SeaGreen]改进4:[/b][/size][/font]
[code]ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9[/code]

说明:

“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

难道你不想抱怨点什么?没错太长了

[font=微软雅黑][size=4][b][color=SeaGreen]改进5:[/b][/size][/font]

知道pgrep和pidof两个命令,干嘛还要打那么长一串!
[code]pgrep firefox | xargs kill -s 9[/code]

[font=微软雅黑][size=4][b][color=SeaGreen]改进6:[/b][/size][/font]
[code]ps -ef | grep firefox | awk ‘{print $2}’ | xargs kill -9[/code]

kill: No such process

有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。

其中awk ‘{print $2}’ 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

[font=微软雅黑][size=4][b][color=SeaGreen]改进7:[/b][/size][/font]
难道每次都要调用xargs把PID传递给kill?答案是否定的:
[code]kill -s 9 `ps -aux | grep firefox | awk ‘{print $2}’`[/code]

[font=微软雅黑][size=4][b][color=SeaGreen]改进8:[/b][/size][/font]

没错,命令依然有点长,换成pgrep。
[code]kill -s 9 `pgrep firefox`[/code]

[font=微软雅黑][size=4][b][color=SeaGreen]改进9——pkill:[/b][/size][/font]

看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。
[code]pkill -9 firefox[/code]

说明:”-9″ 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 “-s 9″,结果每次运行都无法终止进程。

[font=微软雅黑][size=4][b][color=SeaGreen]改进10——killall:[/b][/size][/font]

killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。
[code]killall -9 firefox[/code]

附录:各种信号及其用途
[table=100%]

Signal Description Signal number on Linux x86[1] SIGABRT Process aborted 6 SIGALRM Signal raised by alarm 14 SIGBUS Bus error: “access to undefined portion of memory object” 7 SIGCHLD Child process terminated, stopped (or continued*) 17 SIGCONT Continue if stopped 18 SIGFPE Floating point exception: “erroneous arithmetic operation” 8 SIGHUP Hangup 1 SIGILL Illegal instruction 4 SIGINT Interrupt 2 SIGKILL Kill (terminate immediately) 9 SIGPIPE Write to pipe with no one reading 13 SIGQUIT Quit and dump core 3 SIGSEGV Segmentation violation 11 SIGSTOP Stop executing temporarily 19 SIGTERM Termination (request to terminate) 15 SIGTSTP Terminal stop signal 20 SIGTTIN Background process attempting to read from tty (“in”) 21

SIGTTOU Background process attempting to write to tty (“out”) 22

SIGUSR1 User-defined 1 10

SIGUSR2 User-defined 2 12

SIGPOLL Pollable event 29

SIGPROF Profiling timer expired 27

SIGSYS Bad syscall 31

SIGTRAP Trace/breakpoint trap 5

SIGURG Urgent data available on socket 23

SIGVTALRM Signal raised by timer counting virtual time: “virtual timer expired” 26

SIGXCPU CPU time limit exceeded 24

SIGXFSZ File size limit exceeded 25

MySQL备份工具 mysqldump 的基本用法

基本格式:
mysqldump [OPTIONS] database [tables]

如果你不给定任何表,整个数据库将被导出。
通过执行mysqldump –help,你能得到你[url=thread-63-1-1.html]mysqldump[/url]的版本支持的选项表。

注意,如果你运行mysqldump没有–quick或–opt选项,[url=thread-63-1-1.html]mysqldump[/url]将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。

[url=thread-63-1-1.html]mysqldump[/url]支持下列选项:
–add-locks
在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。
–add-drop-table
在每个create语句之前增加一个drop table。
–allow-keywords
允许创建是关键词的列名字。这由表名前缀于每个列名做到。
-c, –complete-insert
使用完整的insert语句(用列名字)。
-C, –compress
如果客户和服务器均支持压缩,压缩两者间所有的信息。
–delayed
用INSERT DELAYED命令插入行。
-e, –extended-insert
使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)
-#, –debug[=option_string]
跟踪程序的使用(为了调试)。
–help
显示一条帮助消息并且退出。
–fields-terminated-by=…
–fields-enclosed-by=…
–fields-optionally-enclosed-by=…
–fields-escaped-by=…
–fields-terminated-by=…
这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。
LOAD DATA INFILE语法。
-F, –flush-logs
在开始导出前,洗掉在MySQL服务器中的日志文件。
-f, –force,
即使我们在一个表导出期间得到一个SQL错误,继续。
-h, –host=..
从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。
-l, –lock-tables.
为开始导出锁定所有表。
-t, –no-create-info
不写入表创建信息(CREATE TABLE语句)
-d, –no-data
不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!
–opt
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。
应该给你为读入一个MySQL服务器的尽可能最快的导出。
-pyour_pass, –password[=your_pass]
与服务器连接时使用的口令。如果你不指定“=your_pass”部分,[url=thread-63-1-1.html]mysqldump[/url]需要来自终端的口令。
-P port_num, –port=port_num
与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)
-q, –quick
不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, –socket=/path/to/socket
与localhost连接时(它是缺省主机)使用的套接字文件。
-T, –tab=path-to-some-directory
对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在[url=thread-63-1-1.html]mysqldump[/url]运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据–fields-xxx和–lines–xxx选项来定。
-u user_name, –user=user_name
与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。
-O var=option, –set-variable var=option设置一个变量的值。可能的变量被列在下面。
-v, –verbose
冗长模式。打印出程序所做的更多的信息。
-V, –version
打印版本信息并且退出。
-w, –where=’where-condition’
只导出被选择了的记录;注意引号是强制的!
“–where=user=’jimf'” “-wuserid>1” “-wuserid<1" 最常见的[url=thread-63-1-1.html]mysqldump[/url]使用可能制作整个数据库的一个备份: [url=thread-63-1-1.html]mysqldump[/url] --opt database > backup-file.sql
但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:
mysqldump –opt database | mysql –host=remote-host -C database
由于[url=thread-63-1-1.html]mysqldump[/url]导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:
shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql 就是 shell> mysql 库名 < 文件名 ================================ 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

3.导出一个数据库结构
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table

4.导入数据库
常用source 命令
进入mysql数据库控制台,
如mysql -u root -p

mysql>use 数据库
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:\wcnc_db.sql

Linux下cron的使用(crontab -e)

[url=thread-62-1-1.html]cron[/url] 是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。
由于[url=thread-62-1-1.html]Cron[/url] 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:

/sbin/service crond start

现在[url=thread-62-1-1.html]Cron[/url]这个服务已经在进程里面了,我们就可以用这个服务了,[url=thread-62-1-1.html]Cron[/url]服务提供以下几种接口供大家使用:

[font=微软雅黑][size=3][color=Navy]1、直接用crontab命令编辑[/size][/font]

[url=thread-62-1-1.html]cron[/url]服务提供[url=thread-62-1-1.html]crontab[/url]命令来设定[url=thread-62-1-1.html]cron[/url]服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的[url=thread-62-1-1.html]cron[/url]设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑[url=thread-62-1-1.html]cron[/url]服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

  分钟 (0-59)
  小時 (0-23)
  日期 (1-31)
  月份 (1-12)
  星期 (0-6) //0代表星期天

除了数字还有几个个特殊的符号就是 “*”、”/”和”-“、”,”,

*代表所有的取值范围内的数字,
“/”代表每的意思,
“*/5″表示每5个单位,
“-“代表从某个数字到某个数字,
“,”分开几个离散的数字。

以下举几个例子说明问题:

每天早上6点(注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了)
[code]0 6 * * * echo “Good morning.” >> /tmp/test.txt[/code]每两个小时
[code]0 */2 * * * echo “Have a break now.” >> /tmp/test.txt[/code]晚上11点到早上8点之间每两个小时,早上八点
[code]0 23-7/2,8 * * * echo “Have a good dream:)” >> /tmp/test.txt[/code]每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
[code]0 11 4 * 1-3 command line[/code]1月1日早上4点
[code]0 4 1 1 * command line[/code]

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。[url=thread-62-1-1.html]cron[/url]启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。
因此此文件修改后不需要重新启动[url=thread-62-1-1.html]cron[/url]服务。

[font=微软雅黑][size=3][color=Navy]2、编辑/etc/crontab 文件配置cron[/size][/font]

[url=thread-62-1-1.html]cron[/url]服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用[url=thread-62-1-1.html]cron[/url]服务做一些事情。
用[url=thread-62-1-1.html]crontab[/url]配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

一次Linux系统被攻击的分析过程

IT行业发展到现在,安全问题已经变得至关重要,从最近的“棱镜门”事件中,折射出了很多安全问题,信息安全问题已变得刻不容缓,而做为运维人员,就必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,修补任何潜在的威胁和漏洞。

一次Linux被入侵后的分析
下面通过一个案例介绍下当一个服务器被[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]入侵后的处理思路和处理过程,[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]攻击是Linux系统下最常见的攻击手段和攻击方式。

[font=微软雅黑][size=4][b][color=Navy]1、受攻击现象[/b][/size][/font]
这是一台客户的门户网站服务器,托管在电信机房,客户接到电信的通知:由于此服务器持续对外发送数据包,导致100M带宽耗尽,于是电信就切断了此服务器的网络。此服务器是Centos5.5版本,对外开放了80、22端口。
从客户那里了解到,网站的访问量并不大,所以带宽占用也不会太高,而耗尽100M的带宽是绝对不可能的,那么极有可能是服务器遭受了流量攻击,于是登录服务器做详细的检测。

[font=微软雅黑][size=4][b][color=Navy]2、初步分析[/b][/size][/font]
在电信人员的配合下通过交换机对该服务器的网络流量进行了检测,发现该主机确实存在对外80端口的扫描流量,于是登录系统通过“netstat –an”命令对系统开启的端口进行检查,可奇怪的是,没有发现任何与80端口相关的网络连接。接着使用“ps –ef”、“top”等命令也没有发现任何可疑的进程。于是怀疑系统是否被植入了[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]。
为了证明系统是否被植入了[url=http://baike.baidu.com/view/350343.htm]rootkit[/url],我们将网站服务器下的ps、top等命令与之前备份的同版本可信操作系统命令做了md5sum校验,结果发现网站服务器下的这两个命令确实被修改过,由此断定,此服务器已经被入侵并且安装了[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]级别的后门程序。

[font=微软雅黑][size=4][b][color=Navy]3、断网分析系统[/b][/size][/font]
由于服务器不停向外发包,因此,首先要做的就是将此服务器断开网络,然后分析系统日志,寻找攻击源。但是系统命令已经被替换掉了,如果继续在该系统上执行操作将变得不可信,这里可以通过两种方法来避免这种情况,第一种方法是将此服务器的硬盘取下来挂载到另外一台安全的主机上进行分析,另一种方式就是从一个同版本可信操作系统下拷贝所有命令到这个入侵服务器下某个路径,然后在执行命令的时候指定此命令的完整路径即可,这里采用第二种方法。
我们首先查看了系统的登录日志,查看是否有可疑登录信息,执行如下命令:
[code]more /var/log/secure |grep Accepted[/code]
通过对命令输出的查看,有一条日志引起了我们的怀疑:
[code]Oct 3 03:10:25 webserver sshd[20701]: Accepted password for mail from 62.17.163.186 port 53349 ssh2[/code]
这条日志显示在10月3号的凌晨3点10分,有个mail帐号从62.17.163.186这个IP成功登录了系统,mail是系统的内置帐号,默认情况下是无法执行登录操作的,而62.17.163.186这个IP,经过查证,是来自爱尔兰的一个地址。从mail帐号登录的时间来看,早于此网站服务器遭受攻击的时间。
接着查看一下系统密码文件/etc/shadow,又发现可疑信息:
[code]mail:$1$kCEd3yD6$W1evaY5BMPQIqfTwTVJiX1:15400:0:99999:7:::[/code]
很明显,mail帐号已经被设置了密码,并且被修改为可远程登录,之所以使用mail帐号,猜想可能是因为入侵者想留下一个隐蔽的帐号,以方便日后再次登录系统。
然后继续查看其他系统日志,如/var/log/messages、/var/log/wtmp均为空文件,可见,入侵者已经清理了系统日志文件,至于为何没有清空/var/log/secure文件,就不得而知了。

[font=微软雅黑][size=4][b][color=Navy]4、寻找攻击源[/b][/size][/font]
到目前为止,我们所知道的情况是,有个mail帐号曾经登录过系统,但是为何会导致此网站服务器持续对外发送数据包呢?必须要找到对应的攻击源,通过替换到此服务器上的ps命令查看系统目前运行的进程,又发现了新的可疑:
[code]nobody 22765 1 6 Sep29 ? 4-00:11:58 .t[/code]
这个.t程序么是什呢,继续执行top命令,结果如下:
[code]PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22765 nobody 15 0 1740m 1362m 1228 S 98.3 91.5 2892:19 .t[/code]
从输出可知,这个t程序已经运行了4天左右,运行这个程序的是nobody用户,并且这个t程序消耗了大量的内存和cpu,这也是之前客户反映的网站服务器异常缓慢的原因,从这个输出,我们得到了t程序的进程PID为22765,接下来根据PID查找下执行程序的路径在哪里:
进入内存目录,查看对应PID目录下exe文件的信息:
[code][root@webserver ~]# /mnt/bin/ls -al /proc/22765/exe
lrwxrwxrwx 1 root root 0 Sep 29 22:09 /proc/22765/exe -> /var/tmp/…/apa/t[/code]
这样就找到了进程对应的完整程序执行路径,这个路径很隐蔽,由于/var/tmp目录默认情况下任何用户可读性,而入侵者就是利用这个漏洞在/var/tmp目录下创建了一个“…”的目录,而在这个目录下隐藏着攻击的程序源,进入/var/tmp/…/目录,发现了一些列入侵者放置的[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]文件,列表如下:
[code][root@webserver …]#/mnt/bin/ls -al
drwxr-xr-x 2 nobody nobody 4096 Sep 29 22:09 apa
-rw-r–r– 1 nobody nobody 0 Sep 29 22:09 apa.tgz
drwxr-xr-x 2 nobody nobody 4096 Sep 29 22:09 caca
drwxr-xr-x 2 nobody nobody 4096 Sep 29 22:09 haha
-rw-r–r– 1 nobody nobody 0Sep 29 22:10 kk.tar.gz
-rwxr-xr-x 1 nobody nobody 0 Sep 29 22:10 login
-rw-r–r– 1 nobody nobody 0 Sep 29 22:10 login.tgz
-rwxr-xr-x 1 nobody nobody 0 Sep 29 22:10 z[/code]
通过对这些文件的分析,基本判断这就是我们要找的程序攻击源,其中:
1)、z程序是用来清除系统日志等相关信息的,例如执行:
[code]./z 62.17.163.186[/code]
这条命令执行后,系统中所有与62.17.163.186有关的日志将全部被清除掉。
2)、在apa目录下有个后门程序t,这个就是之前在系统中看到的,运行此程序后,此程序会自动去读apa目录下的ip这个文件,而ip这个文件记录了各种ip地址信息,猜想这个t程序应该是去扫描ip文件中记录的所有ip信息,进而获取远程主机的权限,可见这个网站服务器已经是入侵者的一个肉鸡了。
3)、haha目录里面放置的就是用来替换系统相关命令的程序,也就是这个目录下的程序使我们无法看到操作系统的异常情况。
4)、login程序就是用来替换系统登录程序的木马程序,此程序还可以记录登录帐号和密码。

[font=微软雅黑][size=4][b][color=Navy]5、查找攻击原因[/b][/size][/font]
到这里为止,服务器上遭受的攻击已经基本清晰了,但是入侵者是如何侵入这台服务器的呢?这个问题很重要,一定要找到入侵的根源,才能从根本上封堵漏洞。
为了弄清楚入侵者是如何进入服务器的,需要了解下此服务器的软件环境,这台服务器是一个基于java的web服务器,安装的软件有apache2.0.63、tomcat5.5,apache和tomcat之间通过mod_jk模块进行集成,apache对外开放80端口,由于tomcat没有对外开放端口,所以将问题集中到apache上面。
通过查看apache的配置发现,apache仅仅处理些静态资源请求,而网页也以静态页面居多,所以通过网页方式入侵系统可能性不大,既然漏洞可能来自于apache,那么尝试查看apache日志,也许能发现一些可疑的访问痕迹,通过查看access.log文件,发现了如下信息:
[code]62.17.163.186 – – [29/Sep/2013:22:17:06 +0800] “GET http://www.xxx.com/cgi-bin/awstats.pl?configdir=|echo;echo;ps+-aux%00 HTTP/1.0” 200 12333 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1) Gecko/20121010 Firefox/2.0”
62.17.163.186 – – [29/Sep/213:22:17:35 +0800] “GET http://www.xxx.com/cgi-bin/awstats.pl?configdir=|echo;echo;cd+/var/tmp/…/haha;ls+-a%00 HTTP/1.0” 200 1626 “-” “Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1) Gecko/20121010 Firefox/2.0″[/code]
至此,发现了漏洞的根源,原来是awstats.pl脚本中configdir的一个漏洞,通过了解此服务器的应用,客户确实是通过一个Awstats的开源插件来做网页访问统计,通过这个漏洞,攻击者可以直接在浏览器上操作服务器,例如查看进程、创建目录等。通过上面第二条日志可以看出,攻击者正常浏览器执行切换到/var/tmp/…/haha目录的操作。
这个脚本漏洞挺可怕的,不过在Awstats官网也早已给出了修补的方法,对于这个漏洞,修复方法很简单,打开awstats.pl文件,找到如下信息:
[code]if ($QueryString =~ /configdir=([^&]+)/i)
{
$DirConfig=&DecodeEncodedString(“$1”);
}[/code]
修改为如下即可:
[code]if ($QueryString =~ /configdir=([^&]+)/i)
{
$DirConfig=&DecodeEncodedString(“$1”);
$DirConfig=~tr/a-z0-9_\-\/\./a-z0-9_\-\/\./cd;
}[/code]

[font=微软雅黑][size=4][b][color=Navy]6、揭开谜团[/b][/size][/font]
通过上面逐步分析和介绍,此服务遭受入侵的原因和过程已经非常清楚了,大致过程如下:
[list=1]
[*]攻击者通过Awstats脚本awstats.pl文件的漏洞进入了系统,在/var/tmp目录下创建了隐藏目录,然后将[url=http://baike.baidu.com/view/350343.htm]rootkit[/url]后门文件传到这个路径下。
[*]攻击者通过植入后门程序,获取了系统超级用户权限,进而控制了这台服务器,通过这台服务器向外发包。
[*]攻击者的IP地址62.17.163.186可能是通过代理过来的,也可能是攻击者控制的其他肉鸡服务器。
[*]攻击者为了永久控制这台机器,修改了系统默认帐号mail的信息,将mail帐号变为可登录,并且设置了mail帐号的密码。
[*]攻击者在完成攻击后,通过后门程序自动清理了系统访问日志,毁灭了证据。
[/list]
通过对这个入侵过程的分析,发现入侵者的手段还是非常简单和普遍的,虽然入侵者删除了系统的一些日志,但是还是留下了很多可查的踪迹,其实还可以查看用户下的.bash_history文件,这个文件是用户操作命令的历史记录。

[font=微软雅黑][size=4][b][color=Navy]7、如何恢复网站[/b][/size][/font]
由于系统已经文件被更改和替换,此系统已经变得完全不可信,因此建议备份网站数据,重新安装系统,基本步骤如下:
[list=1]
[*]安装稳定版本的操作系统,删除系统默认的并且不需要的用户。
[*]系统登录方式改为公钥认证方式,避开密码认证的缺陷。
[*]安装更高版本的apache和最新稳定版本的Awstats程序。
[*]使用Linux下的Tcp_Wrappers防火墙,限制ssh登录的源地址。
[/list]
文章来源:[url=http://ixdba.blog.51cto.com/2895551/1431305]http://ixdba.blog.51cto.com/2895551/1431305[/url]

微信公众号:程序员到架构师

最新文章

Return Top