linux+mysql+apache+php+tomcat+resin安装步骤

OS:linux as 4.2
软件列表:
1
mysql-5.0.41-linux-i686.tar
http://www.mysql.com
2
httpd-2.0.58.tar
http://www.apache.org
3
php-5.2.3.tar
http://www.php.net
4
jdk-6u1-linux-i586
http://java.sun.com/javase/downloads/index.jsp
5
apache-tomcat-6.0.13.tar
http://tomcat.apache.org/download-60.cgi
6
tomcat与apache联接器
tomcat-connectors-1.2.23-src.tar.gz
http://tomcat.apache.org/download-connectors.cgi
7
resin
http://www.caucho.com
开始安装:
1安装mysql
tar zxvf mysql-5.0.41-linux-i686.tar.gz
[root@ns2 software]# cd mysql-5.0.41-linux-i686
[root@ns2 local]#groupadd mysql
[root@ns2 local]#useradd -g mysql mysql
[root@ns2 local]#mv mysql-5.0.41-linux-i686 /usr/local/mysql -f
[root@ns2 local]#cd /usr/local/mysql
[root@ns2 local]# chown -R mysql.mysql ./
[root@ns2 local]#scripts/mysql_install_db –user=mysql
[root@ns2 local]#chown -R root .
[root@ns2 local]#chown -R mysql data
[root@ns2 local]#chgrp -R mysql .
[root@ns2 local]#bin/mysqld_safe –user=mysql &
这样MySQL就已经启动了,下面为root用户设置密码:
[root@ns2 local]# ./bin/mysqladmin -u root password ‘password’
[root@ns2 local]# ./bin/mysqladmin -u root -h localhost.localdomain password ‘pass’
[root@ns2 local]# ./bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.   Commands end with ; or \g.
Your MySQL connection id is 5 to server version: 4.1.14-standard
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql>
[root@yangwenjun mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@yangwenjun mysql]# vi /etc/init.d/mysql
修改如下定义使其内容为:
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
[root@ns2 local]# chkconfig –level 345 mysql on
[root@ns2 local]# service mysql restart
Shutting down MySQL…                                  [   OK   ]
Starting MySQL                                                  [   OK   ]
[root@yangwenjun mysql]#
到这里MySQL就装好了。
2.安装apache
[root@localhost]#tar jxvf httpd-2.0.58.tar.bz2
[root@localhost]#cd httpd-2.0.58.tar.bz2
[root@localhost]#./configure –enable-MODULE=shared –enable-so –with-mpm=worker   -
-enable-rewrite=shared   –enable-proxy=shared
[root@localhost]#make
[root@localhost]#make install
[root@localhost]#/usr/local/apache2/bin/apachectl start
http://127.0.0.1/
打开测试页面
3安装php
[root@localhost]#tar jxvf php-5.2.3.tar.bz2
[root@localhost]#cd php-5.3.3
[root@localhost]#./configure –prefix=/usr/local/php –with-mysql=/usr/local/mysql -
-with-apxs2=/usr/local/apache2/bin/apxs
[root@localhost]#make
[root@localhost]#make install
在make install 后出现的提示信息中,提示执行如下操作.
[root@localhost software]# libtool –finish /root/software/php-5.2.3/libs
chmod 755 /usr/local/apache2/modules/libphp5.so
[root@localhost software]# cp php.ini-dist /usr/local/lib/php.ini
[root@localhost software]# vi /usr/local/apache2/conf/httpd.conf
#系统自动添加了这一行,如果没有则自己加入这一行。
LoadModule php5_module        modules/libphp5.so
在AddType application/x-tar .tgz
下加一行
AddType application/x-httpd-php .php
AddType application/x-httpd-php .php3
创建测试页[root@localhost software]# echo ” “   >>  
/usr/local/apache2/htdocs/test.php
访问
http://127.0.0.1/test.php
应该出php相关信息。
4安装jdk
[root@localhost local]#cd /usr/local
[root@localhost local]#./jdk-6u1-linux-i586.bin
[root@localhost local]# rm jdk-6u1-linux-i586.bin -rf
[root@localhost local]# ln -s jdk1.6.0_01/ jdk
设置环境变量
[root@localhost local]#vi /etc/profile
在下面添加如下内容:
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH:$JAVA_HOME/jre/bin
export CLASSPATH=.:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:$CLASSPATH
[root@localhost local]#source /etc/profile
[root@localhost ~]# java -version
java version “1.6.0_01″
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
看到上面信息jdk安装成功。
5安装
apache-tomcat-6.0.13.tar
[root@localhost bin]# tar zxvf apache-tomcat-6.0.13.tar.gz
[root@localhost bin]# mv apache-tomcat-6.0.13 /usr/local/
[root@localhost bin]# /usr/local/apache-tomcat-6.0.13/startup.sh
访问
http://ip:8080/
看能否看到tomcat的默认页面,如能看到说明tomcat已经在服务了.
停止tomcat服务:
[root@localhost bin]#/usr/local/apache-tomcat-6.0.13/shutdown.sh

6安装
tomcat-connectors-1.2.23-src.tar.gz
[root@localhost conf]#tar zxvf tomcat-connectors-1.2.23-src.tar.gz
[root@localhost conf]#cd tomcat-connectors-1.2.23-src/native/
[root@localhost conf]#./configure –with-apxs=/usr/local/apache2/bin/apxs
[root@localhost conf]#make
[root@localhost conf]#cp ./apache-2.0/mod_jk.so /usr/local/apache2/modules
修改httpd.conf
添加下面两行:
LoadModule jk_module modules/mod_jk.so
Include conf/mod_jk.conf
创建mod_jk.conf在/usr/local/apache2/conf里面
[root@localhost conf]# more mod_jk.conf
JkWorkersFile conf/workers2.properties
JkLogFile logs/mod_jk.log
JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”
JkRequestLogFormat “%w %V %T”
JkLogLevel error
JkMount /app/* worker1
JkMount /* worker1
JkMount /webapp/* worker1
通过JKMount控制哪些目录下,哪些类型文件邮件tomcat处理,也可用之样的方式:
JkMount /* worker1 所有请求交给tomcat
JkUnMount /images*/*.gif worker1 哪些文件不交给tomcat处理,而交给apache处理,因为
apache处理表静态或图片更好一些。
创建workers2.properties在/usr/local/apache2/conf里面
worker.list=worker1,worker2
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
#worker.worker2.host=10.10.1.66
#worker.worker2.port=8009
#worker.worker2.type=ajp13
根据上面配置访问
http://127.0.0.1
会自动请求tomcat页面了。
7安装resin
[root@localhost software]# tar zxvf resin-3.1.1.tar.gz
[root@localhost software]# cd resin-3.1.1
[root@localhost resin-3.1.1]# ./configure –with-apxs=/usr/local/apache2/bin/apxs
[root@localhost resin-3.1.1]# make
[root@localhost resin-3.1.1]# make install
[root@localhost resin-3.1.1]#vi /usr/local/apache2/conf/httpd.conf
配置文件中会有如下内容
LoadModule caucho_module /usr/local/apache2/modules/mod_caucho.so
ResinConfigServer localhost 6800
CauchoConfigCacheDirectory /tmp
CauchoStatus yes
启动resin
[root@localhost lib]# java -jar /resin/lib/resin.jar
后台resin
[root@localhost lib]# java -jar /resin/lib/resin.jar start
[root@localhost lib]# java -jar /resin/lib/resin.jar stop
把resin的web目录指向和apache的根目录一样。
vi /resin/conf/resin.conf
在/usr/local/apache2/htdocs目录下创建index.jsp页面。
   center>Now time is:
http://192.168.0.127/index.jsp
如果看到时间说明resin工作了。
http://192.168.0.127/index.php
同样也可以看到php信息。
解释说明一下,resin3.1版已经提供php解析的支持了。所以,可以看到php页面。所以说,你想
用php5解析,那就需要关闭resin3.1解析php功能,由于我们现在没有找到关闭的方法,所以,我
又再次安装一下resin3.0版,这样在resin关闭的情况下,同样可以请求到php页,和静态页面。
resin3.0.22安装方法:
[root@localhost software]# tar zxvf resin-3.0.22.tar.gz
[root@localhost resin-3.0.22]# ./configure –with-apxs=/usr/local/apache2/bin/apxs
[root@localhost resin-3.0.22]# make && make
启动
[root@localhost resin-3.0.22]# ./bin/httpd.sh start
http://192.168.0.127:8080
应该可以看到resin页面,说明resin安装成功
停止
[root@localhost resin-3.0.22]# ./bin/httpd.sh stop
开始进行和apache的整合
查看此目录下面是否有mod_caucho.so这个模块
[root@localhost resin-3.0.22]# ls /usr/local/apache2/modules/
添加如内容到http.conf中
LoadModule caucho_module /usr/local/apache2/modules/mod_caucho.so
ResinConfigServer localhost 6802
SetHandler caucho-status
重新启动apache /usr/local/apache2/bin/apachectl restart
启动resin       
http://192.168.0.127/caucho-status
http://192.168.0.127/index.jsp
http://192.168.0.127/index.php
参考:
http://tea4.org/20070328/697131/
http://www.cublog.cn/u/12505/showart_158603.html

调试(jsp):
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带
的的目录
2.在webapps目录下新建一个目录,起名叫myapp.
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的.
4.WEB-INF下新建一个文件web.xml,内容如下:
My Web Application
A application for test.

5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:
Now time is:
7.打开浏览器,输入
http://localhost:8080/myapp/index.jsp
看到当前时间的话说明就成功了.
原文网址
http://www.huoho.com/edu/webdev/jsp/jdk60htomc3717/

架设整合后的虚拟主机

[root@yangwenjun conf]# vi /home/www/apache/conf/httpd.conf
在httpd.conf文档末尾虚拟主机设置处加入以下内容:
NameVirtualHost *:80
Documentroot /home/www/apache/htdocs
DocumentRoot /home/bruce/test1
ServerName test1.yangwenjun.com
       DocumentRoot /home/bruce/test2
ServerName test2.yangwenjun.com
[root@yangwenjun conf]# vi /home/www/tomcat/conf/server.xml
在server.xml文档的……中间添加两段……

ucenter应用之间cookietime不能传送问题解决

四 23rd, 2010 | Filed under 开源技术, 系统架构及硬件

   前段时间在应用uchome、discuz、cyask等进行二次开发时遇到了在关闭浏览器时不能同步退出的问题,即ucenter默认是在同步登陆的时候其他的应用的cookie保存时间是315600,所以当一个应用没有勾选直接登陆的时候,该应用在浏览器关闭的时候退出了,但是其他的还是仍旧没有退出。以下是个人的一些解决办法:

第一步:cookietime的传送

        先在配置文件里注册一个全局变量,用来保存cookietime,然后找到你所需要传送cookietime的应用目录下的uc_client的client.php文件,找到uc_user_synlogin函数,默认是

function uc_user_synlogin($uid) {
     $uid = intval($uid);
      $return = uc_api_post(‘user’, ’synlogin’, array(‘uid’=>$uid));
     return $return;
}修改为

function uc_user_synlogin($uid) {
      require_once ‘./include/common.inc.php’;
      global $_CGLOBAL;
      $uid = intval($uid);
      $cookietime = $_CGLOBAL['cookietime'];
      $return = uc_api_post(‘user’, ’synlogin’, array(‘uid’=>$uid,’cookietime’=>$cookietime));
      return $return;
}

第二步:中转接受cookietime

       ucenter我们可以把他当成是中转站的功能,接受一个应用的数据,然后同步到各个应用当中。所以接下来找到ucenter/control目录下面user.php,注意不是应用的目录下面的user.php文件。找到onsynlogin函数。即:

function onsynlogin() {
      $this->init_input();
      $uid = $this->input(‘uid’);
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = ”;
                  foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= ‘<script type=”text/javascript” src=”‘.$app['url'].’/api/uc.php?time=’.$this-                              >time.’&code=’.urlencode($this->authcode(‘action=synlogin&username=’.$this-         >user['username'].’&uid=’.$this->user['uid'].’&password=’.$this->user['password'].”&time=”.$this->time, ‘ENCODE’, $app['authkey'])).’” reload=”1″></script>’;
                        }
                  }
                  return $synstr;
            }
      }
      return ”;
}
修改成

function onsynlogin() {
      $this->init_input();
      $uid = $this->input(‘uid’);
      $cookietime = $this->input(‘cookietime’);
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = ”;
                   foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= ‘<script type=”text/javascript” src=”‘.$app['url'].’/api/uc.php?time=’.$this->time.’&code=’.urlencode($this->authcode(‘action=synlogin&username=’.$this->user['username'].’&uid=’.$this->user['uid'].’&cookietime=’.$cookietime.’&password=’.$this->user['password'].”&time=”.$this->time, ‘ENCODE’, $app['authkey'])).’” reload=”1″></script>’;
                        }
                  }
                  return $synstr;
            }
       }
      return ”;
}
第三步:其他应用接受cookietime:

找到各个应用目录下面的api/uc.php文件,找到里面的function synlogin($get, $post)函数,将里面的cookietime定义变为$cookietime = $get['cookietime'];就可以了

这样一来就完成了$cookietime的在各应用之间的传递

Linux下挂载U盘和移动硬盘

四 22nd, 2010 | Filed under Linux相关

第一篇:

一 、手动挂载

1.在插入U盘或硬盘之前,在命令行窗口运行:fdisk -l 命令,系统将显示目前所能识别到的硬件存储设备;
内容如:
sda
sda1
sda2
sdb
sdb1
sdb2
等信息,其中,sda与sdb表示目前系统有两个硬盘,后面带有数字表示各个硬盘下的各区目录;
硬盘或存储设备一般都是以sd开头.

2.插入U盘或硬盘,再次运行fdisk -l 命令,系统将再次显示目前所能识别到的硬件存储设备,比较两次输出的不各,将发现第二次运行时会增加一些内容;
系统将在原来的基础上增加显示:sdc,等内容,表示新插入的U盘或移动硬盘是挂靠在系统的sdc下.

3.运行mount,如:
#mkdir /mnt/usb
#mount /dev/sdc /mnt/usb

4.运行完毕,可以直接在/mnt/usb目录下对U盘或移动硬盘的数据进行访问或操作;

5.想断开U盘或移动硬盘之前,运行umount命令,保证数据不会造成丢失,命令如下:
#umount /dev/sdc

6. 对于有中文文件名的盘,需要增加一些选项,例如:如果是ntfs格式硬盘,utf8的文件名

挂载命令就是: #mount -t ntfs -o nls=utf8 /dev/sdc1 /mnt/usb

如果是FAT32格式的,可能就是 #mount -t vfat -o codepage=936,iocharset=cp936 /dev/sdc2 /mnt/winc

或者  #mount -t vfat -o codepage=936,iocharset=utf8 /dev/sdc2 /mnt/winc

其他一些命令:

       软盘 # mount -t msdos /dev/fd0 /mnt/floppy
光盘 # mount -t iso9660 /dev/cdrom /mnt/cdrom

二 、自动挂载
  每次开机访问windows分区都要运行mount命令显然太烦琐,为什么访问其他的linux分区不用使用mount命令呢?
其实,每次开机时,linux自动将需要挂载的linux分区挂载上了。那么我们是不是可以设定让linux在启动的时候也挂载我们希望挂载的分区,如windows分区,以实现文件系统的自动挂载呢?
这是完全可以的。在/etc目录下有个fstab文件,它里面列出了linux开机时自动挂载的文件系统的列表。我的/etc/fstab文件如下:
/dev/hda2 / ext3 defaults 1 1
/dev/hda1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
在/etc/fstab文件里,第一列是挂载的文件系统的设备名,第二列是挂载点,第三列是挂载的文件系统类型,第四列是挂载的选项,选项间用逗号分隔。第五六列不知道是什么意思,还望高手指点。
在最后两行是我手工添加的windows下的C;D盘,加了codepage=936和iocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:
rw 以可读写模式挂载
suid 开启用户ID和群组ID设置位
dev 可解读文件系统上的字符或区块设备
exec 可执行二进制文件
auto 自动挂载
nouser 使一般用户无法挂载

async 以非同步方式执行文件系统的输入输出操作
大家可以看到在这个列表里,光驱和软驱是不自动挂载的,参数设置为noauto。(如果你非要设成自动挂载,你要确保每次开机时你的光驱和软驱里都要有盘,呵呵。)

=========附录:以读写方式挂载ntfs分区============
通常ntfs分区挂载上也是只读的,不能写入。不过现在有了新的第三方ntfs驱动,
以Debian为例:
系统:Debian 4.0r2
使用软件:ntfs-3g
1.修改默认源
将/etc/apt/sources.list中etch 修改为deb http://XXXX/debian testing main contrib non-free
执行命令:

apt-get update

2.执行安装
执行命令:

apt-get install ntfs-3g

3.使用    

直接使用执行命令:

mount -t ntfs-3g -o force /dev/hdax /mnt/windows
这里的/dev/hdax 请改为你自己的windows磁盘分区,可利用fdisk -l 查看。

如果是加入开机自动映射的话,编辑/etc/fstab,加入如下内容就可以了。

/dev/hdax /mnt/windows ntfs-3g defaults 0 0

第二篇:

USB接口的移动硬盘是被当作SCSI设备对待的。

一、插入移动硬盘之前应该先用# fdisk -l看硬盘信息

移动硬盘应该是/dev/sdb*,硬盘是/dev/sda*

二、在/mnt下建目录挂载点,如下:

# mkdir -p /mnt/usbhd1

# mkdir -p /mnt/usbhd2

三、挂载

# mount -t vfat /dev/sdb1 /mnt/usbhd1

# mount -t vfat /dev/sdb5 /mnt/usbhd2

对ntfs格式的移动存储磁盘分区应用 -t ntfs ,对fat格式的移动存储磁盘分区应用 -t vfat

如果遇到汉字显示为乱码,用下面命令:

# mount -t vfat -o iocharset=cp936 /dev/sdb1 /mnt/usbhd1

# mount -t vfat -o iocharset=cp936 /dev/sdb5 /mnt/usbhd2

四、若不用时卸载,用如下命令:

#umount /mnt/usbhd1
#umount /mnt/usbhd2

全面讲述Linux端口安全的处理

四 22nd, 2010 | Filed under Linux相关, 系统架构及硬件

Linux系统安全是有很多方面来保证的,这里主要介绍Linux端口安全的知识,这里涉及有关Linux端口的设置,这里有些东西是从网上总结出来的,现在拿出来跟大家分享一下。这里一般要注意主机的包漏洞修补,放火墙的设置,关闭危险服务(端口)以及每日的日志分析.

什么是端口

一台主机的端口可以分为监听端口与随机取用的高级端口.所谓监听端口就是主机开启了哪些服务,那么这个服务会在Linux系统里启用一个端口来监听客户端的请求.例如FTP服务器,就会开放21号端口,这个端口会一直启用,直到FTP服务关闭为止.所谓随机取用的高级端口就是Linux要向某个主机请求服务时,Linux主机需要启用一个端口来对外连接,那么端口号是多少?Linux会随机取用一个未被使用且端口号大于1024的端口进行连接.

所以server/Client之间的数据传送其实就是端口与端口之间的传送.

总共有多少端口,哪些是保留端口
 
端口编号是由1-65535组成,所以会有65535个端口.一般而言,只有root才可以开启1-1023一内的端口,这些端口就是特殊抟口,用于保留给系统使用.至于大于1024的端口,除了给系统随机取用作为连接需求之外,也可以用来服务的监听之用.

如果1-1023的端口的程序被入侵,那将表示入侵者拥有root的权限,是因为只有root才可以开启1-1023一内的端口.这个时候就要注意主机的安全了.

在Linux中保留端口与它所对应的服务其实已经有了一个对照表,那就是/etc/services文件,可以使用netstat -n以数值方式显示连接状态,使用netatst -tl可以显示当前正在监听的服务名称. /etc/services文件也是某些端口启动时设置端口的重要依据.

要了解所谓的端口与服务对于安全的关系:真正影响面安全的并不是端口,而是启动端口的服务.

所以真正的危害是某些不安全的服务而不是开放的端口.基本上,如果没有必要,就关掉一些用不到的端口,而且服务的版本要持续更新.

如何查看端口

1.需要知道主机当前开了多少端口?

2.了解服务跟端口对应的文件是那一个?/etc/services

介绍查看主机端口最常用的命令:

netstat:在本机上检查自己的程序检测端口,没有危险

nmap:在本机上以特殊的检测程序检测自己,可能会违法

关闭或启动一个端口

要开或关闭一个端口,只需要开启或关闭一个服务即可.所以,当检测完端口后,接下来就是要找出端口所对应的服务,将该服务关掉,就会把端口关掉.

设置开机时启动服务的方法

如果以文字方式登录,文字界面的run-level为3,所以就在/etc/rc.d/rc3.d里可以找到服务的启动参数,就是以S开头的文件.如果不要启动一些服务,就将服务对应的文件(以S开头的文件)删除即可.

一般情况下不需要手工删除文件,Linux一般为我们提供了程序可以完成:

ntsysv

setup

是不是要将所有的Linux默认的服务关闭?因为系统有很多服务是一定要启动的,否则反而变的不安全.

以下列出一些完全没有对外开放端口,但却是系统必须的服务,这些服务不要关闭.
atd:在例行命令里提到的,只执行一次的预约执行任务,务必启动
cron:在例行命令里提到的,循环执行的命令,务必启动
iptables:防火墙,无论如何,先启动它
keytables:设置键盘上的字母格式,当然需要读入,否则如何控制
network:网络功能
random:快速使系统在随即时间内保存到映象文件,对系统相当重要,因为在开机之后,系统回迅速回复到关机之前的状态
syslog:在系统日志文件提过,是相当重要的文件,务必启动
xinetd:服务器面理器super deamon,是必须启动的服务之一
xfs:如果使用run-level的图形界面,这个必须启动

关闭所有对外开放的端口
 
在装完Linux后,就要将不必要的程序或服务关闭,最重要的是将对外开放的端口先关闭,需要的时候在开启.如果要假设服务器,可以逐个开启这些端口.

1.使用ntsysv设置开机时启动哪些服务

一般只选择:atd,cron,iptables,keytables,network,random,syslog,xinetd,xfs(如有图形界面)

2.重新启动

reboot

3.查看当前开启了多少端口

netstat -an

这里就说明了Linux端口安全的所有相关知识。

全面介绍Linux重要安全命令(一)

Linux重要安全命令这里介绍三个命令passwd、su和umask这三个命令。对于系统管理员一定要熟悉这些有关Linux安全命令。现在我们就开始这个系列的文章,以期待会对您产生一些有意义帮助。

一、passwd

1.作用

asswd命令原来修改账户的登陆密码,使用权限是所有用户。

2.格式

asswd [选项] 账户名称

3.主要参数

-l:锁定已经命名的账户名称,只有具备超级用户权限的使用者方可使用。

-u:解开账户锁定状态,只有具备超级用户权限的使用者方可使用。

-x, –maximum=DAYS:最大密码使用时间(天),只有具备超级用户权限的使用者方可使用。

-n, –minimum=DAYS:最小密码使用时间(天),只有具备超级用户权限的使用者方可使用。

-d:删除使用者的密码, 只有具备超级用户权限的使用者方可使用。

-S:检查指定使用者的密码认证种类, 只有具备超级用户权限的使用者方可使用。

4.应用实例
$ passwd
Changing password for user cao.
Changing password for cao
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
从上面可以看到,使用passwd命令需要输入旧的密码,然后再输入两次新密码。

二、su

1.作用

su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。

2.格式

su [选项]… [-] [USER [ARG]…]

3.主要参数

-f , –fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。

-l , –login:加了这个参数之后,就好像是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定USER,缺省情况是root。

-m, -p ,–preserve-environment:执行su时不改变环境变数。

-c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。

USER:欲变更的使用者账号,ARG传入新的Shell参数。

4.应用实例

变更账号为超级用户,并在执行df命令后还原使用者。  
su -c df root

三、umask

1.作用

umask设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入profile文件,就可控制该用户后续所建文件的存取许可。它告诉系统在创建文件时不给谁存取许可。使用权限是所有用户。

2.格式

umask [-p] [-S] [mode]

3.参数

-S:确定当前的umask设置。

-p:修改umask 设置。

[mode]:修改数值。

4.说明

传统Unix的umask值是022,这样就可以防止同属于该组的其它用户及别的组的用户修改该用户的文件。既然每个用户都拥有并属于一个自己的私有组,那么这种“组保护模式”就不在需要了。严密的权限设定构成了Linux安全的基础,在权限上犯错误是致命的。需要注意的是,umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程以外的所有进程的读写权限,表示为-rw——-。在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的umask权限都可以被正确设定。

5.应用实例
umask -S
u=rwx,g=rx,o=rx
umask -p 177
umask -S
u=rw,g=,o=

上述5行命令,首先显示当前状态,然后把umask值改为177,结果只有文件所有者具有读写文件的权限,其它用户不能访问该文件。这显然是一种非常安全的设置。

Linux重要安全命令这个系列第一讲我们就介绍到这里。

解决Linux ssh后门问题

Linux ssh后门问题关系到系统的安全,作为Linux系统管理员应该及时解决这一问题,这里先介绍一下这个Linux ssh后门问题,然后具体来说明一下这个问题的解决方法,以帮助管理员处理这一Linux ssh后门。

有很多次,我所在的站点需要某人的远程支持,而他却被公司防火强阻挡在外。很少有人意识到,如果能通过防火墙到达外部,那么也能轻松实现让外部的信息进来。从本意讲,这称为 “在防火墙上砸一个洞”。我称之为 SSH 后门。为了使用它,必须有一台作为中介的连接到 Internet 的机器。在本例中,将这样台机器称为 blackbox.example.com。公司防火墙后面的机器称为 ginger。此技术支持的机器称为 tech。下图解释了设置过程。

图:在防火墙上砸一个洞

以下是操作步骤:

1.检查什么是允许做的,但要确保您问对了人。大多数人都担心您打开了防火墙,但他们不明白这是完全加密的。而且,必须破解外部机器才能进入公司内部。不过,您可能属于 “敢作敢为” 型的人物。自己进行判断应该选择的方式,但不如意时不抱怨别人。

2.使用 -R 标记通过 SSH 从 ginger 连接到 blackbox.example.com。假设您是 ginger 上的根用户,tech 需要根用户 ID 来帮助使用系统。使用 -R 标记将 blackbox 上端口 2222 的说明转发到 ginger 的端口 22 上。这就设置了 SSH 通道。注意,只有 SSH 通信可以进入 ginger:您不会将 ginger 放在无保护的 Internet 上。
可以使用以下语法实现此操作:

~# ssh -R 2222:localhost:22 thedude@blackbox.example.com

进入 blackbox 后,只需一直保持登录状态。我总是输入以下命令:

thedude@blackbox:~$ while [ 1 ]; do date; sleep 300; done

使机器保持忙碌状态。然后最小化窗口。

3.现在指示 tech 上的朋友使用 SSH 连接到 blackbox,而不需要使用任何特殊的 SSH 标记。但必须把密码给他们:

root@tech:~# ssh thedude@blackbox.example.com .

4.tech 位于 blackbox 上后,可以使用以下命令从 SSH 连接到 ginger:

thedude@blackbox:~$: ssh -p 2222 root@localhost

5.Tech 将提示输入密码。应该输入 ginger 的根密码。

6.现在您和来自 tech 的支持可以一起工作并解决问题。甚至需要一起使用屏幕!

以上就是解决Linux ssh后门问题的详细步骤。

介绍一种Linux启动引导加密

Linux启动引导加密是提高Linux安全性的一种措施,这里以RedHat Linux为例来进行Linux启动引导加密的设置,实验是提高我们技术的一种手段,我们一定要亲手试一试这种方法,完成技术的学习。

让linux启动引导加密方法
#vi /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#  all kernel and initrd paths are relative to /boot/, eg.
#  root (hd0,0)
#  kernel /vmlinuz-version ro root=/dev/sda2
#  initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-3)
password 12345678
root (hd0,0)
kernel /vmlinuz-2.4.18-3 ro root=/dev/sda2
initrd /initrd-2.4.18-3.img
~
~
“/boot/grub/grub.conf” 17L, 569C written
[root@localhost root]# reboot

现以上提示输入:12345678

系统才可以引导

注意:远程勿试!

以密文方式

[root@localhost root]# grub-md5-crypt
Password:
$1$jQORq$BbVuVrnQ60b87FlXP/aau/
[root@localhost root]# vi /boot/grub/grub.conf

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#  all kernel and initrd paths are relative to /boot/, eg.
#  root (hd0,0)
#  kernel /vmlinuz-version ro root=/dev/sda2
#  initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-3)
password –md5 $1$jQORq$BbVuVrnQ60b87FlXP/aau/
root (hd0,0)
kernel /vmlinuz-2.4.18-3 ro root=/dev/sda2
initrd /initrd-2.4.18-3.img
~
~
“/boot/grub/grub.conf” 17L, 598C written
[root@localhost root]# reboot

这里就进行了Linux启动引导加密的设置。

全面解析Linux时钟

Linux时钟和windows时钟有着本质大区别,从概念的分类、使用到设置都与这明显的区别,搞清楚Linux时钟对初学Linux和我们使用Linux服务器有着质的帮助,希望这篇文章能够达到编写的目的。

Linux时钟分类

Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“Standard BIOS Feture”项中进行设置。

既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。

设置Linux时钟

在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用x86硬件体系,所以可以视这两个命令为一个命令来学习。

1.在虚拟终端中使用date命令来查看和设置系统时间
查看系统时钟的操作:
# date

设置系统时钟的操作:
# date 091713272003.30

通用的设置格式:
# date 月日时分年.秒

2.使用hwclock或clock命令查看和设置硬件时钟
查看硬件时钟的操作:
# hwclock –show 或
# clock –show
2003年09月17日 星期三 13时24分11秒 -0.482735 seconds

设置硬件时钟的操作:
# hwclock –set –date=”09/17/2003 13:26:00″

或者
# clock –set –date=”09/17/2003 13:26:00″

通用的设置格式:hwclock/clock –set –date=“月/日/年 时:分:秒”。

3.同步系统时钟和硬件时钟

Linux系统(笔者使用的是Red Hat 8.0,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时钟和硬件时钟。

硬件时钟与系统时钟同步:
# hwclock –hctosys

或者
# clock –hctosys

上面命令中,–hctosys表示Hardware Clock to SYStem clock。

系统时钟和硬件时钟同步:
# hwclock –systohc

或者
# clock –systohc

使用图形化系统设置工具设置时间

对于初学者来,笔者推荐使用图形化的时钟设置工具,如Red Hat 8.0中的日期与时间设置工具,可以在虚拟终端中键“redhat-config-time”命令,或者选择“K选单/系统设置/日期与时间”来启动日期时间设置工具。使用该工具不必考虑系统时间和硬件时间,只需从该对话框中设置日期时间,可同时设置、修改系统时钟和硬件时钟。

Internet同步时钟设置

在Windows XP日期与时间设置中有一项与Internet同步的功能,有了这项功能只要上网便可得到十分准确的时间。Red Hat 8.0也提供了这样的功能,在日期与时间设置工具对话框中的下部,有一个“启用网络时间协议”的选项,将该项选中就可以使用网络时间协议来同步Linux时钟。选中该项后,其下面的服务器下拉列表框就变为可用状态,可从中选择一个时间服务器作为远程时间服务器。然后单击确定按钮,便可连接所设定的时间服务器,并与之同步时间。

详细解析Linux密码破解问题

大家都说Linux系统安全性比较高但是并不是说无懈可击,Linux密码破解是一种特殊的做法来完成这一目的的。现在这里是解决Redhat Linux的一个问题,在其他发行版本上还没做实验。有兴趣可以试一试这个Linux密码破解方法。

linux安装完毕后会有一个root用户。那么如何在不知道密码的情况下修改掉root用户的密码呢?

本系统使用RedHat Linux 安装环境是vmware 6.0 使用GRUB引导。

方法如下:

1.在grub引导界面中按“e”进入grub的编辑模式。

2.编辑模式下选择第二项,即:“kernel /vmlinuz-2.4.20-8 ro root=LABEL=/”。然后再按“e”编辑此项。

3.在后面加上“ single”(注意:前面有一个空格)。然后回车,再按“b”这样就启动了linux的单用户模式。

4.由于是单用户模式,所以不需要密码。启动完毕后,在提示符下(注意这时提示符是sh-2.05b#之类的,不是以前的提示符了)输入:“passwd root”(passwd是修改用户密码的命令。)。然后根据提示修改密码就可以了。(有时会提示bad password,没有关系的。主要是设置的密码过于简单或者是常见的单词的原因。)

5.重启,正常进入。OK,root密码被修改了。

我们就完成了Linux密码破解的工作。

全面总结查看Linux全部硬件信息

Linux全部硬件信息是我们使用这一系统时关注的一个重点,这里介绍产看CPU、内存大小、硬盘、网卡等等。Linux全部硬件信息查看要注意每个命令后面所跟的参数,参数不同效果不同。

1、如何查看CPU类型以及相关特性?

方法一:
Linux下CPU相关的参数保存在 /proc/cpuinfo 文件里,
查看文件内容,即可知道CPU相关的技术参数。

方法二:
采用命令 dmesg | grep CPU 可以查看到相关CPU的启动信息

查看CPU的位数可以这样 getconf LONG_BIT,不是32位就是64位了:)

2、如何查看内存大小以及使用情况?

方法一:
直接查看 /proc/meminfo 文件

方法二:
使用 free -m 命令查看,如下:

[root@miix proc]# free -m
total used free  shared buffers  cached
Mem:  748  738 9 0  121  304
-/+ buffers/cache:  313  435
Swap: 768 0  768

可以看到总内存为748M,使用了738M,空闲9M,交换空间768M还没使用。
其实我的物理内存是768M的,一些内存和显卡共享了。

方法三:
使用 top 命令也可以看到实时的内存使用情况。

3、如何查看硬盘型号以及相关参数?

方法一:
fdisk -l 可以看到系统上的磁盘(包括U盘)的分区以及大小相关信息。

方法二:
直接查看 /proc/partitions 文件。

方法三:
通过命令 hdparm -i /dev/hda 获取硬盘详细物理参数

4、如何查看网卡相关信息?

方法一:
ethtool eth0 采用此命令可以查看到网卡相关的技术指标
(本人测试过不一定所有网卡都支持此命令)

ethtool -i eth1 加上 -i 参数查看网卡驱动
可以尝试其它参数查看网卡相关技术参数

方法二:
也可以通过 dmesg | grep eth0 等看到网卡名字(厂家)等信息

通过查看 /etc/sysconfig/network-.s/ifcfg-eth0
可以看到当前的网卡配置包括IP、网关地址等信息。
当然也可以通过ifconfig命令查看。

5、如何查看USB设备相关信息?

方法一:
其实通过 fdisk -l 命令可以查看到接入的U盘信息,本人的U盘信息如下:

Disk /dev/sda: 2012 MB, 2012217344 bytes
16 heads, 32 sectors/track, 7676 cylinders
Units = cylinders of 512 * 512 = 262144 bytes

Device BootStartEndBlocksId  System
/dev/sda1* 16  7676  1961024 b  W95 FAT32

U盘的设备文件是 /dev/sda,2G大小,FAT32格式。

如果用户登陆的不是Linux图形界面,U盘不会自动挂载上来。
此时可以通过手工挂载(mount):
mount /dev/sda1 mount_point
以上命令将U盘挂载到当前目录的 mount_point 目录,注意挂的是 sda1 不是 sda。
卸载命令是 umount mount_point

Linux默认没有自带支持NTFS格式磁盘的驱动,但对FAT32支持良好,挂载的时候一般不需要 -t vfat 参数 。
如果支持ntfs,对ntfs格式的磁盘分区应使用 -t ntfs 参数。
如果出现乱码情况,可以考虑用 -o iocharset=字符集 参数。

可以通过 lsusb 命令查看 USB 设备信息哦:

[root@miix tmp]# lsusb
Bus 001 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 004 Device 002: ID 0951:1613 Kingston Technology
Bus 004 Device 001: ID 0000:0000

6、如何查看光盘相关信息?

方法一:
插入CD光碟后,在本人的RHEL5系统里,光碟文件是 /dev/cdrom,
因此只需 mount /dev/cdrom mount_point 即可。

[root@miix tmp]# mount /dev/cdrom mount_point
mount: block device /dev/cdrom is write-protected, mounting read-only

其实仔细看一下,光驱的设备文件是 hdc

[root@miix tmp]# ls -l /dev/cdrom*
lrwxrwxrwx 1 root root 3 01-08 08:54 /dev/cdrom -> hdc
lrwxrwxrwx 1 root root 3 01-08 08:54 /dev/cdrom-hdc -> hdc

因此我们也可以这样 mount /dev/hdc mount_point
如果光驱里没放入有效光盘,则报错:

[root@miix tmp]# mount /dev/hdc mount_point
mount: 找不到介质

7、如何挂载ISO文件?

方法:
mount -o loop *.iso mount_point

8、如何查看主板信息?

使用命令 lspci 即可

详细解析Linux目录结构

Linux目录结构是和windows有大不同的设计,这很容易让初学者搞不明白,这里是个人总结的一些知识点,讲解Linux目录结构包括文件类型和一些重要的文件子目录。

linux文件系统的最顶端是/,称为linux的root,所有的目录、文件、设备都在/之下。

文件类型

linux有四种基本文件系统类型:普通文件、目录文件、连续文件和特殊文件。可以用file命令来识别。
普通文件:如文本文件、c语言源代码、shell脚本等,可以用cat、less、more、vi等来察看内容,用mv来改名。
目录文件:包括文件名、子目录名及其指针。可以用ls列出目录文件
链接文件:是指向一索引节点的那些目录条目,用ls来查看时,链接文件的标志用l开头,而文件后以”->”指向所链接的文件
特殊文件:如磁盘、终端、打印机等都在文件系统中表示出来,常放在/etc目录内。例如:软驱A称为/dev/fd0,/dev/had来自第一硬盘。
/bin:存放系统所需要的那些命令,比如ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的、普通用户可以使用的命令。
/boot:这是Linux的内核及引导系统程序所需要的文件目录,比如initrd.img等文件都位于这个目录中,grub系统引导管理器也位于这个目录。
/dev:设备文件存储目录,比如声卡、磁盘。
/etc:系统配置文件的所在,一些服务器的配置文件也在这里;比如用户帐号及密码配置文件。
/home:普通用户目录默认存放目录。
/lib:库文件存放目录
/lost+found:当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck公交会检查这里,并修复已经损坏的文件系统。
/mnt:这个目录是用于存放挂载储存设备的挂载目录的。比如有cdrom等目录。/etc/fatab
/opt:表示的是可选择的意思,有些软件包也会被安装在这里,也就是自定义软件包。
/proc:操作系统运行时,进程信息及内核信息存放在这里。proc并不是真正的文件系统,它的定义可以参见/etc/fstab
/root:linux超级权限用户root的目录。
/sbin:大多是涉及系统管理的命令的存放,是超级权限用户root的可指向命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin;/usr/local/sbin目录是相似的。凡是目录sbin中包含的都是root权限才能执行的。
/tmp:临时文件目录,有时用户运行程序的时候,会产生临时文件。这个目录和/var/tmp目录相似。
/usr:这个是系统存放程序的目录,比如命令、帮助文件等。当我们安装一个linux发行版官方提供的软件包时,大多安装在这里。如果有涉及服务器配置文件的,会把配置文件安装在/etc目录中。/usr目录下包括设计字体目录/usr/share/fonts,帮助目录/usr/share/man 或/usr/share/doc,普通用户可执行文件目录/usr/bin或/usr/local/bin;超级权限用户root可执行命令存放目录,比如/usr/sbin或/usr/local/sbin等,还有程序的头文件存放目录/usr/include
/var:这个目录的内容是经常变动的,/var下有/var/log这是用来存放系统日志的目录。/var/lib用来存放一些库文件,比如MySQL的。
/media:本目录是空的,是用于挂载的。
/selinux:不知道到底是怎么用的!!!
/srv:一些服务需要访问的文件存放在这
/sys:系统的核心文件
/cdrom:光驱

一些重要子目录:

/etc/init.d:这个目录是用来存放系统或服务器以System V模式启动的脚本。

/etc/X11:这是X-Window相关的配置文件存放地。

/usr/bin:这个目录是可执行程序的目录,普通用户就有权限执行;当我们从系统自带的软件包安装一个程序时,他的可执行文件大多会放在这个目录。

/usr/sbin :这个目录也是可执行程序的目录,但大多存放设计系统管理的命令,只有root权限才能执行。
/usr/local:这个目录一般是用来存放用户自编译安装软件的存放目录;一般是通过源码包安装的软件,如果没有特别指定安装目录的话,一般是安装在这个目录中。

/usr/share:系统共用的东西存放地。

/usr/src:内核源码存放的目录。

这是收集的比较全面的介绍Linux目录结构的知识了。

详细讲述Linux用户组管理方案

在Linux系统管理中,Linux用户组管理方案是解决对一组用户管理的方法。不同Linux系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

1、增加一个新的用户组使用groupadd命令。其格式如下:
groupadd选项用户组
可以使用的选项有:
-gGID指定新用户组的组标识号(GID)。
-o一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。]例1:
#groupaddgroup1此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
例2:
#groupadd-g101group2
此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

2、如果要删除一个已有的用户组,使用groupdel命令,其格式如下:
groupdel用户组
例如:
#groupdelgroup1
此命令从系统中删除组group1。

3、修改用户组的属性使用groupmod命令。其语法如下:
groupmod选项用户组
常用的选项有:
-gGID为用户组指定新的组标识号。
-o与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组将用户组的名字改为新名字
例1:
#groupmod-g102group2
此命令将组group2的组标识号修改为102。
例2:
#groupmod–g10000-ngroup3group2
此命令将组group2的标识号改为10000,组名修改为group3。

4、如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:
$newgrproot
这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。

Linux用户组管理方案这里就解决了同时对一个组的成员进行关了的解决方案。

怎么检查Linux安全漏洞

Linux系统号称是比较安全的系统,但是Linux安全漏洞还是存在的,既然存在安全漏洞的,在这个网络世界中有漏洞就意味着有危险,怎么减少自己系统的漏洞呢?那就得先检查出有哪些漏洞。

无论你是否用过Bastille UNIX工具,以便手动加固你的Linux系统,或者只是想对目前系统的状态进行快照,你需要使用BackTrack。这是款基于Slackware Linux的版本,通过启动CD或虚拟机镜像(VMI)运行。在官方的第三个版本(如果你计算最新发布的就是第四版),BackTrack含有方便的安全工具,用于检测Linux系统里的漏洞。本着“黑客入侵”的精神,BackTrack集成这种通常的安全测试方法:

BackTrack包含利基安全工具,很难下载、编译和安装。无论你是Linux技术专家或新手,很难下载完整版本的Linux与安全测试工具。BackTrack的主要接口如下图所示:

使用BackTrack测试内部Linux系统的常用安全评估情景如下:

使用fping识别活动主机

使用nmap识别操作系统和检测打开的端口

使用amap识别正在运行的应用

使用SAINT查找Linux安全漏洞

使用Metasploit开发操作系统和应用漏洞

Linux的集中可能性是无穷的。此外,BackTrack包括广泛的数据库、Web和无缝工具的设置,用于查找和挖掘Linux宣称之外的系 统缺陷。它甚至包含内置的HTTP、TFTP、SSH和VNC设备,在漏洞验证和分析期间使用。并且,如果你有这样的需求,BackTrack也能集成数 字取证工具。事实上,使用Autopsy和Sleuthkit这样的工具对于“倒回”黑客技术,进一步坚强的你安全技能是很好的。

我一直是使用好的商业安全测试工具的支持者,不过你可能不再使用付费工具。实际上,BackTrack工具不止是够好,她其实非常不错,尤其是精心的报道和正在遭遇漏洞的管理不是你首要考虑的。我将继续在安全评估方面使用商业工具。

介绍一种Linux启动引导加密

Linux启动引导加密是提高Linux安全性的一种措施,这里以RedHat Linux为例来进行Linux启动引导加密的设置,实验是提高我们技术的一种手段,我们一定要亲手试一试这种方法,完成技术的学习。

让linux启动引导加密方法
#vi /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#  all kernel and initrd paths are relative to /boot/, eg.
#  root (hd0,0)
#  kernel /vmlinuz-version ro root=/dev/sda2
#  initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-3)
password 12345678
root (hd0,0)
kernel /vmlinuz-2.4.18-3 ro root=/dev/sda2
initrd /initrd-2.4.18-3.img
~
~
“/boot/grub/grub.conf” 17L, 569C written
[root@localhost root]# reboot

现以上提示输入:12345678

系统才可以引导

注意:远程勿试!

以密文方式

[root@localhost root]# grub-md5-crypt
Password:
$1$jQORq$BbVuVrnQ60b87FlXP/aau/
[root@localhost root]# vi /boot/grub/grub.conf

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#  all kernel and initrd paths are relative to /boot/, eg.
#  root (hd0,0)
#  kernel /vmlinuz-version ro root=/dev/sda2
#  initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-3)
password –md5 $1$jQORq$BbVuVrnQ60b87FlXP/aau/
root (hd0,0)
kernel /vmlinuz-2.4.18-3 ro root=/dev/sda2
initrd /initrd-2.4.18-3.img
~
~
“/boot/grub/grub.conf” 17L, 598C written
[root@localhost root]# reboot

这里就进行了Linux启动引导加密的设置。

介绍十个Linux新手知识点

这里总结Linux新手知识点以供初学者来加快了解Linux系统。Linux新手知识点这十个是必须要知道的,而且了解这些知识点对于以后学习Linux知识会有帮助。

1.Linux是大小写敏感的系统,举个例子,Mozilla,MOZILLA, mOzilla和mozilla是四个不同的命令(但是只有第四个mozilla是真正有效的命令)。还有,my_filE,my_file,和
my_FILE是三个不同的文件。用户的登录名和秘密也是大小写敏感的(这是因为UNIX系统和C语言的传统一向是大小写敏感所致)。

2.文件名最多可以有256个字符,可以包含数字,点号”.”,下划线”_”,横杆”-”,加上其他一些不被建议使用的字符。

3.文件名前面带”.”的文件在输入”ls”或者”dir”
命令时一般不显示。可以把这些文件看作是隐含文件,当然你也可以使用命令”ls
–a”来显示这些文件。

4.“/”对等于DOS下的”\”(根目录,意味着所有其他目录的父目录,或者是在目录之间和目录和文件之间的一个间隔符号)。举个例子,cd
/usr/doc。

5.在Linux系统下,所有的目录显示在单一目录树下(有别于DOS系统的驱动器标识)。这意味着所有的物理设备上的所有文件和目录都合并在单一的目录树下。

6.在配置文件里,以#打头的行是注释行。在修改配置文件的时候尽量不要删除旧的设置――可以把原来的设置加上”#”变成注释行,总是在修改地方对应地加入一些关于修改的注释,你会发觉在以后的管理中获益多多。

7.Linux是继承性的多用户操作系统。你的个人设定(和其他用户的个人设定)放在你的主目录下(一般是/home/your_user_login_name)。许多的配置文件的文件名都以”.”开头,这样用户一般看不到这些文件。

8.整个系统范围的设定一般放在目录/etc下。

9.和其他的多用户操作系统类似,在Linux下,文件和目录有自己的拥有者和访问权限。一般来说,你只被允许文件到你的主目录下(/home
/your_user_login_name)。学习一些关于文件权限管理的相关知识,否则你肯定会觉得Linux实在很麻烦。

10.命令参数选项一般由”-”引导,后面跟一个字符(或者”–“,当选项超过一个字符时)。这样,”-”有点象DOS下的”/”。举个例子,输入命令
rm –help。

这里先将网上总结的Linux新手知识点介绍到这里。

Vi编辑器

四 20th, 2010 | Filed under Linux相关

Vi编辑器vi简介
VI 编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下。由于不需要图形界面,使它成了效率很高的文本编辑器。尽管在Linux上也有很多图形界面的编辑器可用,但VI在系统和服务器管理中的能是那些图形编辑器所无法比拟的。
  VI 编辑器是Visual interface的简称,通常称之为VI。它在Linux上的地位就像Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。
  VI 编辑器并不是一个排版程序,它不像Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。没有菜单,只有命令,且命令繁多。Vi有3种基本工作模式:命令行模式、文本输入模式和末行模式。
  VIM是VI的加强版,比vi更容易使用。vi的命令几乎全部都可以在vim上使用。
  要在Linux下编写文本或语言程序,您首先必须选择一种文本编辑器。可以选择使用Vim编辑器,使用它的好处是几乎每一个版本的Linux都会有它的存在。然而它是在文本模式下使用,需要记忆一些基本的命令操作方式。您也可以选择使用 pico, joe, jove编辑器,午夜司令官mc编辑器等,它们都比Vim来得简单。如果您实在不习惯使用文字模式,可以选择视窗环境下的编辑器,像Gedit, Kate等,或是使用KDevelop,它是在Linux中的X Window下执行的C/C++整合式开发环境
[编辑本段]vi 使用方法
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强 大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的, 因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。
  1、vi的基本概念
  基本上vi可以分为三种状态,分别是
  命令模式(command mode)
  插入模式(Insert mode)
  底行模式(last line mode)
  1) 命令行模式command mode)
  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
  2) 插入模式(Insert mode)
  只有在Insert mode下,才可以做文字输入,按[ESC]键可回到命令行模式。
  3) 底行模式(last line mode)
  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
  不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
  2、vi的基本操作
  a) 进入vi
  在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:
  $ vi myfile
  不过有一点要特别注意,就是您进入vi之后,是处于[命令行模式(command mode)],您要切换到[插入模式(Insert mode)]才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 [插入模式(Insert mode)]再说吧!
  b) 切换至插入模式(Insert mode)编辑文件
  在[命令行模式(command mode)]下按一下字母就可以进入[插入模式(Insert mode)],这时候你就可以开始输入文字了。
  c) Insert 的切换
  您目前处于[插入模式(Insert mode)],您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下[ESC]键转到[命令行模式(command mode)]再删除文字。
  d) 退出vi及保存文件
  在[命令行模式(command mode)]下,按一下[:]冒号键进入[Last line mode],例如:
  : w filename (输入 [w filename]将文章以指定的文件名filename保存)
  : wq (输入[wq],存盘并退出vi)
  : q! (输入q!, 不存盘强制退出vi)
  3、命令行模式(command mode)功能键
  1). 插入模式
  按切换进入插入模式,按“i”进入插入模式后是从光标当前位置开始输入文件;
  按[a]进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
  按[o]进入插入模式后,是插入新的一行,从行首开始输入文字。
  2). 从插入模式切换为命令行模式
  按[ESC]键。
  3). 移动光标
  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母[h]、[j]、[k]、[l],分别控制光标左、下、上、右移一格。
  按[ctrl]+:屏幕往“后”移动一页。
  按[ctrl]+[f]:屏幕往“前”移动一页。
  按[ctrl]+:屏幕往“后”移动半页。
  按[ctrl]+[d]:屏幕往“前”移动半页。
  按数字[0]:移到文章的开头。
  按[G]:移动到文章的最后。
  按[$]:移动到光标所在行的“行尾”。
  按[^]:移动到光标所在行的“行首”
  按[w]:光标跳到下个字的开头
  按[e]:光标跳到下个字的字尾
  按:光标回到上个字的开头
  按[#l]:光标移到该行的第#个位置,如:5l,56l。
  4). 删除文字
  [x]:每按一次,删除光标所在位置的“后面”一个字符。
  [#x]:例如,[6x]表示删除光标所在位置的“后面”6个字符。
  [X]:大写的X,每按一次,删除光标所在位置的“前面”一个字符。
  [#X]:例如,[20X]表示删除光标所在位置的“前面”20个字符。
  [dd]:删除光标所在行。
  [#dd]:从光标所在行开始删除#行
  5). 复制
  [yw]:将光标所在之处到字尾的字符复制到缓冲区中。
  [#yw]:复制#个字到缓冲区
  [yy]:复制光标所在行到缓冲区。
  [#yy]:例如,[6yy]表示拷贝从光标所在的该行“往下数”6行文字。
  [p]:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
  6). 替换
  [r]:替换光标所在处的字符。
  [R]:替换光标所到之处的字符,直到按下[ESC]键为止。
  7). 回复上一次操作
  :如果您误执行一个命令,可以马上按下,回到上一个操作。按多次“u”可以执行多次回复。
  8). 更改
  [cw]:更改光标所在处的字到字尾处
  [c#w]:例如,[c3w]表示更改3个字
  9). 跳至指定的行
  [ctrl]+[g]列出光标所在行的行号。
  [#G]:例如,[15G],表示移动光标至文章的第15行行首。
  4、Last line mode下命令简介
  在使用[last line mode]之前,请记住先按[ESC]键确定您已经处于[command mode]下后,再按[:]冒号即可进入[last line mode]。
  A) 列出行号
  [set nu]:输入[set nu]后,会在文件中的每一行前面列出行号。
  B) 跳到文件中的某一行
  [#]:[#]号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
  C) 查找字符
  [/关键字]:先按[/]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往后寻找到您要的关键字为止。
  [?关键字]:先按[?]键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按[n]会往前寻找到您要的关键字为止。
  D) 保存文件
  [w]:在冒号输入字母[w]就可以将文件保存起来。
  E) 离开vi
  [q]:按[q]就是退出,如果无法离开vi,可以在[q]后跟一个[!]强制离开vi。
  [qw]:一般建议离开时,搭配[w]一起使用,这样在退出的时候还可以保存文件。

标签:

linux下查看磁盘空间

四 20th, 2010 | Filed under Linux相关

如果要查看磁盘还剩多少空间,当然是用df的命令了。

[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 14G 11G 2.6G 82% /
/dev/sda1 99M 14M 81M 14% /boot
tmpfs 442M 275M 168M 63% /dev/shm
/dev/mapper/vg_test-lv_test
24M 1.3M 21M 6% /mnt/lvm
[root@localhost ~]#

当然你可能并不关系磁盘还剩余多少空间,你是需要知道当前的文件夹下的磁盘使用情况:

[root@localhost ~]# du –max-depth=1 -h
24K ./.gnome
8.0K ./.eggcups
8.0K ./.config
136K ./.gnome2
16K ./.chewing
8.0K ./.gnome2_private
8.0K ./.Trash
224K ./.gstreamer-0.10
28K ./Desktop
48K ./.nautilus
48K ./.metacity
240K ./.scim
3.4M ./.mozilla
1012K ./.kde
12K ./.superkaramba
40K ./.local
8.0K ./.qt
272K ./.gconf
32K ./.mcop
16K ./.redhat
1.7M ./.thumbnails
8.0K ./.gconfd
7.5M .
[root@localhost ~]#

看上面使用了du –max-depth=1 -h的命令来查找磁盘的使用情况,因为后面没有跟路径,它就默认是当前的路径。这个命令的-h参数是为了方便你读懂每个文件的大小,如果没有这个参数显示的文件大小就没有k,M,G等。执行命令后,前面n-1行的是该目录下每个文件夹的大小。最后一行显示的是该目录总的大小。

然后你会说不在乎该目录下每个文件的大小,你只想知道其中某一个文件(文件夹)的大小,那么有没有办法呢?当然你应该记得,我一直强调的,方法总比问题多,这儿也不例外。

请看下面的例子:

[root@localhost ~]# du -sh
7.5M .
[root@localhost ~]#

聪明的你一定发现了这里显示的大小和上面最后一行的大小是一样的。这就是说这里显示的大小是该目录的总大小。

我知道你心里在冷笑,不是方法比问题多吗?这里说的也只有一个答案。当然,我不会让你失望的。另一个方法比较土,但是还是可以解决问题的。

[root@localhost ~]# du -h –max-depth=0
7.5M .
[root@localhost ~]#

我想告诉你的是man手册里面已经告诉了:–max-depth=0的功能和-s的功能是一样的。

当然你也可以通过sed打印最后du -h –max-depth=1一行来解决问题,但我并不推荐。

这里涉及到一个原则,尽量使用命令提供选项的原始功能。如果命令没有提供该功能,才需要我们自己使用grep,sed,awk来选取我们需要的行。

当然du命令后面可以跟文件路径,来查看指定路径的大小的。

[root@localhost ~]# du -sh /opt/oracle
5.6G /opt/oracle
[root@localhost ~]#

如果磁盘过大,那么查看文件大小就比较慢,请等一会。

MySQL常用操作命令学习

目标:[通过此学习练习能够利用rpm包方式安装MySQL数据库,能够对MySQL数据库进行管理授权,备份等技术.]

纲要:
一,连接MySQL
二,MySQL管理与授权
三,数据库简单操作
四, 数据库备份
五,后记
一,安装连接MySQL
先查看mysql是否安装:
rpm -qa|grep mysql -i (我用的是rpm包方式安装,查看是否安装此包)
具体安装可以使用rpm或tarball方式安装,详细方法请google.

格式:mysql -h 远程主机地址 -u 用户名 -p 回车
输入密码进入:

mysql -u root -p 回车
Enter password: ,输入密码就可以进入
mysql> 进入了
退出命令:>exit 或者ctrl+D

二,MySQL管理与授权
1.修改密码:
格式:mysqladmin -u 用户名 -p 旧密码 password 新密码

2.增加新用户:
>grant create,select,update….(授予相关的操作权限)
->on 数据库.*
-> to 用户名@登录主机 identified by ‘密码’

操作实例:

给root用户添加密码:
# mysqladmin -u root password 52netseek
因为开始root没有密码,所以-p旧密码一项可以省略.
登陆测试:
# mysql -u root -p 回车
输入密码,成功登陆.
将原有的mysql管理登陆密码52netseek改为52china.
# mysqladmin -u root -p 52netseek password ‘52china’

创建数据库添加用户并授予相应的权限:
mysql> create database phpbb;
Query OK, 1 row affected (0.02 sec)

mysql> use phpbb;
Database changed
mysql> grant create,select,update,insert,delete,alter
-> on phpbb.*
-> to phpbbroot@localhost identified by ‘52netseek’;
Query OK, 0 rows affected (0.00 sec)

授予所有的权限:
>grant all privileges
>on bbs.*
>to bbsroot@localhost identified by ‘52netseek’

回收权限:
revoke create,select,update,insert,delete,alter
on phpbb.*
from phpbbroot@localhost identified by ‘52netseek’;

完全将phpbbroot这个用户删除:
>use mysql
>delete from user
where user=’phpbbroot’ and host=’localhost’;
>flush privileges; 刷新数据库

三,数据库简单操作
1.显示数据库列表:
>show databases;
mysql
test
2.使其成为当前操作数据库
>use mysql; 打开数据库.
>show tables; 显示mysql数据库中的数据表.
3.显示数据表的表结构:
>describe 表名;
>describe user; 显示user表的表结构:
4.创建数据库,建表
>create database 数据库名;
>use 数据库名;
>create table 表名(字段设定列表)
5.删除数据库,册除表
>drop database 数据库名;
>drop table 表名;
6.显示表中的记录;
select * from 表名;
7.修改数据库结构:
增加字段:
alter table dbname add column <字段名><字段选项>
修改字段:
alter table dbname change <旧字段名> <新字段名><选项>
删除字段:
alter table dbname drop column <字段名>

实例操作:
>create database office;
>use office;
mysql> create table personal(
-> member_no char(5) not null,
-> name char(,
-> birthday date,
-> exam_score tinyint,
-> primary key(member_no)
-> );
Query OK, 0 rows affected (0.01 sec)
>desc personal; 显示表结构:
+————+————+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————+————+——+—–+———+——-+
| member_no | char(5) | | PRI | | |
| name | char( | YES | | NULL | |
| birthday | date | YES | | NULL | |
| exam_score | tinyint(4) | YES | | NULL | |
+————+————+——+—–+———+——-+
4 rows in set (0.00 sec)

insert into personal values (‘001′,’netseek’,'1983-03-15′,’95′);
insert into personal values (‘002′,’heihei’,'1982-02-24′,’90′);
insert into personal values (‘003′,’gogo’,'1985-05-21′,’85′);
insert into personal values (‘004′,’haha’,'1984-02-25′,’84′);
insert into personal values (‘005′,’linlin’,'1982-04-28′,’85′);
insert into personal values (‘006′,’xinxin’,'1985-03-15′,’75′);

mysql> select * from personal;
+———–+———+————+————+
| member_no | name | birthday | exam_score |
+———–+———+————+————+
| 001 | netseek | 1983-03-15 | 95 |
| 002 | heihei | 1982-02-24 | 90 |
| 003 | gogo | 1985-05-21 | 85 |
| 004 | haha | 1984-02-25 | 84 |
| 005 | linlin | 1982-04-28 | 85 |
| 006 | xinxin | 1985-03-15 | 75 |
+———–+———+————+————+

修改数据库表:
要求: 在birthday这后增加一个为height的字段,数据类型为tinyint.
将字段exam_score 改名为scores,数据类型不变
>alter table personal
->add column height tinyint after birthday,
->change column exam_score scores tinyint;

mysql> select * from personal;
+———–+———+————+——–+——–+
| member_no | name | birthday | height | scores |
+———–+———+————+——–+——–+
| 001 | netseek | 1983-03-15 | NULL | 95 |
| 002 | heihei | 1982-02-24 | NULL | 90 |
| 003 | gogo | 1985-05-21 | NULL | 85 |
| 004 | haha | 1984-02-25 | NULL | 84 |
| 005 | linlin | 1982-04-28 | NULL | 85 |
| 006 | xinxin | 1985-03-15 | NULL | 75 |
+———–+———+————+——–+——–+

给表中插入数据:
>update personal set scores=95+5 where name=’netseek’;
>select scores from personal where name=’netseek’;
+——–+
| scores |
+——–+
| 100 |
+——–+

删除表名字为’gogo’所有的信息中的的:
> delete from personal where name=’gogo’;

册除数据库中的表:
mysql>drop table if exists personal;

三,数据库的导入与导出
导出:
使用select into outfile ‘filename’语句
使用mysqldump实用程序
使用select into outfile ‘filename’语句

1.只能处理单个表,输出文件只有数据,没有表结构
我们要将office,其中有一个表为personal,现在要把personal卸成文本文件out.txt:
>use office;
>select * from personal into outfile ‘out.txt’; 可以看在/var/lib/mysql/office/目录下有out.txt
select * from personal into outfile ‘./out.txt’; 可以看在out.txt 在/var/lib/mysql/目录下用out.txt

2.使用mysqldump实用程序(可以轻松处理多个表)
# cd /var/lib/mysql
导出建立相关表的建表命令和插入指令
# mysqldump bbs >bbs.sql 将数据库bbs导入到bbs.sql中

如果要将bbs.sql导入数据库可以使用:
mysql> create database bbstest; 先建立一个名为office 的数据库.
# mysql bbstest <bbs.sql (这个常用在将本地的数据库文件传到服务器上,再导入到数据库中)

只想导出建表指令:
# mysqldump -d bbs >bbscreate.sql
只想导出插入数据的sql指令:
# mysqldump -t bbs >bbsinsert.sql
同时导出数据库中建表指令和表中的数据:
# mysqldump -T./ bbs cdb_admingroups (其中./表示当前目录,cdb_admingroups为bbs数据库其中的一个表)
#ls
cdb_admingroups.sql 导出了建表指令
cdb_admingroups.txt 导出了表中的数据

导入:
从文件中加载数据库:
mysql>load data infile “/tmp/name.txt” into table names;
mysql>select * from names;
四,数据库备份

1.手动拷贝备份:
MySQL数据库的文件保存在目录/var/lib/mysql中,数据库为每个库建立一个目录,所有的数据库文件都在这些目录中.
[root@linuxhero mysql]#ls
bbs mysql mysql.sock phpbb test office 显示其中的数据库.

如果我们要将现在的数据库目录备份为mysql.bak .
[root@linuxhero lib]# cp -rf mysql mysql.bak
如果数据库遭到了破坏,现在要将数据库恢复:
[root@linuxhero lib]# cp -rf mysql.bak/* mysql
恢复数据库以后,var/lib/mysql中的文件已改变了,要更改文件的所属权限必须改变MySQL数据库的用户读写权限。
所以我们得启动和运行mysql,并登陆数据库:
[root@linuxhero lib]# /etc/init.d/mysqld start
[root@linuxhero lib]# mysql -u root -p
Enter password:输入密码成功登陆.
mysql> show databses;

2.利用mysqldump来备份数据库
[root@linuxhero mysql]# mysqldump –opt bbs -u root -p > bbs.sql
Enter password:
注:–opt添加备份的其它选项,bb为其中一个数据库名,
上面的意思是:使用重定向输出将备份写入到文件bb.sql中.
[root@linuxhero mysql] #less bbs.sql

如果要恢复bb这个数据库,则进行如下操作:
[root@linuxhero mysql] #mysql bbs -u root -p < bbs.sql

如果要备份所有数据库:
[root@linuxhero mysql] #mysqldump –opt –all-databases -u root -p >mysql.bak
Enetr password:输入密码即可
恢复所有数据库,不用输入数据库的名字:
[root@linuxhero mysql] #mysql -u root -p < mysql.bak
Enetr password: 输入密码即可

五,附:MySQL密码忘记了怎么办?
如果 MySQL 正在运行,首先杀之: killall -TERM mysqld。
启动 MySQL :bin/safe_mysqld –skip-grant-tables &
就可以不需要密码就进入 MySQL 了。
然后就是
>use mysql
>update user set password=password(“new_pass”) where user=”root”;
>flush privileges;
重新杀 MySQL ,用正常方法启动 MySQL 。

Ucenter通信原理

四 19th, 2010 | Filed under 开源技术, 系统架构及硬件

1,用户登录bbs,通过logging.php文件中,使用函数uc_user_login验证,如果验证成功,将调用函数uc_user_synlogin(位于uc_client下的client.php文件中),在这个函数中调用 uc_api_post(‘user’, ’synlogin’, array(‘uid’=>$uid));之后向UC_API.’/index.php’传递了数据;这里的UC_API就是在 config.inc.php中的定义的uc_server之URL地址
2,uc_server的index.php接受参数数据,获得model为user,action为synlogin,就调用control目录下的 user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中的应用同步登录;即通过 get方式传递给应用目录中api下的uc.php一些数据;
3,uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie;
4,各个应用在适当的文件中用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过;

以discuz举例:

一、用户登录检查与用户登录验证logging.php

在bbs的logging.php中如下代码段

} elseif($action == ‘login’) {

if($discuz_uid) {
   $ucsynlogin = ”;
   showmessage(‘login_succeed’, $indexname);
}

检查用户id变量$discuz_uid是否为空来判断,用户是否登录(包括从别的应用登录。)

如果用户从bbs登录,则在登录验证成功后通过如下代码:

$ucsynlogin = $allowsynlogin ? uc_user_synlogin($discuz_uid) : ”;

通知其它应用—-“用户已从bbs登录,请通知其它应用设置cookie”

(uc_server通过javascript调用方式向其它应用的api/uc.php传递数据)

可以在uc应用目录下新建一个名为test.php的文件,来模拟登录成功,请求uc_server通知其它应用。文件内容为:

———————文件内容开始———————-

<?php
include_once “config.inc.php”;
include_once “./uc_client/client.php”;
echo uc_user_synlogin(1);
echo “<pre>”;
var_dump($_COOKIE);
echo “</pre>”;

?>
<script>
var obj=document.getElementsByTagName(“script”);
for(var i=0;i<obj.length-1;i++) {
   document.write(“<a href=\”"+obj[i].src+”\”>”+obj[i].src+”</a><hr>”);
}
</script>

———————文件内容结束———————-

ps:这段测试代码还可以测试同步登录不好使的情况,具体使用方法,你可以思考一下(本文后面也有介绍),有问题可以在此文结尾发表评论与我讨论

运行后,查看源代码即可看到javascript;

这里要注意了:这些javascript的通知中是不包含用户登录的应用的。也就是说只”通知”用户未登录的应用,因为用户通过uc_server登录成功的当前应用,当然不需要uc_server再通知了。具体代码请参看:webroot\uc_server\control\user.php中的onsynlogin函数的这句:

if($app['synlogin'] && $app['appid'] != $this->app['appid'])

代码解释:

$app['synlogin']是uc应用是否允许同步登录

而且应用id不等于用户当前登录的应用id

$app数组就是uc_server\data\cache\apps.php中的数组$_CACHE['apps'];

$this->app就是用户登录的应用

二、接受其它应用的同步登录通知:

在discuz的api目录下的uc.php中的函数synlogin,在这里接受uc_server发送过来的“同步登录通知”,并设置discuz的cookie,在这个函数中你可以查看到cookie的加密密钥的“算法”;

如果你想看看uc_server发送过的的“通知”是什么数据,你可以这么做:

1,修改要接受通知的应用目录下的api\uc.php,在$action = $get['action'];代码下面添加如下代码:

echo “<pre>”;var_dump($get);echo “</pre>”;die(“<hr>api\uc.php”);

2,将上面建立的test.php文件放置在其它允许同步登录的应用目录下,并在浏览器中运行,然后点击页面中对应第一步的应用链接,即可看到uc_server“通知”给改应用的数据;

—————————分割线——————————-

function synlogin($get, $post)

在这个函数中通过_authcode函数,以密钥$discuz_auth_key加密了cookie;

在这里为了避免cookie名称冲突,在cookie名称(一般为:auth)前加了前缀($cookiepre),这个前缀也就是在config.inc.php中设置的那个cookie前缀值;

请看设置cookie的函数_setcookie:

(通过参数$prefix来判断是否对cookie名称添加前缀$cookiepre)

function _setcookie($var, $value, $life = 0, $prefix = 1) {
global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER;
setcookie(($prefix ? $cookiepre : ”).$var, $value,
  $life ? $timestamp + $life : 0, $cookiepath,
   $cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}

密钥“算法”:

$discuz_auth_key= md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

也就是不同用户加密cookie的密钥可能不同;

三、检查用户是否已登录(无论是那个应用下登录):

discuz的include目录中common.inc.php中有这样的代码:
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array(”, ”, 0) : daddslashes(explode(“\t”, authcode($_DCOOKIE['auth'], ‘DECODE’)), 1);

这段代码就是解码在uc.php中用密钥($discuz_auth_key)加密的cookie值,以获得用户id($discuz_uid)

这里的解密函数位于bbs\include\global.func.php中,虽然未给函数传递cookie密钥,但函数中通过全局变量$GLOBALS['discuz_auth_key'])获得密钥。

Uc_client与ucenter通信原理

四 19th, 2010 | Filed under 开源技术, 系统架构及硬件

以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同。

1.
从用户xxx在某一应用程序的login.php,输入用户名,密码讲起。
先用uc_user_login函数到uc server验证此用户和密码,如正确,则写入session,写入cookies,并更新应用程序会员表中的登录ip,登录时间。用户感觉不到这个过程。
2.
然后通过uc_user_synlogin通知uc server 用户xxx登录成功,这个过程可能使用ajax,用户感觉不到通知过程。
3.
uc server收到这个消息后,马上命令手下,把xxx登录的消息,像令牌环一样,发给所有愿意接收(后台中那个是否开启同步登录)这个消息的其它应用程序。其实就是带参数访问一下各应用程序的uc.php,用户感觉不到这个过程。
4.
各应用程序靠api下的uc.php来接收uc server发来的消息,并对uc server言听计从,让干什么就干什么。现在,收到让xxx用户在你的程序中登录的命令,马上执行。
并写本应用程序的session,并且使用p3p, 写入相同域或不同域的cookies.  用户感觉不到这个过程。

5.最后所有和uc整合的程序,xxx均登录成功。用户从www.test.com/bbs登录后, 跳到www.test.com/news同样显示登录。因为bbs 和news系统在后台均已登录。

6.应用程序与uc server的会话结束。

得益于uc设计的精巧过程,整个过程,用户完全感觉不到ucenter的存在.这是整合程序历史上的创新。

以下为其中的一个例子:
Supesite的uc_client和ucenter登录通信过程
1、登录入口Index.php?action-login
//系统频道
if($_SGET['action'] != ‘index’) {    
if(empty($channels['menus'][$_SGET['action']]['upnameid']) && $channels['menus'][$_SGET['action']]['upnameid'] != ‘news’) {
$scriptfile = S_ROOT.’./’.$_SGET['action'].’.php’;
} else {
$scriptfile = S_ROOT.’./news.php’;
}
    
//echo   $scriptfile;
if(file_exists($scriptfile)) {
include_once($scriptfile);
exit();
}
}
登录控制器:Login.php
登录视图:Site_login.html.php
  提交登录action:batch.login.php?action=login
2、登录处理地址batch.login.php?action=login
include_once(S_ROOT.’./uc_client/client.php’);

登录操作及其中涉及到的一些函数:
$password = $_POST['password'];
$username = $_POST['username'];
去ucenter进行远程登录验证
$ucresult = uc_user_login($username, $password, $loginfield == ‘uid’);

如果登录成功
则查本地用户信息
如果有更新本地信息
如果没有插入新的用户数据保持与ucenter进行同步

然后同步其他子系统登录信息
$msg = $lang['login_succeed'].uc_user_synlogin($members['uid']);

function uc_user_synlogin($uid) {
$uid = intval($uid);
$return = uc_api_post(‘user’, ’synlogin’, array(‘uid’=>$uid));
return $return;
}

/**
*  dfopen 方式取指定的模块和动作的数据
*
* @param string $module 请求的模块
* @param string $action 请求的动作
* @param array $arg 参数(会加密的方式传送)
* @return string
*/

function uc_api_post($module, $action, $arg = array()) {
$s = $sep = ”;
foreach($arg as $k => $v) {
$k = urlencode($k);
if(is_array($v)) {
$s2 = $sep2 = ”;
foreach($v as $k2 => $v2) {
$k2 = urlencode($k2);
$s2 .=
“$sep2{$k}[$k2]=”.urlencode(uc_stripslashes($v2));
$sep2 = ‘&’;
}
$s .= $sep.$s2;
} else {
$s .=
“$sep$k=”.urlencode(uc_stripslashes($v));
}
$sep = ‘&’;
}
$postdata = uc_api_requestdata($module, $action, $s);

return uc_fopen2(UC_API.’/index.php’, 500000, $postdata, ”, TRUE, UC_IP, 20);
}

/**
* 构造发送给用户中心的请求数据
*
* @param string $module 请求的模块
* @param string $action 请求的动作
* @param string $arg 参数(会加密的方式传送)
* @param string $extra 附加参数(传送时不加密)
* @return string
*/

function uc_api_requestdata($module, $action, $arg=”, $extra=”) {
$input = uc_api_input($arg);
$post =
“m=$module&a=$action&inajax=2&release=”.UC_CLIENT_RELEASE.“&input=$input&appid=”.UC_APPID.$extra;
return $post;
}

function uc_api_url($module, $action, $arg=”, $extra=”) {
$url = UC_API.’/index.php?’.uc_api_requestdata($module, $action, $arg, $extra);
return $url;
}

function uc_api_input($data) {
$s = urlencode(uc_authcode($data.’&agent=’.md5($_SERVER['HTTP_USER_AGENT']).“&time=”.time(), ‘ENCODE’, UC_KEY));
return $s;
}

/**
*  远程打开URL
*  @param string $url 打开的url, 如 http://www.baidu.com/123.htm
*  @param int $limit 取返回的数据的长度
*  @param string $post 要发送的 POST 数据,如uid=1&password=1234
*  @param string $cookie 要模拟的 COOKIE 数据,如uid=123&auth=a2323sd2323
*  @param bool $bysocket TRUE/FALSE 是否通过SOCKET打开
*  @param string $ip IP地址
*  @param int $timeout 连接超时时间
*  @param bool $block 是否为阻塞模式
*  @return 取到的字符串
*/

function uc_fopen2($url, $limit = 0, $post = ”, $cookie = ”, $bysocket = FALSE, $ip = ”, $timeout = 15, $block = TRUE) {
$__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;
if($__times__ > 2) {
return ”;
}
$url .= (strpos($url, ‘?’) === FALSE ? ‘?’ : ‘&’).
“__times__=$__times__”;
return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block);
}

function uc_fopen($url, $limit = 0, $post = ”, $cookie = ”, $bysocket = FALSE, $ip = ”, $timeout = 15, $block = TRUE) {
$return = ”;
$matches = parse_url($url);
!isset($matches['host']) && $matches['host'] = ”;
!isset($matches['path']) && $matches['path'] = ”;
!isset($matches['query']) && $matches['query'] = ”;
!isset($matches['port']) && $matches['port'] = ”;
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? ‘?’.$matches['query'] : ”) : ‘/’;
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out = “POST $path HTTP/1.0\r\n”;
$out .=
“Accept: */*\r\n”;
//$out .= “Referer: $boardurl\r\n”;
$out .=
“Accept-Language: zh-cn\r\n”;
$out .=
“Content-Type: application/x-www-form-urlencoded\r\n”;
$out .=
“User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n”;
$out .=
“Host: $host\r\n”;
$out .= ‘Content-Length: ‘.strlen($post).
“\r\n”;
$out .=
“Connection: Close\r\n”;
$out .=
“Cache-Control: no-cache\r\n”;
$out .=
“Cookie: $cookie\r\n\r\n”;
$out .= $post;
} else {
$out =
“GET $path HTTP/1.0\r\n”;
$out .=
“Accept: */*\r\n”;
//$out .= “Referer: $boardurl\r\n”;
$out .=
“Accept-Language: zh-cn\r\n”;
$out .=
“User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n”;
$out .=
“Host: $host\r\n”;
$out .=
“Connection: Close\r\n”;
$out .=
“Cookie: $cookie\r\n\r\n”;
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return ”;
//note $errstr : $errno \r\n
} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header ==
“\r\n” ||  $header == “\n”)) {
break;
}
}

$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}

远程同步登录子系统操作之后
//显示信息
function showmessage($message, $url_forward=”, $second=3, $vars=array()) {
global $_SGLOBAL, $_SCONFIG, $_SC, $channels;

if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
//直接301跳转
obclean();
header(
“HTTP/1.1 301 Moved Permanently”);
header(
“Location: $url_forward”);
} else {
if(!defined(‘IN_SUPESITE_ADMINCP’)) {
$tpl_file = ’showmessage’;
$fullpath = 0;
include_once(S_ROOT.’./language/message.lang.php’);
if(!empty($mlang[$message])) $message = $mlang[$message];
} else {
$tpl_file = ‘admin/tpl/showmessage.htm’;
$fullpath = 1;
include_once(S_ROOT.’./language/admincp_message.lang.php’);
if(!empty($amlang[$message])) $message = $amlang[$message];
}

if(isset($_SGLOBAL['mlang'][$message])) $message = $_SGLOBAL['mlang'][$message];
foreach ($vars as $key => $val) {
$message = str_replace(‘{‘.$key.’}', $val, $message);
}
//显示
obclean();
if(!empty($url_forward)) {
$second = $second * 1000;
$message .=
“<script>setTimeout(\”window.location.href =’$url_forward’;\”, $second);</script><ajaxok>”;
}

include template($tpl_file, $fullpath);
ob_out();
}
exit();
}

Supesite中的Common.php部分解读:

1、define(‘S_ROOT’, dirname(__FILE__).DIRECTORY_SEPARATOR);
dirname(__FILE__)
S_ROOT=E:\mydoc\supesite
2、error_reporting指令确定PHP错误报告敏感度的级别,一共有十三个预定的错误级别,每一个都唯一对应于应用程序或服务器功能。
D_BUG?error_reporting(7):error_reporting(E_ERROR);
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING

3、$_SGLOBAL = $_SBLOCK  = $_SCONFIG = $_SHTML = $_DCACHE = $_SGET = array();
4、//基本文件
if(!@include_once(S_ROOT.’./config.php’)) {
header(
“Location: install/index.php”);//安装
exit();
}
include_once(S_ROOT.’./function/common.func.php’);
@include_once(S_ROOT.’./data/system/config.cache.php’);

5、PHP extract() 函数从数组中把变量导入到当前的符号表中。
$_SCONFIG = array_merge($_SSCONFIG, $_SC);//合并配置
extract($_SC);
6、函数:get_magic_quotes_gpc()
取得 PHP 环境变量 magic_quotes_gpc 的值。
语法: long get_magic_quotes_gpc(void);
返回值: 长整数
函数种类: PHP 系统功能
本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ‘ (单引号),
” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
7、过滤’单引号
function saddslashes($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = saddslashes($val);
}
} else {
$string = addslashes($string);
}
return $string;
}
addslashes()函数的作用是:使用反斜线引用字符串。
8、strlen()函数的作用:取字符串的长度
9、
foreach($_COOKIE as $key => $val) {
if(substr($key, 0, $prelength) == $_SC['cookiepre']) {
$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;
}
}

10、getenv
取得系统的环境变量
语法: string getenv(string varname);
11、php strcasecmp()函数
strcasecmp()函数的作用是:对两个字符串进行比较。
12、preg_match
13、ob_start 打开缓冲区
14、preg_replace执行正则表达式的搜索和替换
参考资料

Apache的Charset设置

四 19th, 2010 | Filed under WEB服务器, 系统架构及硬件

这个问题已经遇到过俩次了,就是页面中明确指明了编码是UTF8,但是显示是乱码。
虽然知道解决方法,也知道是Apache的原因,但是一直没有去找其所以然,今天趁机,就研究了一下。

1.页面没有指定charset , Apache配置defaultcharst gbk , 页面文件编码是utf-8
结果: 乱码,使用wireshark抓包,发现服务器返回的header中指明了:
Content-Type: text/html; charset=GBK 结论:当页面没有指明charset的时候,Apache的defaultcharset起作用
2. 页面指定charset为utf-8, Apache配置defaultcharset gbk. 页面文件是utf-8



结果还是出现乱码。
结论:当Apache配置了DefaultCharset, 将忽略页面的charset申明。
3 PHP header申明charset为utf8, Apache配置defaultcharst gbk,页面文件编码是utf8 header(“Content-Type:text/html; charset=utf-8″);
结果 : 页面显示正常。
4 Apache设置DefaultCharset off
结果,页面显示正常。

翻阅了下Apache2的手册: AddDefaultCharset 指令
说明 当应答内容是text/plain或text/html时,在HTTP应答头中加入的默认字符集
语法 AddDefaultCharset On|Off|charset
默认值 AddDefaultCharset Off
作用域 server config, virtual host, directory, .htaccess
覆盖项 FileInfo
状态 核心(C)
模块 core

当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过标签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字中的另外一个charset 。比如说:

AddDefaultCharset utf-8
也就是说,当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。
当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端

最后,还有一个问题没有得出结果:
当Apache和页面都没有指定的时候, 又如何?
我在自己的机器上,如果都不指定, 默认还是utf8