2016年9月13日星期二

zabbix解决中文乱码

解决中文乱码问题 1.从windows下控制面板->字体->选择一种中文字库例如“楷体” 2.把它拷贝到zabbix的web端的fonts目录下例如:/var/www/html/zabbix/fonts,并且把TTF后缀改为ttf 3.修改zabbix的web端/include/defines.inc.php 点击(此处)折叠或打开 //define('ZBX_FONT_NAME', 'DejaVuSans'); define('ZBX_FONT_NAME', 'SIMKAI'); //define('ZBX_GRAPH_FONT_NAME', 'DejaVuSans'); // font file name define('ZBX_GRAPH_FONT_NAME', 'SIMKAI'); // font file name 其中SIMKAI为字库名字,不包含ttf后缀

Linux非root用户如何使用80端口启动程序

默认情况下Linux的1024以下端口是只有root用户才有权限占用,我们的tomcat,apache,nginx等等程序如果想要用普通用户来占用80端口的话就会抛出java.net.BindException: Permission denied:80的异常。 解决办法有两种: 1.使用非80端口启动程序,然后再用iptables做一个端口转发。 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 用root用户直接去执行就可以了! 2.假设我们需要启动的程序是nginx,那么这么做也可以达到目的。 一开始我们查看nginx的权限描述: www.2cto.com -rwxr-xr-x 1 nginx dev 2408122 Sep 5 16:01 nginx 这个时候必然是无法正常启动的。 首先修改文件所属用户为root: chown root nginx 然后再加上s权限: chmod u+s nginx 再次查看权限描述的时候: -rwsr-xr-x 1 root root 2408122 Sep 5 16:01 nginx 这样就能启动了。

监控服务器mysql变为只读文件问题解决

监控服务器的mysql不知道什么原因,突然停止,造成文件只读, 解决办法 1.重启看是否可以修复(很多机器可以) 2.使用用fsck – y 来修复文件系统 3.若,在进行修复的时候有的分区会报错,重新启动系统问题依旧 查看下分区结构 [root@localhost mobile]# more /etc/fstab [root@localhost ~]# more /proc/mounts [root@localhost ~]# mount /dev/sda3 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (ro) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) 查看ro挂载的分区,如果发现有ro,就重新mount umount /dev/sda1 mount /dev/sda1 /boot 如果发现有提示“device is busy”,找到是什么进程使得他busy fuser -m /boot 将会显示使用这个模块的pid fuser -mk /boot 将会直接kill那个pid 然后重新mount即可。 4.直接remount,命令为 [root@localhost ~]# mount -o rw,remount /boot ================================================== linux系统重启或无故变为只读造成网站无法正常访问的简单临时的做法: 一 1、mount:   用于查看哪个模块输入只读,一般显示为:   /dev/hda1 on / type ext3 (rw)   none on /proc type proc (rw)   usbdevfs on /proc/bus/usb type usbdevfs (rw)   none on /dev/pts type devpts (rw,gid=5,mode=620)   /dev/hda5 on /home type ext3 (rw)   none on /dev/shm type tmpfs (rw)   /dev/hda2 on /usr/local type ext3 (rw)   /dev/nb1 on /EarthView/RAW type ext3 (ro)(变为只读了)   2、如果发现有ro,就重新mount,或者umount以后再remount   3、umount /dev/nb1   如果发现有提示“device is busy”,找到是什么进程使得他busy   fuser -m /mnt/data 将会显示使用这个模块的pid   fuser -mk /mnt/data 将会直接kill那个pid   然后重新mount即可。   4、还有一种方法是直接remount,命令为   mount -o rw,remount /mnt/data 二 具体深入的做法,情况不同可以自行选择: 服务器/var/log/messages报错 : end_request: I/O error, dev sda, sector 122194293 Buffer I/O error on device sda1, logical block 446493 lost page write due to I/O error on sda1 下面是整个处理全过程 [root@php5 ~]# fdisk -lu #第一步 :找出本地扇片所在的分区。 Disk /dev/sda: 73.4 GB, 73407868928 bytes 255 heads, 63 sectors/track, 8924 cylinders, total 143374744 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/sda1 * 63 4096574 2048256 83 Linux /dev/sda2 4096575 75778604 35841015 83 Linux /dev/sda3 75778605 129034079 26627737+ 83 Linux /dev/sda4 129034080 143364059 7164990 5 Extended /dev/sda5 129034143 139267484 5116671 83 Linux /dev/sda6 139267548 143364059 2048256 82 Linux swap [root@php5 ~]# tune2fs -l /dev/sda3 |grep "Block size" #找到block大小。 Block size: 4096 (122194293-75778605)*512/4096 =528691 利用公式算出逻辑块地址 b = (int)((L-S)*512/B) [root@php5 ~]# debugfs debugfs 1.35 (28-Feb-2004) debugfs: open /deb/sda3 /deb/sda3: No such file or directory while opening filesystem debugfs: open /dev/sda3 debugfs: icheck 582391 Block Inode number 582391 277584 debugfs: ncheck 277584 Inode Pathname 277584 /users/inn.net.cn/data/upload/download/innshow004.rar debugfs: quit [root@php5 ~]#dd if=/dev/zero of=/dev/sda1 bs=4096 count=1 seek=582391 #找到这个快的文件之后,需要做好备份,我们强制把它设置为0字节。 [root@php5 ~]# sync

windows mysql 自动备份的几种方法

基于之前的文章方法,加入批处理命令即可实现自动备份。只是由于批处理命令中对于备份文件的名字按照时间命名比较特别,所以特别整理一文。 1、复制date文件夹备份 ============================ 假想环境: MySQL 安装位置:C:\MySQL 论坛数据库名称为:bbs 数据库备份目的地:C:\db_bak\ ============================ 新建db_bak.bat,写入以下代码 *******************************Code Start***************************** net stop mysql xcopy c:\mysql\data\bbs\*.* c:\db_bak\bbs\%date:~0,10%\ /S /I net start mysql *******************************Code End ***************************** 然后使用Windows的“计划任务”定时执行该批处理脚本即可。(例如:每天凌晨3点执行back_db.bat) 解释:备份和恢复的操作都比较简单,完整性比较高,控制备份周期比较灵活,例如,用%date:~0,10%。此方法适合有独立主机但对mysql没有管理经验的用户。缺点是占用空间比较多,备份期间mysql会短时间断开(例如:针对30M左右的数据库耗时5s左右),针对%date:~0,10%的用法参考 。 2、mysqldump备份成sql文件 ============== 假想环境: MySQL 安装位置:C:\MySQL 论坛数据库名称为:bbs MySQL root 密码:123456 数据库备份目的地:D:\db_backup\ 脚本: rem *******************************Code Start***************************** @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" C:\MySQL\bin\mysqldump --opt -u root --password=123456 bbs > D:\db_backup\bbs_%Ymd%.sql @echo on rem *******************************Code End***************************** 将以上代码保存为backup_db.bat 然后使用Windows的“计划任务”定时执行该脚本即可。(例如:每天凌晨5点执行back_db.bat) 说明:此方法可以不用关闭数据库,并且可以按每一天的时间来名称备份文件。 通过%date:~5,2%来组合得出当前日期,组合的效果为yyyymmdd,date命令得到的日期格式默认为yyyy-mm-dd(如果不是此格式可以通过pause命令来暂停命令行窗口看通过%date:~,20%得到的当前计算机日期格式),所以通过%date:~5,2%即可得到日期中的第五个字符开始的两个字符,例如今天为2009-02-05,通过%date:~5,2%则可以得到02。(日期的字符串的下标是从0开始的) 3、利用WinRAR对MySQL数据库进行定时备份。 对于MySQL的备份,最好的方法就是直接备份MySQL数据库的Data目录。下面提供了一个利用WinRAR来对Data目录进行定时备份的方法。 首先当然要把WinRAR安装到计算机上。 将下面的命令写入到一个文本文件里 *******************************Code Start***************************** net stop mysql c:\progra~1\winrar\winrar a -ag -k -r -s d:\mysql.rar d:\mysql\data net start mysql *******************************Code End***************************** 保存,然后将文本文件的扩展名修改成CMD。进入控制面版,打开计划任务,双击“添加计划任务”。在计划任务向导中找到刚才的CMD文件,接着为这个任务指定一个运行时间和运行时使用的账号密码就可以了。 这种方法缺点是占用时间比较多,备份期间压缩需要时间,mysql断开比第一种方法更多的时间,但是对于文件命名很好。

如何禁止cron发用户邮件

经常会遇到这样的问题,登陆系统或者敲命令时,系统总会提示: You have new mail in /var/spool/mail/root 有时很烦,具体产生的原因如下: cron中执行的脚本有输出导致的。很多人写脚本都不考虑标准输出和错误输出如何处理,这样一旦有输出,cron就会把输出内容发邮件给当前用户。很多网上说的停止MTA(sendmail or postfix)等是不管用的,删除sendmail命令也不行。 比较普通的处理方法就是在每条cron后面添加如下方法进行屏蔽。 点击(此处)折叠或打开 >/dev/null 2>&1. OR &> /dev/null 如: */2 * * * * /usr/local/sbin/dog_lighttpd.sh >/dev/null 2>&1 但是有时候还不够方便,比如刚接手的一个项目,里面已经写了300多条cron了,即使写脚本添加屏蔽也比较烦。 那么还有更简单的方法: 直接:crontab -e 在第一行添加:MAILTO="" 原来在/etc/crontab中定义了收件人,所以我们把收件人滞空就可以了。 其实最根本的方法还是大家养成脚本规范的好习惯。

mysql create database utf8

CREATE DATABASE `test` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; CREATE TABLE `database_user` ( `ID` varchar(40) NOT NULL default '', `UserID` varchar(40) NOT NULL default '', ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

linux中如何将top的结果输出到文件中保存

linux主机每周六,mysql服务就会停止,为了查看当时的情况,需要将当时主机的状态记录下来,作为保存 其中,比较的简单的方法为,将top命令输出到文本,结合zabbix报警,确定时间,查找相应时间段内的top日志。 将top输出到文件的命令为: #top -d 2 -n 3 -b > test.txt 可以把top的结果每隔2秒,打印3次,这样后面页的进程也能够看见了 后面,可以写成一个脚本,添加时间 然后输出top命令。 最后的脚本: #!/bin/bash SYSTEM_TIME=`date '+%Y-%m-%d %T'` echo $SYSTEM_TIME >> /var/log/top.log top -d 2 -n 3 -b >> /var/log/top.log echo "top dump file done!" >> /var/log/top.log

检查mysql运行服务状态,并发送邮件告警

1,在227本机上添加脚本,check_mysql.sh #!/bin/bash #check mysql stutus USER="zabbix" PASSWORD="password" LOG="/root/check_mysql.log" SYSTEM_TIME=`date '+%Y-%m-%d %T'` iswrong="false" port=`netstat -nlt|grep 3306|wc -l` if [ $port -ne 1 ] then echo "mysql port is not found." >> $LOG iswrong="true" else echo "mysql port is listening." >> $LOG fi process=`ps -ef|grep mysqld|grep -v grep|wc -l` if [ $process -ne 2 ] then echo "mysql process is not 2 process or not exist." >> $LOG iswrong="true" else echo "mysql process is exist." >> $LOG fi mysql -u$USER -p$PASSWORD -e "select version();" &>/dev/null if [ $? -ne 0 ] then echo "mysql cound not query now ." >> $LOG iswrong="true" else echo "mysql query ok ." >> $LOG fi if [ $iswrong == "true" ] then echo "send email" >> $LOG /usr/local/bin/sendEmail -s "smtp.exmail.qq.com" -xu "lancaihe@qq.com" -xp "password" -f "lancaihe@qq.com" -t "xxxx@qq.com" -u "mysql server is down." -m "$SYSTEM_TIME \n. mysql server is down." fi 在机器上设置计划任务 */5 * * * 6 ssh root@'192.168.0.10' "sh /bin/check_mysql.sh" > /dev/null 2>&1 每周六,每隔5分钟就进行一次脚本检查。 解决本机计划任务也停止问题的解决方案

CentOS升级Python2.6到Python2.7并安装pip

貌似CentOS 6.X系统默认安装的Python都是2.6版本的?平时使用以及很多的库都是要求用到2.7版本或以上,所以新系统要做的第一件事必不可少就是升级Python啦!在这里做个简单的升级操作记录 :) 升级Python 系统默认安装的Python是2.6.6的,我们需要升级到Python2.7,用wget命令从官方下载源文件,然后解压进行编译 wget http://www.python.org/ftp/python/2.7.10/Python-2.7.10.tar.xz unxz Python-2.7.10.tar.xz tar -vxf Python-2.7.10.tar 执行完以上命令会解压得到Python-2.7.10这个文件夹,进入该目录并执行以下命令进行配置 ./configure --enable-shared --enable-loadable-sqlite-extensions --with-zlib 其中--enable-loadable-sqlite-extensions是sqlite的扩展,如果需要使用的话则带上这个选项。 之后执行 vi ./Modules/Setup 找到#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz去掉注释并保存,然后进行编译和安装 make && make install 安装好Python2.7之后我们需要先把Python2.6备份起来,然后再对yum的配置进行修改,如果不进行这一步操作的话,执行yum命令将会提示你Python的版本不对。 执行以下命令,对Python2.6进行备份,然后为Python2.7创建软链接 mv /usr/bin/python /usr/bin/python2.6.6 ln -s /usr/local/bin/python2.7 /usr/bin/python 然后编辑/usr/bin/yum,将第一行的#!/usr/bin/python修改成#!/usr/bin/python2.6.6 现在执行yum命令已经不会出现之前的错误信息了。 我们执行python -V查看版本信息,如果出现错误 error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory 编辑配置文件 vi /etc/ld.so.conf 添加新的一行内容/usr/local/lib,保存退出,然后 /sbin/ldconfig /sbin/ldconfig -v 安装pip 下载最新版的pip,然后安装 wget https://bootstrap.pypa.io/get-pip.py python get-pip.py 查找pip的位置 whereis pip 找到pip2.7的路径,为其创建软链作为系统默认的启动版本 ln -s /usr/local/bin/pip2.7 /usr/bin/pip pip安装完毕,现在可以用它下载安装各种包了 :)

蓝商城简介

蓝商城

8·15 “蓝商城”盛装上线啦 专注电缆只做精品


当整个电缆行业还在为如何转型升级而苦恼时,蓝采和采购网已开始了“互联网+电缆”的探索

大事记:

  • 2015年11月

    蓝采和“开疆扩土”,将业务定位为:以电线电缆的定制、现货、电子招投标、需求链金融服务为核心的协同制造公共服务平台,完善订单汇聚、生产分配功能,为客户提供从采购、销售、支付、物流、质检及金融等相关服务为一体的一站式解决方案!

  • 2016年1月

    “蓝采和电子招投标”功能正式上线,响应市场呼唤,彻底颠覆30多年的传统招投标方式,实现各方获益多赢!

  • 2016年5月

    蓝采和需求链金融服务平台“揽金宝”重磅来袭,专注电缆行业、专业资产处置、践行产业金融,盘活供应链上下游资金链条,优化资产配置,给电缆行业呆账、坏账、烂帐致命一击,助力电缆企业资金融通。

  • 2016年8月

    “蓝商城”厚积薄发,定位以“电力电缆、裸导线、架空线、家装线”等采购和销售为主体的“现货电缆精品超市”,“专业领先、电缆精品、型号齐全、应有尽有”,同时,加速布局线下仓储业务,采购足不出户,服务无微不至。

  • 2016年11月

    蓝采和“订单采购”功能即将呼之欲出,“全流程电子交易、全透明成本组成、全环节生产监控、全方位物流追踪”,利用信息化技术来实现电缆的个性化定制、柔性化生产,实现从全球客户需求到电缆产品的直通,同时,未来将逐渐打造出基于数字化工厂技术支撑的“电缆定制模式”。

“未来要么电子商务要么无商可务。”

美国微软公司的董事长 比尔·盖茨
“电子商务最大的受益者应该是商人,我们该赚钱因为我们提供工具,但让我们做工具的人发了大财,而使用工具的人还糊里糊涂,这是不正常的。所谓新经济,就是传统企业利用好网络这个工具,去创造出更大的经济效益,使其成几十倍地增长,这才是真的新经济的到来。今天新旧经济是两张皮。”

阿里巴巴集团主席和首席执行官 马云

想查看更多关于蓝商城的信息,请浏览"蓝商城"官方网站

JFinal简介

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :)

JFinal有如下主要特点:

  • MVC架构,设计精巧,使用简单
  • 遵循COC原则,零配置,无xml
  • 独创Db + Record模式,灵活便利
  • ActiveRecord支持,使数据库开发极致快速
  • 自动加载修改后的java文件,开发过程中无需重启web server
  • AOP支持,拦截器配置灵活,功能强大
  • Plugin体系结构,扩展性强
  • 多视图支持,支持FreeMarker、JSP、Velocity
  • 强大的Validator后端校验功能
  • 功能齐全,拥有struts2的绝大部分功能
  • 体积小仅339K,且无第三方依赖

以下是JFinal实现Blog管理的示例:

1:控制器(支持FreeMarker、JSP、Velocity、JSON等以及自定义视图渲染)


  1. @Before(BlogInterceptor.class)

  2. public class BlogController extends Controller {

  3.   public void index() {

  4.     setAttr("blogList", Blog.dao.find("select * from blog"));

  5.   }

  6.  

  7.   public void add() {

  8.   }

  9.  

  10.   @Before(BlogValidator.class)

  11.   public void save() {

  12.     getModel(Blog.class).save();

  13.   }

  14.  

  15.   public void edit() {

  16.     setAttr("blog", Blog.dao.findById(getParaToInt()));

  17.   }

  18.  

  19.   @Before(BlogValidator.class)

  20.   public void update() {

  21.     getModel(Blog.class).update();

  22.   }

  23.  

  24.   public void delete() {

  25.     Blog.dao.deleteById(getParaToInt());

  26.   }

  27. }


2:Model(无xml、无annotation、无attribute、无getter、无setter)


  1. public class Blog extends Model<Blog> {

  2. }


3:Validator(API引导式校验,比xml校验方便N倍,有代码检查不易出错)


  1. public class BlogValidator extends Validator {

  2.   protected void validate(Controller controller) {

  3.     validateRequiredString("blog.title", "titleMsg", "请输入Blog标题!");

  4.     validateRequiredString("blog.content", "contentMsg", "请输入Blog内容!");

  5.   }

  6.  

  7.   protected void handleError(Controller controller) {

  8.     controller.keepModel(Blog.class);

  9.   }

  10. }


4:拦截器(在此demo中仅为示例,本demo不需要此拦截器)


  1. public class BlogInterceptor implements Interceptor {

  2.   public void intercept(Invocation inv) {

  3.     System.out.println("Before invoking " + inv.getActionKey());

  4.     inv.invoke();

  5.     System.out.println("After invoking " + inv.getActionKey());

  6.   }

  7. }


5:最新下载

三种人

人的一生总是要学习各种知识。人人都在学习,但学习方法却各有不同。
1 绝大多数人是闭门学习受填鸭式学习教育遗毒影响,独自一个人挑灯苦灯,学习吸收各种知识。
这种学习方式比较枯燥,需要比较好的耐力,毅力。
2 一部分重视通过交流学习现在网络比较发达了,许多人自觉不自觉得把自己的学习心得记录下来,并发表在网上。
3 也有人通过启发别人来启发自己其中的哲学原理,按古代说法是天人合一,物我同体;按现代说法是信息相通,沟通无极限。

通过帮助别人来帮助自己。通过启发别人来启发自己。凡有所得,必须分享。只有分享了的知识,才是真正的知识。

上面三种人,对于知识而言,
第一种人是只进不出,只是获取别人总结的知识,而基本不去帮助别人获取知识
第二种人是多进少出,在学习知识的同时,也把自己的一些心得分享出来
第三种人趋于得失平衡,认为只有分享的知识才是真正的知识,只有帮助别人也掌握的知识才是真正的知识

2016年9月12日星期一

记一次检测文件夹变为只读后的检测方法

服务器不知道什么原因,每到周六,www文件夹就变为只读,只能读取,而不能写入
为了发现这个问题,想了很多方法
   首先在该目录下创建文件
但是因为权限的问题, 每次zabbix运行,都提示权限问题,而这是不正常的报错。
为了解决这个问题,
又在文件夹中创建文件,然后在文件中写入数据,再读取出来
最后还是文件权限问题。

为了解决这个烦恼的问题,
想到了,使用ftp上传测试文件
如何上传成功,代表文件还是可写
不成功,进行报警。
然后进行处理

使用这种方法,有两个好处
1,可以在另一台机器上进行监控,防止本机进程无法运行
2,上传的文件权限不会变更,防止因权限问题导致的误报

最后,恭喜自己,总有想出了解决方案。

linux文件和目录属性

1、 Linux 文件属性概说;
Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容;

[root@localhost ~]# ls -lih
总计 104K

2408949 -rwxr-xr-x 1 root root    7 04-21 12:47 lsfile.sh
2408830 drwxr-xr-x 2 root root 4.0K 04-21 12:46 mkuml-2004.07.17
2408260 drwxr-xr-x 2 root root 4.0K 04-21 22:15 mydir
2408258 lrwxrwxrwx 1 root root    7 04-21 22:16 sun001.txt -> sun.txt
2408263 -rw-r--r-- 2 root root   11 04-20 14:17 sun002.txt
2408263 -rw-r--r-- 2 root root   11 04-20 14:17 sun.txt

解释:
第一字段:inode
第二字段:文件种类和权限;
第三字段: 硬链接个数;
第四字段: 属主;
第五字段:所归属的组;
第六字段:文件或目录的大小;
第七字段和第八字段:最后访问或修改时间;
第九字段:文件名或目录名
我们以lsfile.sh为例:

2408949 -rwxr-xr-x 1 root root    7 04-21 12:47 lsfile.sh

inode 的值是:2408949
文件类型:文件类型是-,表示这是一个普通文件; 关于文件的类型,请参考:《Linux 文件类型和文件扩展》
文件权限:文件权限是rwxr-xr-x ,表示文件属主可读、可写、可执行,文件所归属的用户组可读可执行,其它用户可读可执行;
硬链接个数: lsfile.sh这个文件没有硬链接;因为数值是1,就是他本身;
文件属主:也就是这个文件归哪于哪个用户 ,它归于root,也就是第一个root;
文件属组:也就是说,对于这个文件,它归属于哪个用户组,在这里是root用户组;
文件大小:文件大小是7个字节;
访问可修改时间 :这里的时间是最后访问的时间,最后访问和文件被修改或创建的时间,有时并不是一致的;
当然文档的属性不仅仅包括这些,这些是我们最常用的一些属性。我们把比较重要的说一说,比如文件所归属的种类、权限、硬链接个数 ... ...

2、 关于inode;
inode 译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘 ... ... )被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。
做个比喻,比如一本书,存储设备或分区就相当于这本书,Block相当于书中的每一页,inode 就相当于这本书前面的目录,一本书有很多的内容,如果想查找某部份的内容,我们可以先查目录,通过目录能最快的找到我们想要看的内容。虽然不太恰当,但还是比较形象。
当我们用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点了;比如我们前面所说的例子;

[root@localhost ~]# ls -li lsfile.sh
2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh

lsfile.sh 的inode值是 2408949 ; 查看一个文件或目录的inode,要通过ls 命令的的 -i参数。

2.10 inode 相同的文件是硬链接文件;
在Linux 文件系统中,inode值相同的文件是硬链接文件,也就是说,不同的文件名,inode可能是相同的,一个inode值可以对应多个文件。理解链接文件并不难,看看例子就会了。在Linux中,链接文件是通过ln工具来创建的。

2.11 创建硬链接,硬链接和源文件关系;
用ln 创建文件硬链接的语法:

# ln   源文件   目标文件

下面我们举一个例子,在这个例子中,我们要为sun.txt 创建其硬链接sun002.txt。然后看一下sun.txt和sun002.txt的属性的变化;
[root@localhost ~]# ls -li sun.txt   注:查看sun.txt的属性;
2408263 -rw-r--r-- 1  root root 29 04-22 21:02 sun.txt   注:这是sun.txt的属性;

[root@localhost ~]# ln  sun.txt sun002.txt  注:我们通过ln 来创建sun.txt的硬链接文件sun002.txt 

[root@localhost ~]# ls -li sun*   注:我们列一下sun.txt 和sun002.txt

2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt

我们可以看到sun.txt在没有创建硬链接文件sun002.txt的时候,其链接个数是1(也就是-rw-r--r--后的那个数值),创建了硬链接sun002.txt创建后,这个值变成了2。也就是说,我们每次为sun.txt创建一个新的硬链接文件后,其硬链接个数都会增加1。
inode值相同的文件,他们的关系是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响。比如我们把sun.txt删除后,我们还是一样能看到sun002.txt的内容,并且sun02.txt仍是存在的。
可以这么理解,互为硬链接关系的文件,他们好象是克隆体,他们的属性几乎是完全一样;
下面的例子,我们把sun.txt删除,然后我们看一下sun002.txt 是不是能看到其内容。

[root@localhost ~]# rm -rf sun.txt 
[root@localhost ~]# more sun002.txt 

注意:硬链接不能为目录创建,只有文件才能创建硬链接。

2.12 软链接的创建,及软接与源文件的关系;
创建软链接(也被称为符号链接)的语法;

# ln   -s  源文文件或目录     目标文件或目录

软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。

[root@localhost ~]# ls -li linuxsir001.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt

[root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt

[root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt

解释
上面的例子,首先我们查看 linuxsir001.txt 的属性,比如inode 、所属文件种类、创建或修改时间等... ...我们来对比一下:
首先 对比一下节点:两个文件的节点不同;
其次 两个文件的归属的种类不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一个链接文件;
第三 两个文件的读写权限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的读写权限是 rwxrwxrwx
第三 两者的硬链接个数相同;都是1
第四 两文件的属主和所归属的用户组相同;
第五 修改(或访问、创建)时间不同;
我们还注意到了linuxsir002.txt 后面有一个标记 ->,这表示linuxsir002.txt 是linuxsir001.txt的软链接文件。
值得我们注意的是:当我们修改链接文件的内容时,就意味着我们在修改源文件的内容。当然源文件的属性也会发生改变,链接文件的属性并不会发生变化。当我们把源文件删除后,链接文件只存在一个文件名,因为失去了源文件,所以软链接文件也就不存在了。这一点和硬链接是不同的;

[root@localhost ~]# rm -rf linuxsir001.txt  注:删除linuxsir001.txt 
[root@localhost ~]# ls -li linuxsir002.txt  注:查看linuxsir002 的属性;
2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt

[root@localhost ~]# more linuxsir002.txt  注:查看linuxsir002.txt的内容; 
linuxsir002.txt: 没有那个文件或目录       注:得到提示,linuxsir002.txt不存在。

上面的例子告诉我们,如果一个链接文件失去了源,就意味着他已经不存在了;
我们可以看到软链接文件,其实只是源文件的一个标记,当源文件失去时,他也就是存在了。软链接文件只是占用了inode来存储软链接文件属性等信息,但文件存储是指向源文件的。
软件链接,可以为文件或目录都适用。无论是软链接还是硬链接,都可以用rm来删除。rm工具是通用的。

3、文件类型;
当用ls指令的长格式显示文件或目录的属性时;比如:

[root@localhost ~]# ls -lih
总计 104K

2408949 -rwxr-xr-x 1 root root    7 04-21 12:47 lsfile.sh
2408830 drwxr-xr-x 2 root root 4.0K 04-21 12:46 mkuml-2004.07.17
2408260 drwxr-xr-x 2 root root 4.0K 04-21 22:15 mydir
2408258 lrwxrwxrwx 1 root root    7 04-21 22:16 sun001.txt -> sun.txt
2408263 -rw-r--r-- 2 root root   11 04-20 14:17 sun002.txt
2408263 -rw-r--r-- 2 root root   11 04-20 14:17 sun.txt

我们来看一下lsfile.sh这行,其中有这样一个字段 -rwxr-xr-x 。这个字段包括两个信息,一是文件类型,二是文件的权限;文件类型就第一个字符,lsfile.sh的文件所归属的文件种类是- 。同理 mkuml-2004.07.17的这段是drwxr-xr-x,它所归属的文件种类应该是d;sun001.txt文件呢,对应的lrwxrwxrwx,sun001.txt所归属的文件种类应该是-l 。
我们可以知道Linux文件可以分为如普通文件、目录、符号链接文件、字符和块设备文件、套接口文件等。

4、文件的权限;
Linux文件或目录的权限是和用户和用户组联系在一起的,所以理解这部份内容,您首先得了解一下Linux用户管理方面的知识 。请参考 :《Linux 用户(user)和用户组(group)管理概述》。如果您是新手,要把这篇文档的相关文档也了解一下,这对您理解本文真的很重要;
每个文件或目录都有一组9个权限位,每三位被分为一组,他们分别是属主权限位(占三个位置 )、用户组权限位(占三个位置)、其它用户权限位(占三个位置)。比如rwxr-xr-x ,我们数一下就知道是不是9个位置了,正是这9个权限位来控制文件属主、用户组以及其它用户的权限。

4.1 关于权限位;
Linux文件或目录的权限位是由 9 个权限位来控制,每三位为一组,它们分别是文件属主(Ower)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行;
文件属主: 读r、写w、执行x
用 户 组 : 读r、写w、执行x
其它用户: 读r、写w、执行x

如果权限位不可读、不可写、不可执行,是用-来表示。

对于普通文件的读、写、执行权限可以这样理解:

可读:意味着我们可以查看阅读;
可写:意味着,可以修改或删除(不过删除或修改的权限受父目录上的权限控制);
可执行:意味着如果文件就可以运行,比如二进制文件(比如命令),或脚本(要用脚本语言解释器来解释运行)。

比如:
[root@localhost ~]# ls -l lsfile.sh
-rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh

第一个字段 -rwxr-xr-x中的第一个字符是-,表示lsfile.sh是一个普通文件;
lsfile.sh的权限是 rwxr-xr-x。表示lsfile.sh文件,文件的属主root,拥有rwx(可读、可写、可执行)权限,用户组root,拥有 r-x(可读、可写)权限 ,其它用户拥有 r-x(可读、可写)权限。这9个权限连在一起就是 rwxr-xr-x,也就是说,lsfile.sh 文件,文件属主root拥有可读、可写、可执行权限,用户组root下的所有用户拥有可读可执行权限,其它用户拥有可读可执行权限。
查看文件的属性用 ls -l 文件 ;查看目录的属性是 ls -d 目录。请参考 :

4.2 改变权限的命令 chmod ;
chmod 是用来改变文件或目录权限的命令,但只有文件的属主和超级权限用户root才有这种权限。通过chmod 来改变文件或目录的权限有两种方法,一种是通过八进制的语法,另一种是通过助记语法;
举例:

[root@localhost ~]# touch linuxsir007.txt  注:创建linuxsir007.txt文件;
[root@localhost ~]# touch linuxsir008.txt  注:创建linuxsir008.txt 文件;

[root@localhost ~]# ls -lh linuxsir007.txt  linuxsir008.txt  注:查看linuxsir007.txt和linuxsir008.txt文件属性;
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt  注:linuxsir007.txt 文件属性;
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir008.txt  注:linuxsir008.txt 文件属性; 


[root@localhost ~]# chmod 755 linuxsir007.txt    注:通过八进制语法来改变linuxsir007.txt的权限;
[root@localhost ~]# chmod u+x,og+x linuxsir008.txt  注:通过助记语法来改变linuxsir008.txt的权限;
[root@localhost ~]# ls -lh linuxsir007.txt  linuxsir008.txt   注:查看linuxsir007.txt和linuxsir008.txt文件属性;

-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt  
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir008.txt

上 面例子是一个演示通过chmod的两种语法来改变权限的例子,我所要说明的是,两种方法都能达到同一目的。
这个过程是:
首先:创建linuxsir007.txt和linuxsir008.txt两个文件;
其次:查看两个文件的属性;他们的权限都是一样的,都是 rw-r--r-- ,表示文件属主可读可写、文件所归属的用户组对文件可读、其它用户可读;
第三:通过chmod的八进制语法来改变linuxsir007.txt 的权限;通过chmod的助记语法来改变linuxsir008.txt的权限; 我们用两种方法来改变linuxsir007.txt和linuxsir008.txt 文件,通过chmod的两种不同的语法来让两个文件的权限达以一致。在八进制语法中,我们用了 755 ,而在助记语法中,我们用了 u+x,og+x。虽然用了两种不同的语法,但达到的目的是一样的,最后的结果,我们可以看到两个文件的权限都是 rwxr-xr-x。也就是说文件的属主对文件有可读可写可执行的权限,文件所归属的用户组有可读可执行的权限,其它用户有可读可执行的权限。
由此我们引出了通过chmod 工具来改变文件或目录权限的的两种方法:chmod 的八进制语法,chmod的助记语法;

4.21 通过 chmod 八进制语法来改变文件或目录的权限;
我们前面已经说了,文件或目录的权限位总共有9个位置 ,文件属主、文件所归属的组占用三位和其它用户各占用三个位置。看个例子:

-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt 

说明:
属主权限位:占用三个位置,三个位置的顺序是读r、写w、执行x。如果是没有权限,则为-。在这个例子中,我们看到rwx,表示属主在三个权位上都有权限,也就是可读可写可执行;
属组权限位:占用三个位置,三个位置的顺序是读r、写w、执行x。如果是没有权限,则为-。在这个例子中,我们看到的是r-x,在写的位置上是-,表示没有写权限,文件所归属的组对文件拥有的是可读可执行,但没有写的权限。
其它用户权限位:占用三个位置 ,三个位置的顺序是读r、写w、执行x,如果是没有权限,则为-。在这个例子中,我们看其它用户的权限位是r-x,在写的位置上是-,表示没有写权限,文件所归属的组对文件拥有的是可读可执行,但没有写的权限。

chmod 的八进制语法的数字说明;
r     4
w 2
x 1
- 0
属主的权限用数字表达:属主的那三个权限位的数字加起来的总和。比如上面的例子中属主的权限是rwx ,也就是4+2+1 ,应该是7;
属组的权限用数字表达:属组的那个权限位数字的相加的总和。比如上面的例子中的r-x ,也就是4+0+1 ,应该是5;
其它用户的权限数字表达:其它用户权限位的数字相加的总和。比如上面例子中是 r-x ,也就是4+0+1 ,应该是5;

[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt 注:查看sun.txt的属性,我们看到sun.txt的权限位是rwxr-xr-x,用八进制数字表示是755 ;

[root@localhost ~]# chmod 644 sun.txt  注;我们改变它的权限为属主可读可写、属组可读、其它用户可读,也就是rw-r--r--,用数字表示就是644;

[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 2 root root 29 04-22 21:02 sun.txt 注:是不是达到目的了?是的!


每个三位的权限代码(分别是属主、属组,其它用户)组合,有8种可能;
八进制数字      权限         
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx
注解:我们可以根据上面的数字列表来组合权限,比如我想让属主拥有 rwx(所对应的数字是7),属组拥有 --x(所对应的数字是1),其它用户拥有 ---(所对应的数字是0),这样我们把各组的权限组合起来就是是 rwx--x---(对应的数字是710)。

[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 2 root root 29 04-22 21:02 sun.txt

[root@localhost ~]# chmod 710 sun.txt

[root@localhost ~]# ls -l sun.txt
-rwx--x--- 2 root root 29 04-22 21:02 sun.txt


如果我们想改变的仅仅是打开目录的权限 ,不用加任何参数。如果想把目录以下的所有文件或子目录改变,应该加-R参数;

[root@localhost ~]# ls -ld testdir/
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/

[root@localhost ~]# ls -lr  testdir/
总计 4
-rw-r--r-- 1 root root    0 04-24 11:01 sir01.txt
drwxr-xr-x 2 root root 4096 04-24 11:01 linuxsir

我们仅仅改变testdir的权限,让其拥有属主可读可写、属组可读、其它用户可读,也就是rw-r--r-- ,用八进制的算数应该是644。

[root@localhost ~]# ls -ld testdir/  注:我们查看到的testdir目录的权限是rwxr--r--;
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/  

[root@localhost ~]# chmod 644  testdir/

[root@localhost ~]# ls -ld testdir/
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/  注:改变成功;

[root@localhost ~]# ls -lr testdir/  注:我们查看一下testdir目录下的子目录是否改变了?

尝试一下改变testdir及其子目录和文件权限都要改变为 rw-r--r--权限。我们要用到-R参数;

[root@localhost ~]# chmod -R 644 testdir/ 注:我们改变testdir下所有的文件或子目录的权限都为 rw-r--r--

[root@localhost ~]# ls -ld testdir/ 
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/
[root@localhost ~]# ls -lr  testdir/
总计 4
-rw-r--r-- 1 root root    0 04-24 11:01 sir01.txt
drw-r--r-- 2 root root 4096 04-24 11:01 linuxsir

值得注意的是:chmod 改变一个目录下的所有.file时,要小心操作。比如我们要改变testdir下的所有.file 的权限为 rwxr--r--,但我们不想改变testdir目录的权限 。下面的例子操作是错误的。

[root@localhost ~]# ls -ld testdir/
drw-r--r-- 3 root root 4096 04-24 11:01 testdir/

[root@localhost ~]# ls -lr testdir/
总计 4
-rw-r--r-- 1 root root    0 04-24 11:01 sir01.txt
drw-r--r-- 2 root root 4096 04-24 11:01 linuxsir

[root@localhost ~]# chmod -R 755 testdir/.*  注:这样操作,会把testdir目录的权限一并改为  rwxr--r-- 

[root@localhost ~]# ls -ld testdir/
drwxr-xr-x 3 root root 4096 04-24 11:01 testdir/ 

所以当您想改变一个目录下的所有.file权限,并且想保留该目录的原有权限时,请不要用.*通配符。至于应该怎么做,我想大家都明白。比如下面的匹配;

[root@localhost ~]# chmod -R 644  testdir/.[a-z]*

上面的例子chmod 会匹配所有以.a到.z 开头的文件。

4.22 通过 chmod 助记语法来改变文件或目录的权限;
chmod 的助记语法相对简单,对文件或目录权限的改变时,是通过比较直观的字符的形式来完成;在助记语法中,相关字母的定义;

用户或用户组定义:
u 代表属主
g 代表属组
o 代表其它用户
a 代表属主、属组和其它用户,也就是上面三个用户(或组)的所有;

权限定义字母:

r 代表读权限;
w 代表写权限;
x 代表执行权限;

权限增减字符;
- 代表减去相关权限;
+ 代表增加相关权限;
示例一:

[root@localhost ~]# ls -l linuxsir007.txt
-rwxr-xr-x 1 root root 0 04-23 20:11 linuxsir007.txt

[root@localhost ~]# chmod ugo-x linuxsir007.txt  注:把属主、用户组及其它用户的执行权限都减掉;

[root@localhost ~]# ls -l linuxsir007.txt
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt

示例二:

[root@localhost ~]# ls -l linuxsir007.txt
-rw-r--r-- 1 root root 0 04-23 20:11 linuxsir007.txt

[root@localhost ~]# chmod u+x linuxsir007.txt  注:为文件的属主增加执行权限  

[root@localhost ~]# ls -l linuxsir007.txt  
-rwxr--r-- 1 root root 0 04-23 20:11 linuxsir007.txt

示例三:

[root@localhost ~]# ls -l linuxsir007.txt  
-rwxr--r-- 1 root root 0 04-23 20:11 linuxsir007.txt

[root@localhost ~]# chmod u-x,go+rw linuxsir007.txt  注:减去文件属主对文件的执行权,增加属组和其它用户对文件的可读可写权;

[root@localhost ~]# ls -l linuxsir007.txt
-rw-rw-rw- 1 root root 0 04-23 20:11 linuxsir007.txt

用助记语法比较灵活,组合起来比较方便;比如;
u=r+x 为文件属主添加读写权限;
ug=rwx,o=r 为属主和属组添加读、写、执行权限,为其它用户设置读权限。
a+x 为文件的属主、属组和其它用户添加执行权限;
g=u 让文件的属组和属主和权限相同;
对于目录权限的设置,要用到-R参数;
和八进制方法一样,如果我们为一个目录及其下的子目录和文件具有相同的属性,就可以用-R参数;

[root@localhost ~]# chmod -R a+rwx testdir/
[root@localhost ~]# ls -lr testdir/
总计 4
-rwxrwxrwx 1 root root    0 04-24 11:01 sir01.txt
drwxrwxrwx 2 root root 4096 04-24 11:01 linuxsir


4.3 默认权限分配的命令 umask ;
umask 是通过八进制的数值来定义用户创建文件或目录的默认权限。umask 表示的是禁止权限。不过文件和目录有点不同。

对于文件来说,umask 的设置是在假定文件拥有八进制666权限上进行,文件的权限就是是666减去umask的掩码数值;
对于目录来说,umask 的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值;

实例一:

[root@localhost ~]# umask 066

[root@localhost ~]# mkdir testdir003

[root@localhost ~]# ls -ld testdir003/
drwx--x--x 2 root root 4096 04-24 15:01 testdir003/

[root@localhost ~]# ls -lh sun998.txt
-rw------- 1 root root 0 04-25 15:57 sun998.txt

实例二:
系统用户的家目录的权限是通过在配置文件中指定的,比如Fedora 中是用的 /etc/login.defs文件;
其中有这样一段:

CREATE_HOME     yes
UMASK           077

表示的意思是,当我们创建用户时,他的家目录umask的数值是077 。我们怎么理解这个077呢。当用户添加时,系统自动在/home中创建用户的家目录,并且设置它的权限为777-077=711 ,也就是rwx------ ;我们看一下/home下的某个用户的家目录是不是这样的呢?

[root@localhost ~]# ls -ld ~beinan
drwx------ 36 beinan beinan 4096 04-24 15:08 /home/beinan

umask 一般都是放在用户相关SHELL的配置文件中,比如用户家目录下的.bashrc 或.profile ,也可以放在全局性的用户配置文件中,比如 /etc/login.defs,还可以放在SHELL全局的配置文件中,比如/etc/profile 或/etc/bashrc或/etc/csh.cshrc 等;
umask 放在相关的配置文件中,目的是当管理员创建用户时,系统会自动为用户创建文件或目录时配置默认的权限代码。

5、setuid和setgid 位;
本部份内容做为了解,看看就行了;

5.1 setuid和setgid的解说 ;
setuid 和setgid位是让普通用户可以以root用户的角色运行只有root帐号才能运行的程序或命令。比如我们用普通用户运行passwd命令来更改自己的口令,实际上最终更改的是/etc/passwd文件。我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改。

[root@localhost ~]# ls -l /etc/passwd
-rw-r--r-- 1 root root 2379 04-21 13:18 /etc/passwd

作为普通用户如果修改自己的口令通过修改/etc/passwd肯定是不可完成的任务,但是不是可以通过一个命令来修改呢。答案是肯定的,作为普通用户可以通过passwd 来修改自己的口令。这归功于passwd命令的权限。我们来看一下;

[root@localhost ~]# ls -l /usr/bin/passwd
-r-s--x--x 1 root root 21944 02-12 16:15 /usr/bin/passwd

因为/usr/bin/passwd 文件已经设置了setuid 权限位(也就是r-s--x--x中的s),所以普通用户能临时变成root,间接的修改/etc/passwd,以达到修改自己口令的权限。
我们在《Linux 系统中的超级权限的控制》中有提到过。我们知道Linux的用户管理是极为严格的,不同的用户拥有不同的权限,为了完成只有root用户才能完成的工作,我们必须为普通用户提升权限,最常用的方法就是su或sudo。虽然setuid 和setgid也是让普通用户超越自身拥有的普通权限达到root权限的方法,但我不推荐大家使用,因为它能为系统带来安全隐患!!
注意:setuid和setgid会面临风险,所以尽可能的少用,了解了解既可~~~

5.2 setuid和setgid的实例应用;
我们想让一个普通用户beinan拥有root用户拥有超级rm删除权限,我们除了用su或sudo 临时切换到 root身份操作以外,还能怎么做呢???

[root@localhost ~]#cd /home  注:进入/home目录 
[root@localhost home]# touch beinantest.txt  注:创建一个测试文件;

[root@localhost home]# ls -l beinantest.txt  注:查看文件属性;
-rw-r--r-- 1 root root 0 04-24 18:03 beinantest.txt  注:文件的属性;

[root@localhost home]# su beinan  注:切换到普通用户 beinan 
[beinan@localhost home]$ rm -rf beinantest.txt  注:以普通用户身份来删除beinantest.txt文件; 

rm: 无法删除 “beinantest.txt”: 权限不够

那我们怎么才能让beinan 这个普通用户也拥有root超级的rm 删除功力呢?

[root@localhost ~]# ls -l /bin/rm 
-rwxr-xr-x 1 root root 93876 02-11 14:43 /bin/rm 

[root@localhost ~]# chmod 4755 /bin/rm  注:设置rm的权限为4755 , 就把setuid 位设置好了。
[root@localhost ~]# ls -l /bin/rm
-rwsr-xr-x 1 root root 43980 02-11 14:43 /bin/rm

[root@localhost ~]# cd /home/
[root@localhost home]# su beinan  注:切换到beinan用户身份;
[root@localhost home]$ ls -l beinantest.txt  注:查看文件属性;
-rw-r--r-- 1 root root 0 04-24 18:03 beinantest.txt  注:文件的属性;

[beinan@localhost home]$ rm -rf beinantest.txt 注:删除beinantest.txt文件;

我们只是设置了rm的setuid位,让普通用户在rm指令上有超级root的删除超级权力。
通过这个例子,我们应该能明白setuid和setgid位的应用了,如同前面所说,让普通用户超越本身的能力,让普通用户能执行只有root才能执行的命令。在这一点,我们要和su和sudo 区分开来。请参见su和sudo的文档:《Linux 系统中的超级权限的控制》

5.3 setuid和setgid的设置方法;

第一种方法:八进制方法:
setuid位是的设置用八进制的4000,setgid占用的是八进制的2000 ;比如我们前面所说的 chmod 4755 /bin/rm 就是设置的setuid位;
至于setuid的设置方法,只是在我们通过chmod设置文件或目录权限位的八进制方法的前面多加一个数字,也就是4。比如:

[root@localhost ~]# chmod 4755 /bin/rm  注:设置rm的权限为4755 , 就把setuid 位设置好了。


作为setgid 位占用的是八进制的2000位,我们下面举个例子;

[root@localhost ~]# cd /home/
[root@localhost home]# mkdir slackdir

[root@localhost home]# ls -ld slackdir/
drwxr-xr-x 2 root root 4096 04-24 18:25 slackdir/

[root@localhost home]# chmod 2755 slackdir/

[root@localhost home]# ls -ld slackdir/
drwxr-sr-x 2 root root 4096 04-24 18:25 slackdir/

我们看到 slackdir这个目录,经过改变权限后的,目录所归属用户组的那三个权限位是 r-s。 如果我们见到的是小写的s,表明文件所归属的用户组位有执行权限x。因为我们用了2755 ,意思是说文件属主拥有可读可写可执行权限,所归属的用户组拥有可读可执行权限,并且设置了setuid,所以这时本来文件所归属的用户组拥有r-x,现在加了setgid位,就把其中的x换成了s。如果文件所归属的用户组没有执行权限,这个权限应该是S。同理setuid位的中的大写的S和小写的s,也是这个原理。见下面的例子;

[root@localhost home]# chmod 2740  slackdir/
[root@localhost home]# ls -ld slackdir/
drwxr-S--- 2 root root 4096 04-24 18:25 slackdir/

这个例子是因为目录slackdir所归属的组没有执行权限,这时本来在执行权限位上显示-,由于有了setuid,所以显示为S。
如果我们为一个文件的权限拥有 属主可读可写可执行、所归的组拥有可读可执行,其它用户可读可执行,并且同时设置setuid和setgid位,我们应该怎么运行命令呢?

[root@localhost ~]# touch gooddoc.txt

[root@localhost ~]# ls -l gooddoc.txt
-rw-r--r-- 1 root root 0 04-24 18:47 gooddoc.txt

[root@localhost ~]# chmod 6755 gooddoc.txt

[root@localhost ~]# ls -l gooddoc.txt
-rwsr-sr-x 1 root root 0 04-24 18:47 gooddoc.txt

所以,同时设置setuid和setgid,就是把setuid和setgid两个八进位的值相加 (4000+2000=6000),然后加上文件或目录的权限位的三位数值(上面的例子是755),然后通过chmod 运行就行了。所以上面例子中用了6755 。

第二种方法:通过助记语法;
还是延用chmod的助记语法,通过u+s 或u-s 来增减setuid位,同理,我们可以通过g+s 或g-s 来setgid位;

[root@localhost ~]# touch  mydoc.txt  注:创建一个文件;

[root@localhost ~]# ls -l mydoc.txt
-rw-r--r-- 1 root root 0 04-24 19:00 mydoc.txt

[root@localhost ~]# chmod u+s mydoc.txt

[root@localhost ~]# ls -l mydoc.txt
-rwSr--r-- 1 root root 0 04-24 19:00 mydoc.txt

我们也可以用file命令来查看setuid和setgid位,当然也能用file来查看文件的类型;
比如:
[root@localhost ~]# file /usr/bin/passwd

6、粘贴位及设置方法;
粘贴位的理解,我们还是先看一个例子;

[root@localhost ~]# ls -ld /tmp/

drwxrwxrwt 12 root root 4096 04-24 18:36 /tmp/

我们看到/tmp权限位最后的一个字母是 t。这就是设置了粘贴位。
粘贴位的设置,可以用八进制的1000位来设置。比如

[root@localhost ~]# mkdir googledir
[root@localhost ~]# ls -ld googledir/
drwxr-xr-x 2 root root 4096 04-24 21:59 googledir/
[root@localhost ~]# chmod 1755 googledir/
[root@localhost ~]# ls -ld googledir/
drwxr-xr-t 2 root root 4096 04-24 21:59 googledir/

也可以用chmod 的助记语法来设置。用o+t表示设置粘帖位,用o-t表示取消粘贴位;

[root@localhost ~]# ls -ld googledir/
drwxr-xr-x 2 root root 4096 04-24 21:59 googledir/

[root@localhost ~]# chmod o+t googledir/

[root@localhost ~]# ls -ld googledir/
drwxr-xr-t 2 root root 4096 04-24 21:59 googledir/

粘贴位现在也很少用了,不过对于象/tmp目录这样的,是整个系统临时文件存放在,还是有点意义。一个目录既使它的所有权限都开放rwxrwxrwx,如果是设置了粘帖位,除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除这个目录。用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
建议最好不要用!

7、文件或目录的归属关系;
文件或目录的归属关系主要定义文件归属哪个用户所有及归于哪个用户组所有。

[root@localhost ~]# ls -ld dony.txt
-rw-rw-rw- 1 root root 0 04-24 15:05 dony.txt

上面的例子表示,dony.txt 这个文件,其属主是root,归属的组是root用户组,而root用户所拥有的权限是rw-,root用户组拥有的权限是rw-。
有时我们可能不理解,为什么Linux要设置文件的属主、属组,为什么还要为属主、属组和其它用户都要设置权限呢??我们在以前的文档说过,Linux是多用户的操作系统,文件的安全性对Linux是极为重要的,Linux的安全性主要表示在用户管理和权限(用户的权限及文件的权限)管理上。

7.1 改变文件的当属关系的工具 chown ;
当我们要改变一个文件的属组,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。只有超级用户的才能改变文件的属主。
chown 语法:

#chown [选项]... [所有者][:[组]] 文件...

举例:将example.txt文件的属主改为linuxsirorg用户;

[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 root root 0 04-24 22:37 example.txt

[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 linuxsirorg root 0 04-24 22:37 example.txt

[root@localhost ~]# chown beinan:root example.txt
[root@localhost ~]# ls -l example.txt
-rw-r--r-- 1 beinan root 0 04-24 22:37 example.txt


chown 所接的新的属主和新的属组之间应该以.或:连接,属主和属组之一可以为空。如果属主为空,应该是 :属组 ;如果属组为空 就就不必需要.或:了。

[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt

[root@localhost ~]# chown beinan sun.txt  注:把sun.txt文件的属主改为beinan;

[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 beinan root 29 04-22 21:02 sun.txt 

[root@localhost ~]# chown  :beinan sun.txt  注:把sun.txt文件的属组改为beinan 

[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 beinan beinan 29 04-22 21:02 sun.txt

[root@localhost ~]# chown  root:linuxsir sun.txt   注:把sun.txt的属主改为root,把改组改为linuxsir用户组;
[root@localhost ~]# ls -l sun.txt
-rwxr-xr-x 2 root  linuxsir 29 04-22 21:02 sun.txt


chown 也提供了-R参数,这个参数对目录改变属主和属组极为有用,我们可以通过加-R参数来改变某个目录下的所有文件到新的属主或属组;

[root@localhost ~]# ls -ld mydir/ 注:查看mydir目录的属性
drwxr-xr-x 2 root root 4096 04-25 09:08 mydir/  注:我们发现此目录的属主是root用户,属组是root用户组;

[root@localhost ~]# ls -lr mydir/  注:我们查看mydir目录下的有什么文件,及他们的属主和属组; 
总计 8
-rwxr-xr-x 2 beinan      linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 beinan      linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root        root      7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 linuxsirorg root      0 04-24 22:37 example.txt
-rw-rw-rw- 1 beinan      root      0 04-24 15:05 dony.txt

[root@localhost ~]# chown -R beinan:linuxsir mydir/  注:我们修改mydir及它的下级目录和所有文件到新的用户和用户组; 

[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 beinan linuxsir 4096 04-25 09:08 mydir/

[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 beinan linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 beinan linuxsir  7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 beinan linuxsir  0 04-24 22:37 example.txt
-rw-rw-rw- 1 beinan linuxsir  0 04-24 15:05 dony.txt


值得注意的是chown 和chmod 类似,我们 改变一个目录下的所有.file时的属主和属组时要小心操作。比如我们要改变testdir及它目录下的所有.file 的属主和改组时。下面的例子操作是错误的。

[root@localhost ~]# ls -ld /root/  注:查看/root目录的属性,主要看他的属主和属组;
drwxr-xr-x 19 root root 4096 04-25 09:20 /root/  注:属主是root,属组是root用户组;

[root@localhost ~]# ls -ld /root/testdir/   注:查看/root/testdir 目录的属主和属组; 
drwxr-xr-x 2 root root 4096 04-25 09:20 /root/testdir/  注:属主是root,属组是root用户组;

[root@localhost ~]# chown -R beinan:beinan /root/testdir/.*  注:改变/root/testdir目录下的以.开头的所有文件(注:假设我们是这么想的)

[root@localhost ~]# ls -ld /root/  注:查看/root的属性;
drwxr-xr-x 19 beinan beinan 4096 04-25 09:20 /root/  注:看到了吧,testdir 目录的上组目录/root的属主和属组也改变了。

[root@localhost ~]# ls -ld /root/testdir/ 注:查看testdir
drwxr-xr-x 2 beinan beinan 4096 04-25 09:20 /root/testdir/


所以我们用.*来匹配文件时,可能会存在让chown 误操作,这样会连同父目录的属主和属组的归属关系也被改变。

7.2 改变文件的属组工具 chgrp ;
语法:

chgrp [参数选项]... 组 文件...

它的用户和chown 类似,只不过它仅是用来改变文件或目录的属组的;-R参数用于目录及目录下所有文件改变属组的。这和chown也是一样的。简单来两个例子;
例子一:

[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 1 root root 0 04-25 09:38 sun.txt

[root@localhost ~]# chgrp beinan sun.txt  注:改变sun.txt的属组为beinan用户组; 

[root@localhost ~]# ls -l sun.txt
-rw-r--r-- 1 root beinan 0 04-25 09:38 sun.txt

例子二:

[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 root root 4096 04-25 09:08 mydir/
[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 root root 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 root root 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root root  7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 root root  0 04-24 22:37 example.txt
-rw-rw-rw- 1 root root  0 04-24 15:05 dony.txt


[root@localhost ~]# chgrp -R linuxsir mydir/  注:改变所mydir及其下面所有的文件及子目录的属组为linuxsir;

[root@localhost ~]# ls -ld mydir/
drwxr-xr-x 2 root linuxsir 4096 04-25 09:08 mydir/

[root@localhost ~]# ls -lr mydir/
总计 8
-rwxr-xr-x 2 root linuxsir 29 04-22 21:02 sun.txt
-rwxr-xr-x 2 root linuxsir 29 04-22 21:02 sun002.txt
lrwxrwxrwx 1 root linuxsir  7 04-21 22:16 sun001.txt -> sun.txt
-rw-r--r-- 1 root linuxsir  0 04-24 22:37 example.txt
-rw-rw-rw- 1 root linuxsir  0 04-24 15:05 dony.txt


7.3 文件属主和属组的特殊情况 ;

[root@localhost ~]# ls -lh sungood.txt
-rw-r--r-- 1 501 502 85 04-25 13:45 sungood.txt

上面的例子是不是有点怪?因为他的属主和属组都是一个数值;这是为什么呢?出现这种情况的原因是系统中不存在与之对应的用户,所以只能以数字形式显示了。有时我们删除了用户,但没有删除其家目录,这种情况下,它的家目录的属主和属组也会变成数字;

[root@localhost ~]# userdel linuxsir

[root@localhost ~]# ls -ld /home/linuxsir
drwx------ 16 501 502 4096 03-27 02:28 /home/linuxsir


8、影响文件的读写执行的因素;
之所以把这部份的内容单列出来,是因为这部份的内容是基于我们对用户管理及文件权限了解的基础上进行的。比如一个文件的读、写、执行,它要受到哪几方面的影响。
一个文件能不能被读取,要受到它的属主、属组及其它用户权限的影响,还要受到其父目录权限的影响。我们来举个例子;

[root@localhost ~]# cd /home  注:进入/home 目录;

[root@localhost home]# mkdir redhatdir 注:创建一个目录redhatdir
[root@localhost home]# touch redhatdir/test.txt  注:创建一个文件test.txt 
[root@localhost home]# chmod 700 redhatdir/ 注:修改redhatdir的权限 ,为属主可读可写可执行,属组和其它用户无权限;

[root@localhost home]# ls -ld redhatdir/  注:查看redhatdir的属性;
drwx------ 2 root root 4096 04-25 13:01 redhatdir/

[root@localhost home]# ls -lr redhatdir/  注:查看test.txt 文件的属性;
总计 0
-rw-r--r-- 1 root root 0 04-25 13:02 test.txt

[root@localhost home]# su beinan 注:我们切换到普通用户beinan 

[beinan@localhost home]$ cd redhatdir/  注:进入redhatdir目录,以beinan用户身份。
bash: cd: redhatdir/: 权限不够

[beinan@localhost home]$ more redhatdir/test.txt
redhatdir/test.txt: 权限不够

解释:我们通过这个例子来看,为什么test.txt在其它用户权位上拥有可读权限r--,但我们用普通用户还不能查看它的内容呢?这是因为他的父目录没有其它用户的何读权限。我们是不是redhatdir目录的其它用户可读权限打开,就能让普通用户beinan能读取 test.txt的内容了呢??

[root@localhost home]# chmod 704 redhatdir/  
[root@localhost home]# ls -ld redhatdir/
drwx---r-- 2 root root 4096 04-25 13:02 redhatdir

[root@localhost home]# su beinan
[beinan@localhost home]$ cd redhatdir/
bash: cd: redhatdir/: 权限不够

看来如果不设置属组的权限,只打开属主的权限及其它用户在redhatdir目录的读权限的情况下,其它用户是不能访问的;我们应该把test.txt父目录的 redhatdir 的属主的读、写、执行要打开,还要把父目录的属组的读和执行权限打开,其它用户的读和执行权限打开,也就是要拥有 rwxr-xr-x 权限,这样文件的其它用户才能访问。

[root@localhost home]# chmod 755 redhatdir/ 
[root@localhost home]#  more  redhatdir/test.txt

好象这块说的不太清楚,如果您看不太明白,多多chmod 练习练习,也没有什么难的。
其实为文件分配权限的最终目的是让文件的属主有何权限,让属组下的用户有何权限,让其它用户有何权限。文件权限是和用户管理相关联的,所以理解这方面的内容还得了解用户管理。

9、文件被修改或被访问的时间;

[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-21 22:26 adduml02.sh

我们通过查看 文件的属性时,会发现它的时间标记,比如上面的 04-21 22:26 。这个时间并不代表文件被创建的时候,他是代表文件被访问或被修改的时间。文件被修改的时间比较好理解,比如我们可以用编辑器来修改文本文件,然后保存一下,这样文件的时间就变了。
当然也有其它的工具不修改文件的内容,只修改文件的时间,这时可以被称为访问时间。比如touch工具能达到这个目的。

[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-21 22:26 adduml02.sh

[root@localhost ~]# touch  adduml02.sh  注:更新文件的访问时间成为当前系统时间;

[root@localhost ~]# ls -l adduml02.sh
-rwxr-xr-x 1 root root 545 04-25 11:21 adduml02.sh

关于touch 的用法, 更多的请参见: man touch或touch --help

10、文件属性和文件系统属性的关系;
文件系统的特性决定着文件属性的定义和修改,比如我们通过 chattr 来锁定一个文件为不可修改或不可删除时,要用到chattr 的+i参数;这在ext2和ext3文件系统是有效的,但在reiserfs 文件系统是没有任何效果的;

[root@localhost ~]# chattr +i lsfile.sh

[root@localhost ~]# lsattr  lsfile.sh
----i-------- lsfile.sh

[root@localhost ~]# rm -rf lsfile.sh
rm: 无法删除 “lsfile.sh”: 不允许的操作

注:如果把lsfile.sh变成可修改可删除,应该用-i参数;
比如在ext3或ext2 文件系统中,我们要让一个文件只能追加内容,但不能删除。应该用chattr的+a参数。
如果您在用ext3文件系统,想查看chattr 的帮助,请man chattr 。