当前位置:   article > 正文

linux常用命令-part3_查看当前目录下的文件数量,命令是 a. count files b. ls -la | wc -l

查看当前目录下的文件数量,命令是 a. count files b. ls -la | wc -l c. find -na
中文怎么发音
Ubuntu 有奔头,乌版图
Fedora 费德勒,菲朵拉
Debian 迪扁,德槟
CentOS 桑托斯 森头斯  
   
Linux发展历史:
1) RedHat ---> 1.RedHat
               2.CentOS
               3.Fedora  桌面图形系统
   
   rpm, yum 命令


2) Debian ---> 1.Debian
               2.Ubuntu  桌面图形系统
               3.Knoppix
   
   apt-get, dpkg
   
3) Slackware --->


================================
使用find和wc命令统计代码行数
================================
wc -l `find . -name "*.js" | xargs`


查看当前目录下文件的个数 ls -l | grep "^-" | wc -l
查看当前目录下文件的个数,包括子目录里的。
ls -lR| grep "^-" | wc -l
查看某目录下文件夹(目录)的个数,包括子目录里的。
ls -lR| grep "^d" | wc -l


ls -l       长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
grep "^-"   这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
wc -l       统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数


=======================================
KB与KIB,free命令输出的是KB,不是KIB
=======================================
KB:
kilobyte(千字节),常写作KB或K,是一种资讯计量单位,现今通常在标示内存等具有一般容量的储存媒介之储存容量时使用。
1KB = 1,000Byte
1MB = 1,000KB
1GB = 1,000,000(106)KB
1TB = 1,000,000,000(109)KB
KIB:
Kibibyte是一种资讯计量单位,代表1024字节,即210字节,一般简称为KiB。Kibibyte是自来英文 kilo binary byte 的缩写,意思为“千位二进制字节”。
1KiB = 1,024Byte
1MiB = 1,024KiB
1GiB = 1,024MiB = 1,048,576 (10242)KiB
1TiB = 1,024GiB = 1,073,741,824 (10243)KiB
Byte:
字节,英文名称是Byte。Byte是Binary Term的缩写。一个字节代表八个比特。它是通常被作为计算机信息计量单位,不论被存储数据的类型为何。
Bit:
位(英语:Bit),亦称二进制位,指二进制中的一位,是信息的最小单位。Bit是Binary digit(二进制数位)的缩写
1个字节(Byte)——8个位(bit)
1个字(Word)——16个位(bit)


================================
configure,make,make install
================================
这里也简单介绍一下在Linux/Unix下安装软件的源码三部曲,在后面我们会经常看到它们的身影。
./configure  
make  
make install 


./configure是用来检查环境变量及配置编译选项的,
make是用来将源代码编译成二进制文件的,
make install则会将make编译出来的文件安装到指定位置(或默认位置)。


tail -f SystemOut.log 可以实时观测 最新产生的log,会不停的刷新屏幕。
tar -zvxf v4.tar   解压
ll     并不是linux下一个基本的命令,它实际上是ls -l的一个别名
ll -a 显示隐藏目录。
dmesg|less  查询linux内核启动时的信息
less /var/log/dmesg 




在linux递归删除某个文件夹(svn)的命令:
find . -name ".svn" -type d | xargs rm -rf 或者
find . -name ".svn" -type d -print -exec rm -rf {} ;


(1) "."表示从当前目录开始递归查找。
(2) “ -name "svn" "根据名称来查找。
(3) " -type d "查找的类型为目录
(4) "-print" 输出查找的文件目录名
(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个/,最后是一个分号。


find . -name "*.o"  | xargs rm -f
可以通过管道命令来操作,先find出主目录下想删除的文件,然后通过“xargs”这个构造参数列表并运行命令。
find named/ -name *.bak | xargs rm -f


find . -name ".svn" -type d | xargs rm -rf


==============================================
管道和命令替换的区别是:
==============================================
管道:      管道符号"|"左边命令的输出作为右边命令的输入
命令替换:  将命令替换符"``"中命令的输出作为其他命令相应位置的参数


# pstree -p `ps -e | grep server | awk '{print $1}'` | wc -l
这里利用了管道和命令替换,
就是说用``括起来的命令会优先执行,然后以其输出作为其他命令的参数,
上述就是用 ps -e | grep server | awk '{print $1}' 的输出(进程号),作为 pstree -p 的参数


--------------------
nohup 命令
--------------------
如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
nohup就是不挂断的意思( no hang up)。
用途 LINUX命令用法,不挂断地运行命令。


nohup Command [ Arg ... ] [ & ]


nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。
要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。


如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,
那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。


如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。
使用 jobs 查看任务。
使用 fg %n 关闭。


--------------------
nohup 与&区别
--------------------
1)普通的一些程序,& 结尾,终端关闭,那么程序也被关!
2)单是&, 后台运行,你关掉终端会停止运行 
3)nohup command &  后台运行,你关掉终端也会继续运行
4)一个很明显的区别是,&得后台,是终端关闭,自己也会退出,而nohup 则相当于一个独立的后台进程。 
5)nohup执行的话,不管终端机怎么操作,后台会一直执行 但是如果单&的话,终端机突然掉电或是拔网线时,后台会被堵死,无法运行


Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:
    /usr/local/mysql/bin/mysqld_safe –user=mysql &
但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,
那么程序也会被关闭。为了能够后台运行,我们需要使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:
    nohup /root/start.sh &
在shell中回车后提示:
    [~]$ appending output to nohup.out
原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。
咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。
在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:
    他是在当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;   **************重点****
    而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。
这个细节有人和我一样没注意到,所以在这儿记录一下了。




 AIX, Linux下将脚本放到后台执行——加nohup与不加nohup的区别:
 
1)对于Linux下来说,当在系统上执行下面的命令,将test.sh脚本放到后台执行
    /location/test.sh &
此时,分两种情况考虑问题,
一:继续执行exit命令退出当前session, 则 test.sh这个脚本仍然在Linux系统里面运行,
二:不执行exit命令退出,而直接断开当前连接,则 test.sh脚本会立即退出


如果使用下面命令,将test.sh脚本放到后台执行
    nohup /location/test.sh &
则,针对上面的两种情况来说,test.sh脚本都会继续在系统上运行,所以,不管什么时候如果想把脚本放到后台执行,都需要使用nohup 和 & 命令。


2)对于AIX下来说,当在系统上执行下面的命令,将test.sh脚本放到后台执行
    /location/test.sh &
此时,按照上面Linux系统下的两种情况来看
一:继续执行exit命令退出当前session, 第一次会提示"You have running jobs", 再次执行exit后,test.sh脚本也将停止运行
二:不执行exit命令退出,而直接断开当前连接,则 test.sh脚本会立即退出


如果使用下面命令,将test.sh脚本放到后台执行
    nohup /location/test.sh &
则针对上面的两种情况来说,test.sh脚本都会继续在系统上运行。


------------------------------------------------
查找目录下的所有文件中是否含有某个字符串 
------------------------------------------------
find .|xargs grep -ri "IBM" 
查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 
find .|xargs grep -ri "IBM" -l 
1.正则表达式  
  (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。 
  (2)基本元字符集及其含义 
      ^ :只匹配行首。   如^a 匹配以a开头的行abc,a2e,a12,aaa,...... 
      $ :只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,....... 
      * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,.... 
      [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345] 
      \ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等 
      .:(点)只匹配任意单字符。 
      pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa. 
      pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,..... 
      pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个 
  (3)举例说明: 
      ^$ :匹配空行 
      ^.$ :匹配包含一个字符的行 
    \*\.pas :匹配以*.pas结尾的所有字符或文件 
    [0123456789]或[0-9] :假定要匹配任意一个数字 
    [a-z] :任意小写字母 
    [A-Za-z] :任意大小写字母 
    [S,s] :匹配大小写S 
    [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义) 
2.find介绍   (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。 
  (2)find命令的一般形式 
      find pathname -options [-print -exec -ok] 
      -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录 
      -print :find命令将匹配的文件输出到标准输出 
      -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为 
        'command'{} \; (注意{}和\之间的空格) 
      -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 
    options有如下几种: 
    -name :按照文件名查找文件 
    -perm :按照文件权限来查找文件 
    -user :按照文件属主来查找文件 
    -group :按照文件所属的组来查找文件 
    -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。 
    -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。 
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在 
    -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件 
    -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找 
    -type 查找某一类型的文件,如 
      b :块设备文件 
      d:目录 
      e:字符设备文件 
      p;管道文件 
      l:符号链接文件 
      f:普通文件 
  (3)find命令举例 
      find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上 
      find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出 
      find . -perm 755 -print 查找当前目录下权限为755的文件,并输出 
      find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出 
      find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件 
      find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件 
      find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件 
      find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。 
      find /var -type d -print 查找/var目录下所有目录 
      find /var -type l -print 查找/var目录下所有的符号链接文件。 
      find . -size +1000000c -print 查找当前目录下大于1000000字节的文件 
      find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找 
      find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l 
    (4)xargs命令 
      在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个 
      find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理 
3.grep介绍   (1)grep 的一般格式为 grep [options] 基本正则表达式 [文件] 
      字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串 
      -c:只输出匹配行的记数 
      -i:不区分大小写(只适用于单个字符) 
      -h:查询多个文件时不显示文件名 
      -H:只显示文件名 
      -l:查询多文件时只输出包含匹配字符的文件名 
      -n:只显示匹配行及其行号 
      -s:不显示不存在或无匹配文本的错误信息。 
      -v:显示不包含匹配文本的所有行。 
  (2)举例说明: 
      grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行 
      grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行 
      grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行 
      grep "\?" myfile匹配myfile中含有任意字符的行 
  (3)grep命令类名 
      [[:upper:]]   表示[A-Z] 
      [[:alnum:]]   表示[0-9a-zA-Z] 
      [[:lower:]]   表示[a-z] 
      [[:space:]]   表示空格或者tab键 
      [[:digit:]]   表示[0-9] 
      [[:alpha:]]   表示[a-zA-Z] 
    如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。 
4.awk介绍 
可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。 
(1)awk命令行方式 awk [-F filed-spearator] 'command' input-files 
    awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。 
    模式部分决定动作语句何时触发及触发事件。(BEGIN,END) 
    动作对数据进行处理,放在{}内指明(print) 
(2)分隔符、域和记录 
    awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。 
(3)举例说明: 
      awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域 
      awk -F : '{print $1} test.txt |tee test.out'   同上。。只是分隔符为":" 
      awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt 
      开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:   
IPDate 
1 first 
2 second 
3 third 
end-of-report 
  (4)匹配操作符 ~ 匹配,!~ 不匹配 
      cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行 
      awk '$0!~/210.34.0.13' test.txt     匹配test.txt中不是210.34.0.13的行 
      awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。
5.sed介绍     sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 
    sed是一种很重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。 
    (1)调用sed的三种方式 
      使用sed命令行格式为:sed [options] sed命令 输入文件 
      使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件 
      sed脚本文件[options] 输入文件 
      --不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。 
    (2)sed 命令的options如下 
        -n:不打印 
        -c:下一命令是编辑命令 
        -f:如果正在调用sed脚本文件 
    (3)sed在文件中查询文本的方式 
          --使用行号,可以是一个简单的数字,或是一个行号的范围 
          --使用正则表达式 
    (4)读取文本的方式 
          x       x为一行号 
          x,y       表示行号范围从x到y 
          /pattern/     查询包含模式的行 
          /pattern/pattern/ 查询包含两个模式的行 
          pattern/,x   在给定的行号上查询包含模式的行 
          x,/pattern/   通过行号和模式查询匹配行 
          x,y!       查询不包含指定行号x和y的行 
      (5)基本sed编辑命令 
            p   打印匹配行 
            d   删除匹配行 
            =   显示文件行号 
            a\   在定位行号后附加新文本信息 
            i\   在定位行号后插入新文本信息 
            c\   用新文本替换定位文本 
            s     使用替换模式替换相应模式 
            r     从另一个文件中读文件 
            w   写文本到一个文件 
            q     第一个模式匹配完成后推出或立即退出 
            l     显示与八禁止ASCII代码等价的控制字符 
            {}   在定位行执行的命令组 
            n     从另一个文件中读文本下一行,并附加在下一行 
            g     将模式2粘贴到/pattern n/ 
            y     传送字符 
    (6)举例说明: 
          sed -n '2p' test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息) 
          sed -n '1,4p' test.txt 打印第一行到第四行的信息 
          sed -n '/los/p' test.txt模式匹配los,并打印出来 
          sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los 
          sed -n '/^$/p' test.txt 匹配空行 
          sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号 
          sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning 
          sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning 
          sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning 
          sed '1,2d' test.txt 删除第1和2行 
          sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning 
          send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello 
          send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello 
6.合并与分割(sort,uniq,join,cut,paste,split)     (1)sot命令 
        sort [options] files 许多不同的域按不同的列顺序排序 
          -c 测试文件是否已经排序 
          -m 合并两个排序文件 
          -u 删除所有同样行 
          -o 存储sort结果的输出文件名 
          -t 域分隔符,用非空格或tab开始排序 
          +n :n 为列号,使用此列号开始排序 
          -n 指定排序是域上的数字分类项 
          -r 比较求逆 
        sort -c test.txt 测试文件是否分类过 
        sort -u test.txt 排序并合并一样的行 
        sort -r test.txt 以相反的顺序排列 
        sort -t "/" +2 test.txt 以"/"分隔,第二个域开始分类 
      (2)uniq命令 
          uniq [options ] files 从一个文本文件中去除或禁止重复行 
          -u 只显示不重复行 
          -d 只显示有重复数据行,每种重复行只显示其中一行 
          -c 打印每一重复行出现次数 
          -f :n为数字,前n个域被忽略 
          uniq -f 2 test.txt 忽略前2个域 
      (3)join 命令 
          join [options] file1 file2 用来将来自两个分类文本文件的行连在一起 
          -an,n为一数字,用于连接时从文件n中显示不匹配行 
          -onm ,连接域,n为文件号,m为域号 
          -jnm,n为文件号,m为域号,使用其他域作连接域 
          -t ,域分隔符。用来设置非空格或tab键的域分隔符。 
        (4)split命令 
          split -output_file_size intput_filename output_filename 
          用来将大文件分割成小文件。 
            -b n,每个分割文件的大小n 
            -C n,每个分割文件一行最多n字节 
            -l n,每个分割文件的行数 
            -n,同-l n 
            split -10 test.txt 将test.txt分割成10行的小文件 
        (5)cut 命令 
          cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。 
          cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符


==============================================
linux下查看线程数的几种方法
==============================================
1、cat /proc/${pid}/status
2、pstree -p ${pid}
3、top -p ${pid} 再按H 或者
   直接输入 top -bH -d 3 -p ${pid}
   top -H手册中说:-H : Threads toggle
加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。
4、ps xH手册中说:H Show threads as if they were processes
这样可以查看所有存在的线程。
5、ps -mp <PID>手册中说:m Show threads after processes
这样可以查看一个进程起的线程数。


=======================
linux环境查看命令:
=======================
CPU:  cat /proc/cpuinfo,  top
进程: ps -ef
内存: cat /proc/meminfo, top, free
磁盘: df -sh, df -ht,df -lh,
磁盘分区情况: sfdisk -l, fdisk -l, parted, cat /proc/partitions,
IO:    iostat -x 1
操作系统: uname -a, cat /proc/version,more /etc/issue


[root@oam-nas ~]# more /etc/issue
Red Hat Enterprise Linux Server release 6.1 (Santiago)
Kernel \r on an \m


[root@oam-nas ~]# uname -a
Linux oam-nas 2.6.33.20 #1 SMP PREEMPT Wed Apr 3 17:07:07 CST 2013 x86_64 x86_64 x86_64 GNU/Linux


[root@oam-nas ~]# more /proc/version 
Linux version 2.6.33.20 (root@oam-nas) (gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC) ) #1 SMP PREEMPT Wed Apr 3 17
:07:07 CST 2013


如何知道自己的Linux发行版本的所支持的类型有哪些:
    以超级用户权限登陆Linux,进入/lib/modules/2.4.21-4.EL/kernel/fs/目录
    执行命令(不同Linux发行版本 的Fs目录有些不同你可以用查找FS文件夹的方法找到它):
(abigbadboy的内核版本是2.6.18-164.el5)
[root@rh root]# cd /lib/modules/2.6.18-164.el5/kernel/fs/                        
[root@localhost fs]# ls
autofs4     cramfs    ext3      fscache  hfsplus  lockd       nfsd      vfat
cachefiles  dlm       ext4      fuse     jbd      msdos       nls
cifs        ecryptfs  fat       gfs2     jbd2     nfs         squashfs
configfs    exportfs  freevxfs  hfs      jffs2    nfs_common  udf


查看开机信息: dmesg 
        Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,
        可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里
文件系统的挂载情况: cat /etc/fstab
查看文件系统:
    fdisk -l  ---查看磁盘信息以及分区表情况 或者使用 cat /proc/partitions
    df        ---当前系统剩余空间
    mount     ---查看目录挂载情况
查看某个目录的大小: du -sh /uploadimages 
系统运行情况: top,uptime
当前打开的服务: service --status-all
服务的运行级别: chkconfig --list
所有服务所占用的端口: cat /etc/services |less ------看所有服务所占用的端口
当前打开的端口: netstat -nat, netstat -tnlp
网络配置:ifconfig -a |grep add,
         ifup eth0,
         ifdown eth0,
         ethtool eth0,
         mii-tool -v eth0,
         /etc/init.d/network status,
         route, 
         /etc/sysconfig/network-scripts
         
[root@oam-nas2 yuanjs]# service network ?
用法:/etc/init.d/network {start|stop|status|restart|reload|force-reload}


环境变量: export
安装了哪些软件: rpm -qa , yum list,yum grouplist


top 看进程和cpu的使用率  
uptime 看cpu负载和系统运行时间。
free 看内存 虚拟内存 -m 是以兆为单位显示
df -hT 硬盘.查看个各个分区的使用情况,-h是以G为单位显示  -T是显示分区的系统类型
iostat -x 1 可以查看磁盘的IO信息




/sbin
/bin
/usr/sbin
/usr/bin
/usr/local/sbin
/usr/local/bin
/usr/lib64/qt-3.3/bin
/root/bin


========================
linux软件安装方式:
(dpkg,apt-get)(rpm,yum)
========================
APT --- Advanced Package Tool 
apt-get --------是debian、ubuntu发行版的包管理工具,与红帽中的yum工具非常类似。
apt-get install packagename   ---安装一个新软件包(参见下文的aptitude)
apt-get remove packagename    ---卸载一个已安装的软件包(保留配置文档)
apt-get autoremove packagename ---卸载一个已安装的软件包(删除配置文档)
软件源设置                                     /etc/apt/sources.list
更新软件源数据                                 apt-get update
更新已安装软件                                 apt-get upgrade
更换系统版本                                   apt-get dist-upgrade
通过安装包或卸载包来修复依赖错误               apt-get -f install
搜索软件源数据                                 apt-cache search foo
解压安装软件包                                 apt-get install foo
重新安装软件包                                 apt-get --reinstall install foo
删除软件包释放的内容                           apt-get remove foo
卸载软件,同时清除该软件配置文件               apt-get --purge remove foo
删除不需要的包                                 apt-get autoclean
删除所有已下载的包                             apt-get clean
自动安装编译一软件所需要的包                   apt-get build-dep foo
获取源码                                       apt-get source foo  apt-get source rox-filer
安装编译依赖                                   apt-get build-dep foo   apt-get build-dep rox-filer
解压源码                                       dpkg-source -x foo_version-revision.dsc dpkg-source -x rox_2.11-3.dsc
修改源码部分                                   nano ROX-Filer/src/main.c
创建包                                         dpkg-buildpackage -rfakeroot -b
修改软件可升级状态                             echo -e "foo hold" | dpkg --set-selections


dpkg --- Debian Packager ”的简写。为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。
         所有源自“Debian”的“Linux ”发行版都使用 “dpkg”,例如 “Ubuntu”、“Knoppix”等。是Debian软件包管理器的基础,它被伊恩·默多克创建于1993年。
         dpkg与RPM十分相似,同样被用于安装、卸载和供给.deb软件包相关的信息。dpkg本身是一个底层的工具。上层的工具,
         如APT,被用于从远程获取软件包以及处理复杂的软件包关系。 
显示DEB包信息                                  dpkg -I xx.deb
显示DEB包文件列表                              dpkg -c xx.deb
安装DEB包                                      dpkg -i xx.deb
安装DEB包(指定根目录)                        dpkg --root=<directory> -i xx.deb
显示所有已安装软件                             dpkg -l
显示已安装包信息                               dpkg -s foo
显示已安装包文件列表                           dpkg -L foo
卸载包                                         dpkg -r foo
卸载软件包并删除其配置文件                     dpkg -P foo
重新配置已安装程序                             dpkg-reconfigure foo


yum --------Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora、RedHat、CentOS中的Shell前端软件包管理器。
            基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,
            无须繁琐地一次次下载、安装。
            
[root@localhost ~]# yum update
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * c6-media: 
 * centosplus: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.163.com
file:///media/CentOS/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/CentOS/repodata/repomd.xml
Trying other mirror.
file:///media/cdrecorder/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/cdrecorder/repodata/repomd.xml
Trying other mirror.
file:///media/cdrom/repodata/repomd.xml: [Errno 14] Could not open/read file:///media/cdrom/repodata/repomd.xml
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: c6-media. Please verify its path and try again
提示没有找到YUM仓库文件,原因是镜像没有挂上或的YUM仓库路径写错了,也可能是这个YUM仓库路径无效。


解决办法:
把/etc/yum.repos.d/CentOS-Media.repo转移到其他文件夹。同时保证你的linux要能联网。
            
yum list 或者    yum grouplist  ---查找
yum install 或者 yum groupinstall ---安装
yum remove 或者  groupremove  ---卸载
yum info 或者 yum groupinfo  ---查看某包或者组的详细信息
yum deplist   ---显示软件包依赖关系


安装软件: yum install foo-x.x.x.rpm   (以foo-x.x.x.rpm为例)
删除软件:yum remove foo-x.x.x.rpm或者yum erase foo-x.x.x.rpm
升级软件:yum upgrade foo或者yum update foo
查询信息:yum info foo
搜索软件(以包含foo字段为例):yum search foo
显示软件包依赖关系:yum deplist foo


    -e 静默执行 
  -t 忽略错误
  -R[分钟] 设置等待时间
  -y 自动应答yes
  --skip-broken 忽略依赖问题
  --nogpgcheck 忽略GPG验证


  check-update 检查可更新的包
  clearn 清除全部
  clean packages 清除临时包文件(/var/cache/yum 下文件)
  clearn headers 清除rpm头文件
  clean oldheaders 清除旧的rpm头文件
  deplist 列出包的依赖
  list 可安装和可更新的RPM包
  list installed 已安装的包
  list extras 已安装且不在资源库的包
  info 可安装和可更新的RPM包 信息
  info installed 已安装包的信息(-qa 参数相似)
  install[RPM包] 安装包
  localinstall 安装本地的 RPM包
  update[RPM包] 更新包
  upgrade 升级系统
  search[关键词] 搜索包
  provides[关键词] 搜索特定包文件名
  reinstall[RPM包] 重新安装包
  repolist 显示资源库的配置
  resolvedep 指定依赖
  remove[RPM包] 卸载包


rpm -----Redhat Package Manager  OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用 -vh:显示安装进度;
rpm -ivh packagename ---安装 比如: rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm tcl-devel-8.5.7-6.el6.x86_64.rpm tcl-pgtcl-1.6.2-3.el6.x86_64.rpm
rpm -ev packagename ---卸载 比如: rpm -ev tcl 
rpm -qa |grep php 查看当前系统安装了PHP了的哪些内容。
rpm -qpl xxxxxx.rpm   怎样查看rpm安装包的安装路径  ******


如何在Fedora,CentOS,RHEL中检查RPM包的依赖性    --- http://www.linuxidc.com/Linux/2014-08/105626.htm
$ rpm -qR  tcpdump    --- 注意,这种方法只适用于已安装的包。使用RPM命令可以列出目标包所依赖的所有包.
$ rpm -qpR tcpdump-4.4.0-2.fc19.i686.rpm  --- 如果你需要检查一个未安装包的依赖关系,使用 "-qpR"参数显示该包的依赖关系。


1.如何安装rpm软件包(强行安装)
执行下面的命令:
    rpm -i your-package.rpm   或者  rpm -i --force --nodeps  your-package.rpm (强制安装)
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。 


安装过程中可能出现下面的警告或者提示: 
1)... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的:
    rpm --force -i  强制安装即可 
2)... is needed by ... 或... is not installed ... 此包需要的一些软件你没有安装可以用:
    rpm --nodeps -i  来忽略此信息 


也就是说,rpm -i --force --nodeps  可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。


2.如何卸载rpm软件包 (强行卸载)_
使用命令 rpm -ev 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm 
比如卸载软件包proftpd-1.2.8-1,可以使用下列格式: 
rpm -e proftpd-1.2.8-1 
rpm -e proftpd-1.2.8 
rpm -e proftpd- 
rpm -e proftpd 
不可以是下列格式: 
rpm -e proftpd-1.2.8-1.i386.rpm 
rpm -e proftpd-1.2.8-1.i386 
rpm -e proftpd-1.2 
rpm -e proftpd-1 


有时会出现一些错误或者警告: 
... is needed by ...   这说明这个软件被其他软件需要,不能随便卸载 
可以用:
    rpm -e --nodeps  (强制卸载)


强制卸载一个例子:
[root@A22770797 yuanjs]#  rpm -ev --nodeps httpd-2.2.15-9.el6.x86_64
warning: /etc/httpd/conf/httpd.conf saved as /etc/httpd/conf/httpd.conf.rpmsave
[root@A22770797 yuanjs]# rpm -qa|grep httpd
httpd-tools-2.2.15-9.el6.x86_64
[root@A22770797 yuanjs]# rpm -ivh httpd-2.2.15-9.el6.x86_64.rpm 
warning: httpd-2.2.15-9.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                ########################################### [100%]
   1:httpd                  ########################################### [100%]
[root@A22770797 yuanjs]# apachectl -v
Server version: Apache/2.2.15 (Unix)
Server built:   Apr  9 2011 08:58:28


====================================================================
Linux下which、whereis、locate、find 命令的区别
====================================================================
which      查看可执行文件的位置 : which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件 
whereis    配合数据库查看文件的位置 
locate     配合数据库查看文件的位置 
find       实际搜寻硬盘查询文件名称 


1、which 
语法: 
[root@redhat ~]# which 可执行文件名称 
例如: 
[root@redhat ~]# which passwd 
/usr/bin/passwd 
which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件 


2、whereis 
语法: 
[root@redhat ~]# whereis [-bmsu] 文件或者目录名称 
参数说明: 
-b : 只找二进制文件 
-m:  只找在说明文件manual路径下的文件 
-s : 只找source源文件 
-u : 没有说明文档的文件 
例如: 
[root@redhat ~]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 
将和passwd文件相关的文件都查找出来 


[root@redhat ~]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd 
只将二进制文件查找出来 


和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 
但是该数据库文件并不是实时更新,默认情况下是一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 


3、 locate 
语法: 
[root@redhat ~]# locate 文件或者目录名称 
例如: 
[root@redhat ~]# locate passwd 
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passwd.jsp 
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_admin_war/admin.war/jsp/platform/passwd.jsp 
/lib/security/pam_unix_passwd.so 
/lib/security/pam_passwdqc.so 
/usr/include/rpcsvc/yppasswd.x 
/usr/include/rpcsvc/yppasswd.h 
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph 
/usr/lib/kde3/kded_kpasswdserver.la 
/usr/lib/kde3/kded_kpasswdserver.so 
/usr/lib/ruby/1.8/webrick/httpauth/htpasswd.rb 
/usr/bin/vncpasswd 
/usr/bin/userpasswd 
/usr/bin/yppasswd 
………… 


4、 find 
语法: 
[root@redhat ~]# find 路径 参数 


参数说明: 


时间查找参数: 
-atime n :将n*24小时内存取过的的文件列出来 
-ctime n :将n*24小时内改变、新增的文件或者目录列出来 
-mtime n :将n*24小时内修改过的文件或者目录列出来 
-newer file :把比file还要新的文件列出来 
名称查找参数: 
-gid n       :寻找群组ID为n的文件 
-group name  :寻找群组名称为name的文件 
-uid n       :寻找拥有者ID为n的文件 
-user name   :寻找用户者名称为name的文件 
-name file   :寻找文件名为file的文件(可以使用通配符) 


例如: 
[root@redhat ~]# find / -name zgz 
/home/zgz 
/home/zgz/zgz 
/home/weblogic/bea/user_projects/domains/zgz 
/home/oracle/product/10g/cfgtoollogs/dbca/zgz 
/home/oracle/product/10g/cfgtoollogs/emca/zgz 
/home/oracle/oradata/zgz 


[root@redhat ~]# find / -name '*zgz*' 
/home/zgz 
/home/zgz/zgz1 
/home/zgz/zgzdirzgz 
/home/zgz/zgz 
/home/zgz/zgzdir 
/home/weblogic/bea/user_projects/domains/zgz 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00006 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00002 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00004 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00008 
/home/weblogic/bea/user_projects/domains/zgz/zgz.log00005 


当我们用whereis和locate无法查找到我们需要的文件时,可以使用find,但是find是在硬盘上遍历查 找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用whereis和locate。 


locate   是在数据库里查找,数据库大至每天更新一次。 
whereis  可以找到可执行命令和man page 
find     就是根据条件查找文件。 
which    可以找到可执行文件和别名(alias) 


==================================
linuxshell中"2>&1"含义(重要)
==================================
脚本是:
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &  "把标准错误输出重定向到标准输出,然后扔到/DEV/NULL下面去。"
对于&1 更准确的说应该是文件描述符 1,而1一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result,
然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.
其中:
0表示键盘输入,
1表示屏幕输出,
2表示错误输出.
把标准错误输出重定向到标准输出,然后扔到/DEV/NULL下面去。


通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。


command >out.file 2>&1 &
1. command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。
2. 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。
3. 最后一个&,是让该命令在后台执行。


试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.


---------------------------------------------------------------------------------------------------
你可以用
 ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
 ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
 ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
 ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。


Question:
1) 为何2>&1要写在后面?
    command > file 2>&1
 
  首先是command > file将标准输出重定向到file中, 
2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。


2) command 2>&1 >file
  2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。
 
用strace可以看到:
1. command > file 2>&1
这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)
2. command 2>&1 >file
这个命令中实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)
可以考虑一下不同的dup2()调用序列会产生怎样的文件共享结构。




================================================
/dev/zero和/dev/null的区别
================================================
使用/dev/null:
把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.


使用/dev/zero: 
像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.


/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。


/dev/null------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
/dev/zero------该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。


dd --- disk dump
$dd if=/dev/zero of=./test.txt bs=1k count=1
$ ls -l
total 4
-rw-r--r--     1 oracle    dba           1024 Jul 15 16:56 test.txt




禁止标准输出. 
1 cat $filename >/dev/null
2 # 文件内容丢失,而不会输出到标准输出.


禁止标准错误 (来自例子 12-3).    
1 rm $badname 2>/dev/null
2 #           这样错误信息[标准错误]就被丢到太平洋去了.


禁止标准输出和标准错误的输出.   
1 cat $filename 2>/dev/null >/dev/null
2 # 如果"$filename"不存在,将不会有任何错误信息提示.
3 # 如果"$filename"存在, 文件的内容不会打印到标准输出.
4 # 因此Therefore, 上面的代码根本不会输出任何信息.
5 #
6 # 当只想测试命令的退出码而不想有任何输出时非常有用。
7 #
8 #
9 # cat $filename &>/dev/null
10 # 也可以, 由 Baris Cicek 指出.


Deleting contents of a file, but preserving the file itself, with all attendant permissions (from Example 2-1 and Example 2-3):    
1 cat /dev/null > /var/log/messages
2 #: > /var/log/messages   有同样的效果, 但不会产生新的进程.(因为:是内建的)

4 cat /dev/null > /var/log/wtmp


自动清空日志文件的内容 (特别适合处理这些由商业Web站点发送的讨厌的"cookies"):
--------------------------------------------------------------------------------


例子 28-1. 隐藏cookie而不再使用
1 if [ -f ~/.netscape/cookies ] # 如果存在则删除.
2 then
3   rm -f ~/.netscape/cookies
4 fi

6 ln -s /dev/null ~/.netscape/cookies
7 # 现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.


--------------------------------------------------------------------------------
使用/dev/zero 
像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.
--------------------------------------------------------------------------------


例子 28-2. 用/dev/zero创建一个交换临时文件
1 #!/bin/bash
2 # 创建一个交换文件.

4 ROOT_UID=0         # Root 用户的 $UID 是 0.
5 E_WRONG_USER=65    # 不是 root?

7 FILE=/swap
8 BLOCKSIZE=1024
9 MINBLOCKS=40
10 SUCCESS=0
11 
12 
13 # 这个脚本必须用root来运行.
14 if [ "$UID" -ne "$ROOT_UID" ]
15 then
16   echo; echo "You must be root to run this script."; echo
17   exit $E_WRONG_USER
18 fi 
19   
20 
21 blocks=${1:-$MINBLOCKS}          # 如果命令行没有指定,
22                                  #+ 则设置为默认的40块.
23 # 上面这句等同如:
24 # --------------------------------------------------
25 # if [ -n "$1" ]
26 # then
27 #   blocks=$1
28 # else
29 #   blocks=$MINBLOCKS
30 # fi
31 # --------------------------------------------------
32 
33 
34 if [ "$blocks" -lt $MINBLOCKS ]
35 then
36   blocks=$MINBLOCKS              # 最少要有 40 个块长.
37 fi 
38 
39 
40 echo "Creating swap file of size $blocks blocks (KB)."
41 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.
42 
43 mkswap $FILE $blocks             # 将此文件建为交换文件(或称交换分区).
44 swapon $FILE                     # 激活交换文件.
45 
46 echo "Swap file created and activated."
47 
48 exit $SUCCESS


--------------------------------------------------------------------------------


关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 (loopback device) (参考例子 13-8) 或"安全地" 删除一个文件(参考例子 12-55).
--------------------------------------------------------------------------------


例子 28-3. 创建ramdisk
1 #!/bin/bash
2 # ramdisk.sh

4 # "ramdisk"是系统RAM内存的一段,
5 #+ 它可以被当成是一个文件系统来操作.
6 # 它的优点是存取速度非常快 (包括读和写).
7 # 缺点: 易失性, 当计算机重启或关机时会丢失数据.
8 #+       会减少系统可用的RAM.
9 #
10 # 那么ramdisk有什么作用呢?
11 # 保存一个较大的数据集在ramdisk, 比如一张表或字典,
12 #+ 这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.
13 
14 
15 E_NON_ROOT_USER=70             # 必须用root来运行.
16 ROOTUSER_NAME=root
17 
18 MOUNTPT=/mnt/ramdisk
19 SIZE=2000                      # 2K 个块 (可以合适的做修改)
20 BLOCKSIZE=1024                 # 每块有1K (1024 byte) 的大小
21 DEVICE=/dev/ram0               # 第一个 ram 设备
22 
23 username=`id -nu`
24 if [ "$username" != "$ROOTUSER_NAME" ]
25 then
26   echo "Must be root to run ""`basename $0`""."
27   exit $E_NON_ROOT_USER
28 fi
29 
30 if [ ! -d "$MOUNTPT" ]         # 测试挂载点是否已经存在了,
31 then                           #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
32   mkdir $MOUNTPT               #+ 因为前面已经建立了.
33 fi
34 
35 dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # 把RAM设备的内容用零填充.
36                                                       # 为何需要这么做?
37 mke2fs $DEVICE                 # 在RAM设备上创建一个ext2文件系统.
38 mount $DEVICE $MOUNTPT         # 挂载设备.
39 chmod 777 $MOUNTPT             # 使普通用户也可以存取这个ramdisk.
40                                # 但是, 只能由root来缷载它.
41 
42 echo """$MOUNTPT"" now available for use."
43 # 现在 ramdisk 即使普通用户也可以用来存取文件了.
44 
45 # 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
46 #
47 # 拷贝所有你想保存文件到一个常规的磁盘目录下.
48 
49 # 重启之后, 运行这个脚本再次建立起一个 ramdisk.
50 # 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.
51 
52 # 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,
53 #+ 以使系统启动时能自动设立一个ramdisk.
54 # 这样很合适速度要求高的数据库服务器.
55 
56 exit 0


--------------------------------------------------------------------------------
最后值得一提的是, ELF二进制文件利用了/dev/zero.
/dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
/dev/zero,是一个输入设备,你可你用它来初始化文件。
/dev/null------它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
/dev/zero------该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
$if=/dev/zero of=./test.txt bs=1k count=1
$ ls -l
total 4
-rw-r--r--     1 oracle    dba           1024 Jul 15 16:56 test.txt


eg,find / -name access_log   2>/dev/null
这样,一些诸如一些错误信息就不会显示出来。




===============================
硬链接和软链接的区别
===============================
一.链接文件
    链接有两种方式,软链接和硬链接。
1.软链接文件
  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
    链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归。
  用ln -s 命令可以生成一个软连接,如下:
    ------------------------------------------------------------
  ln -s  source_file softlink_file
    ------------------------------------------------------------
  在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身。
2.硬链接文件
  info ln 命令告诉您,硬链接是已存在文件的另一个名字(A "hard link" is another name for an existing file),这多少有些令人困惑。
    硬连接的命令是:
    ------------------------------
  ln -d existfile newfile
    ------------------------------
  硬链接文件有两个限制
  1)、不允许给目录创建硬链接;
  2)、只有在同一文件系统中的文件之间才能创建链接。
  对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。
    这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。
    
二.两者之间的区别
硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。
在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要  文件,以防止“误删”的功能。
其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个
连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。
软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。


========================
Linux下chkconfig命令详解
========================
查看哪些服务打开了:sysv的服务可以用 chkconfig --list 来查看
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。
使用语法:
chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]


chkconfig在没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。
如果是,返回true,否则返回false。
如果在服务名后面指定了on,off或者reset,那么chkconfig 会改变指定服务的启动信息。
on和off分别指服务被启动和停止,reset指重置服务的启动信息,无论有问题的初始化脚本指定了什么。
on和off开关,系统默认只对运行级3,4,5有效,但是reset可以对所有运行级有效。


参数用法:
   --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
   --del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据。
   --level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关毕。
      等级0表示:表示关机
      等级1表示:单用户模式
      等级2表示:无网络连接的多用户命令行模式
      等级3表示:有网络连接的多用户命令行模式
      等级4表示:不可用
      等级5表示:带图形界面的多用户模式
      等级6表示:重新启动
      需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。


    chkconfig --list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
    chkconfig --add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
    chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。
    chkconfig [--level levels] name:设置某一服务在指定的运行级是被启动,停止还是重置。


运行级文件:
每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 - 代替运行级。第二行对服务进行描述,可以用\ 跨行注释。
例如,random.init包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
# higher quality random number generation.


使用范例:
chkconfig --list        #列出所有的系统服务
chkconfig --add httpd        #增加httpd服务
chkconfig --del httpd        #删除httpd服务
chkconfig --level httpd 2345 on        #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态
chkconfig --list        #列出系统所有的服务启动情况
chkconfig --list mysqld        #列出mysqld服务设置情况
chkconfig --level 35 mysqld on        #设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭
chkconfig mysqld on        #设定mysqld在各等级为on,“各等级”包括2、3、4、5等级


如何增加一个服务:
1.服务脚本必须存放在/etc/init.d/目录下;
2.chkconfig --add servicename
    在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
3.chkconfig --level 35 mysqld on
    修改服务的默认启动等级。
    
===============
 执行等级    
===============
[root@localhost ~]# cat /etc/inittab


# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)


========================
Linux命令:declare
========================
功能说明:声明 shell 变量。
语 法:declare [+/-][afrix]
补充说明:declare为shell指令,在第一种语法中可用来声明变量并设置变量的属性([rix]即为变量的属性),在第二种语法中可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。
参 数:
  +/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
  -a 定义为数组array
  -f 定义为函数function
  -i 定义为整数integer
  -r 定义为只读
  -x 定义为通过环境输出变量


declare -x XMLRPC_TRACE_XML=1 
declare +x XMLRPC_TRACE_XML


ATA --->PATA(IDE)
ATA --->SATA
SCSI --->SAS


hdb中的h代表IDE,如果显示为sdb,则代表SATA和SCSI
最后一个字幕b代表Primary总线,第二块硬盘即Slave位置


hda1  (IDE1:hard disk ) /boot 分区
hda2  (IDE1:hard disk )  /    分区
hdb   (IDE2)
sda   (SCSI1)
sdb   (SCSI2)


软盘一般为/dev/fd0 fd1,硬盘一般为/dev/hda hdb ,硬盘逻辑分区一般为期hda1 hda2…等等,光盘一般为/dev/hdc
swap分区、/ 分区和 /boot分区


more /etc/passwd  查看用户名和组
more /etc/group  查看组
more /etc/hosts   
more /etc/issue  查看OS版本
more /etc/networks
more /etc/protocols
more /etc/rpc
more /etc/services
more /etc/shadow  映射口令信息


chmod -R 777 xstart      recursive 递归的改变所有的权限。
chmod -R +x /opt  将/opt下所有目录、文件及其子目录文件设置为可执行权限(+X)。


chown root:root xstart   
chown -R root:root /opt 将/opt下所有目录及其子目录设置为root所拥有。


清除Linux防火墙:iptables -F     service iptables stop


--------------------------------------------------
指令名称 : chmod 
使用权限 : 所有使用者 
--------------------------------------------------
使用方式 : chmod [-cfvR] [--help] [--version] mode file... 
说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 
参数 : 
mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中 
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 
-c : 若该档案权限确实已经更改,才显示其更改动作 
-f : 若该档案权限无法被更改也不要显示错误讯息 
-v : 显示权限变更的详细资料 
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) 
--help : 显示辅助说明 
--version : 显示版本 
范例 :将档案 file1.txt 设为所有人皆可读取 : 
chmod ugo+r file1.txt  
将档案 file1.txt 设为所有人皆可读取 : 
chmod a+r file1.txt  
将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : 
chmod ug+w,o-w file1.txt file2.txt  
将 ex1.py 设定为只有该档案拥有者可以执行 : 
chmod u+x ex1.py  
将目前目录下的所有档案与子目录皆设为任何人可读取 : 
chmod -R a+r *  
此外chmod也可以用数字来表示权限如 chmod 777 file 


语法为:chmod abc file 
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 
r=4,w=2,x=1 
若要rwx属性则4+2+1=7; 
若要rw-属性则4+2=6; 
若要r-x属性则4+1=7。 
范例: 
chmod a=rwx file  
和 
chmod 777 file  
效果相同 
chmod ug=rwx,o=x file  
和 
chmod 771 file  
效果相同 
若用chmod 4755 filename可使此程序具有root的权限


--------------------------------------------------
env命令:
--------------------------------------------------
#!/usr/local/bin/python
在 #!之后写上Python 解释器的完整路径
有一个更好的方案, 许多Unix 系统有一个命令叫 env, 位于 /bin 或 /usr/bin 中。它
会帮你在系统搜索路径中找到 python 解释器。 如果你的系统拥有 env, 你的启动行就可以改
为下面这样:
#!/usr/bin/env python
或者, 如果你的 env 位于 /bin 的话,
#!/bin/env python


[root@oam-nas2 yuanjs]# which env
/bin/env
[root@oam-nas2 yuanjs]# env --help
Usage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
Set each NAME to VALUE in the environment and run COMMAND.


  -i, --ignore-environment  start with an empty environment
  -0, --null           end each output line with 0 byte rather than newline
  -u, --unset=NAME     remove variable from the environment
      --help     display this help and exit
      --version  output version information and exit


A mere - implies -i.  If no COMMAND, print the resulting environment.


Report env bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report env translation bugs to <http://translationproject.org/team/>
For complete documentation, run: info coreutils 'env invocation'


看群晖的:
DiskStation> env
SSH_CLIENT=192.168.56.1 3402 22
MAIL=/var/mail/admin
USER=admin
OLDPWD=/var/services/homes/admin
HOME=/var/services/homes/admin
SSH_TTY=/dev/pts/0
PAGER=more
LOGNAME=admin
TERM=xterm
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin
SHELL=/bin/sh
PWD=/
SSH_CONNECTION=192.168.56.1 3402 192.168.56.101 22
PGDATA=/var/service/pgsql
TZ=CST-8


看OMV:
root@openmediavault:/var/lib/php5# su openmediavault
$ env
LANGUAGE=zh_CN:zh
USER=openmediavault
SSH_CLIENT=192.168.56.1 2626 22
MAIL=/var/mail/openmediavault
SHLVL=1
OLDPWD=/tmp
HOME=/home/openmediavault
SSH_TTY=/dev/pts/0
LOGNAME=openmediavault
_=/bin/su
TERM=xterm
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
LANG=zh_CN.UTF-8
SHELL=/bin/sh
PWD=/var/lib/php5
SSH_CONNECTION=192.168.56.1 2626 192.168.56.102 22
$ exit
root@openmediavault:/var/lib/php5# env
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=192.168.56.1 2626 22
SSH_TTY=/dev/pts/0
USER=root
MAIL=/var/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/var/lib/php5
LANG=zh_CN.UTF-8
SHLVL=1
HOME=/root
LANGUAGE=zh_CN:zh
LOGNAME=root
SSH_CONNECTION=192.168.56.1 2626 192.168.56.102 22
_=/usr/bin/env
OLDPWD=/tmp


===================================================
/etc/passwd 文件内容详细解释
===================================================
1、/etc/passwd包含用户信息
2、/etc/shadow包含passwd里面用户对应的密码
3、/etc/group包含组信息
4、/etc/gshadow包含组加密信息
5、*-应该是相应文件的备份,如果误操作可用此文件恢复:
/etc/passwd-
/etc/group-
/etc/shadow-
/etc/gshadow-
6、diff group group-看两个文件的区别。


程序用户账号的UID号默认在1-499之间,500-60000的UID号默认分配给普通用户账号使用。
而程序组账号的GID号默认在1-499之间,普通组账号使用的UID号默认为500-60000.
普通用户、组账号使用的默认UID、GID号范围定义在配置文件“/etc/login.defs”中。


系统帐号就是系统用的帐号,区别于个人帐号。其实就是一个帐号,和普通的个人帐号区别就是这个 ID 是系统程序用的。
Linux 下面的每个程序都是要有用户帐号来运行的,一些对外提供服务的程序,为了安全做隔离,都会用非 root 帐号来运行,这些非 root 帐号,专门用来跑程序的帐号,就是系统帐号。
其实这些程序也可以用一般的个人帐号来跑,不过一旦服务程序被攻破,这个帐号的个人数据也就会暴露了。
一般说来,系统帐号的帐号编号都是 <500 的,不过其实并不绝对。(uid 500前的系统用户,500后的创建的)




/etc/passwd  是存放用户的地方


用户名: 密码 : uid  : gid :用户描述:主目录:登陆shell
1        2      3      4     5         6        7


root:  x  : 0  :  0  : root : / root :  /  bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


 
UID : 每个用户必须被分配一个userid,”0”为root保留ID.
1-99为系统保留,分配给系统预定义帐号. HP-UX10.20支持2 147 483 646. HP-UX10.20以前支持不大于60000个.
系统中有一类用户称为伪用户(psuedo users),这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如表8-1所示。
表8-1 /etc/passwd文件中常见的伪用户
伪  用  户
含     义
bin
拥有可执行的用户命令文件
sys
拥有系统文件
adm
拥有帐户文件
uucp
UUCP使用
lp
lp或lpd子系统使用
nobody
NFS使用
除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。


/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开。这些字段是:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:


useradd -g mysql -d /home/test -m test(:新建一个用户test, 属于mysql组,开始目录是/home/test)


===================================================
Linux下passwd和shadow文件内容详解 
===================================================
一、/etc/passwd
/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式: 
name:password:uid:gid:comment:home:shell 
name 用户登录名 
password 用户口令。此域中的口令是加密的,常用x表示。当用户登录系统时,系统对输入的口令采取相同的算法,与此域中的内容进行比较。如果此域为空,表明该用户登录时不需要口令。 
uid 指定用户的 UID。用户登录进系统后,系统通过该值,而不是用户名来识别用户。 
gid GID。如果系统要对相同的一群人赋予相同的权利,则使用该值。 
comment 用来保存用户的真实姓名和个人细节,或者全名。 
home 指定用户的主目录的绝对路径。 
shell 如果用户登录成功,则要执行的命令的绝对路径放在这一区域中。它可以是任何命令。
如果/etc/passwd文件存放的是用户的信息,由6个分号组成的7个信息,解释如下 
(1):用户名。 
(2):密码(已经加密) 
(3):UID(用户标识),操作系统自己用的 
(4):GID组标识。 
(5):用户全名或本地帐号 
(6):开始目录 
(7):登录使用的Shell,就是对登录命令进行解析的工具。
例如:abc:x:501:501::/home/abc:/bin/bash


二、/etc/shadow
如果查看/etc/shadow文件存放的特殊帐号信息如下: 
name:!!:13675:0:99999:7:::  
每一行给一个特殊帐户定义密码信息,每个字段用 : 隔开。 
字段 1 定义与这个 shadow 条目相关联的特殊用户帐户。 
字段 2 包含一个加密的密码。 
字段 3 自 1/1/1970 起,密码被修改的天数 
字段 4 密码将被允许修改之前的天数(0 表示“可在任何时间修改”) 
字段 5 系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”) 
字段 6 密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”) 
字段 7 密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”) 
字段 8 该帐户被禁用的天数(-1 表示“该帐户被启用”) 
字段 9 保留供将来使用


如果查看/etc/shadow下存放的普通帐号信息如下: 
(1):帐号名称 
(2):密码:这里是加密过的,但高手也可以解密的。要主要安全问题(代!符号标识该帐号不能用来登录) 
(3):上次修改密码的日期 
(4):密码不可被变更的天数 
(5):密码需要被重新变更的天数(99999表示不需要变更) 
(6):密码变更前提前几天警告 
(7):帐号失效日期 
(8):帐号取消日期 
(9):保留条目,目前没用 
例如:abc:!!:14768:0:99999:7:::


===================================================
详细解说/etc/group /etc/passwd /etc/shadow文件
===================================================
特别注意:
useradd –g users –G administrators admin
新增一个用户admin, 主组是users, 附组是administrators, 有个主组合附组的区别。小g时主组,大G是附组。附组信息会存放在/etc/group之中,主组信息只会存放在/etc/passwd中。




在Linux中,用户(User)和用户组(Group)的配置文件,是作为系统管理员的你最应该了解和掌握的系统基础文件之一。从另一方面来说,了解这些文件也是系统安全管理的重要组成部份,作为一个合格的系统管理员一定要对用户和用户组配置文件了解透彻才行;
一、用户(User)相关:
  谈到用户,就不得不谈用户管理、用户配置文件、以及用户查询和管理的控制工具;用户管理主要通过修改用户配置文件完成,用户管理控制工具最终目的也是为了修改用户配置文件。
  那么,什么是用户查询和管理控制工具呢?用户查询和控制工具是查询、添加、修改和删除用户等系统管理工具,比如查询用户的id和finger命
令,添加用户的useradd 或adduser 、userdel 用户的删除 、设置密码的passwd命令 、修改用户usermod
等等;我们需要知道的是通过用户查询和控制工具所进行的动作的最终目的也是修改用户配置文件;所以我们进行用户管理的时候,直接修改用户配置文件一样可以
达到用户管理的目的。
  了解了上面所说的,我们便能实实在在的感觉到用户(User)配置文件的重要性:其实用户和用户组在系统管理中是不可分割的,但为了说明问题,
我们还是得把用户(User)的配置文件单列出来解说,其中包括/etc/passwd 和/etc/shadow
文件;在这之中,你还能了解UID的重要性;
  通过本标题,您可以了解或掌握的内容有:了解/etc/passwd和/etc/shadow;什么UID ;
  与用户相关的系统配置文件主要有/etc/passwd
和/etc/shadow,其中/etc/shadow是用户资讯的加密文件,比如用户的密码口令的加密保存等;/etc/passwd
和/etc/shadow 文件是互补的;我们可以通过对比两个文件来差看他们的区别;
  1、关于/etc/passwd 和 UID;
  /etc/passwd 是系统识别用户的一个文件,做个不恰当的比喻,/etc/passwd
是一个花名册,系统所有的用户都在这里有登录记载;当我们以beinan 这个账号登录时,系统首先会查阅 /etc/passwd
文件,看是否有beinan 这个账号,然后确定beinan的UID,通过UID 来确认用户和身份,如果存在则读取/etc/shadow
影子文件中所对应的beinan的密码;如果密码核实无误则登录系统,读取用户的配置文件;
  1)/etc/passwd 的内容理解:
  在/etc/passwd 中,每一行都表示的是一个用户的信息;一行有7个段位;每个段位用:号分割,比如下面是我的系统中的/etc/passwd 的两行:
   beinan:x:500:500:beinan sun:/home/beinan:/bin/bash
   linuxsir:x:501:502::/home/linuxsir:/bin/bash
  第一字段:用户名(也被称为登录名);在上面的例子中,我们看到这两个用户的用户名分别是 beinan 和linuxsir;
  第二字段:口令;在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中;
  第三字段:UID ;请参看本文的UID的解说;
  第四字段:GID;请参看本文的GID的解说;
  第五字段:用户名全称,这是可选的,可以不设置,在beinan这个用户中,用户的全称是beinan sun ;而linuxsir 这个用户是没有设置全称;
  第六字段:用户的家目录所在位置;beinan 这个用户是/home/beinan ,而linuxsir 这个用户是/home/linuxsir ;
  第七字段:用户所用SHELL 的类型,beinan和linuxsir 都用的是 bash ;所以设置为/bin/bash ;
  2)关于UID 的理解:
  UID 是用户的ID 值,在系统中每个用户的UID的值是唯一的,更确切的说每个用户都要对应一个唯一的UID
,系统管理员应该确保这一规则。系统用户的UID的值从0开始,是一个正整数,至于最大值可以在/etc/login.defs
可以查到,一般Linux发行版约定为60000; 在Linux 中,root的UID是0,拥有系统最高权限;
  UID 在系统唯一特性,做为系统管理员应该确保这一标准,UID
的唯一性关系到系统的安全,应该值得我们关注!比如我在/etc/passwd 中把beinan的UID
改为0后,你设想会发生什么呢?beinan这个用户会被确认为root用户。beinan这个帐号可以进行所有root的操作;
  UID 是确认用户权限的标识,用户登录系统所处的角色是通过UID 来实现的,而非用户名,切记;把几个用户共用一个UID
是危险的,比如我们上面所谈到的,把普通用户的UID 改为0,和root共用一个UID
,这事实上就造成了系统管理权限的混乱。如果我们想用root权限,可以通过su或sudo来实现;切不可随意让一个用户和root分享同一个UID ;
  UID是唯一性,只是要求管理员所做的,其实我们修改/etc/passwd 文件,可以修改任何用户的UID的值为0,
  一般情况下,每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用,虚拟用户一般是系统安装时就有的,是为了完成系统任务所必须的用户,但虚拟用户是不能登录系统的,比如ftp、nobody、adm、rpm、bin、shutdown等;
  在Fedora 系统会把前499 个UID和GID 预留出来,我们添加新用户时的UID
从500开始的,GID也是从500开始,至于其它系统,有的系统可能会把前999UID和GID预留出来;以各个系统中/etc/login.defs
中的 UID_MIN 的最小值为准; Fedora 系统 login.defs的UID_MIN是500,而UID_MAX
值为60000,也就是说我们通过adduser默认添加的用户的UID的值是500到60000之间;而Slackware
通过adduser不指定UID来添加用户,默认UID 是从1000开始;
  2、关于/etc/shadow ;
  1)/etc/shadow 概说;
  /etc/shadow文件是/etc/passwd 的影子文件,这个文件并不由/etc/passwd
而产生的,这两个文件是应该是对应互补的;shadow内容包括用户及被加密的密码以及其它/etc/passwd
不能包括的信息,比如用户的有效期限等;这个文件只有root权限可以读取和操作,权限如下:
  -r——– 1 root root 1.5K 10月 16 09:49 /etc/shadow
  /etc/shadow 的权限不能随便改为其它用户可读,这样做是危险的。如果您发现这个文件的权限变成了其它用户组或用户可读了,要进行检查,以防系统安全问题的发生;
  如果我们以普通用户查看这个文件时,应该什么也查看不到,提示是权限不够:
  [beinan@localhost ~]$ more /etc/shadow
   /etc/shadow: 权限不够
  2)/etc/shadow 的内容分析;
  /etc/shadow 文件的内容包括9个段位,每个段位之间用:号分割;我们以如下的例子说明;
  beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::
   linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:
  第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在一起;这个字段是非空的;
  第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统;这个字段是非空的;
  第三字段:上次修改口令的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数),您可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化;
  第四字段:两次修改口令间隔最少的天数;如果设置为0,则禁用此功能;也就是说用户必须经过多少天才能修改其口令;此项功能用处不是太大;默认值是通过/etc/login.defs文件定义中获取,PASS_MIN_DAYS 中有定义;
  第五字段:两次修改口令间隔最多的天数;这个能增强管理员管理用户口令的时效性,应该说在增强了系统的安全性;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_MAX_DAYS 中定义;
  第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;
  第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;
  第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;
  第九字段:保留字段,目前为空,以备将来Linux发展之用;
  如果更为详细的,请用 man shadow来查看帮助,您会得到更为详尽的资料;
  我们再根据实例分析:
  beinan:$1$VE.Mq2Xf$2c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::
   linuxsir:$1$IPDvUhXP$8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13108:
  第一字段:用户名(也被称之为登录名),在例子中有峡谷两条记录,也表示有两个用户beinan和linuxsir
  第二字段:被加密的密码,如果有的用户在此字段中是x,表示这个用户不能登录系统,也可以看作是虚拟用户,不过虚拟用户和真实用户都是相对的,系统管理员随时可以对任何用户操作;
  第三字段:表示上次更改口令的天数(距1970年01月01日),上面的例子能说明beinan和linuxsir这两个用户,是在同一天更改了用户密码,当然是通过passwd 命令来更改的,更改密码的时间距1970年01月01日的天数为13072;
  第四字段:禁用两次口令修改之间最小天数的功能,设置为0
  第五字段:两次修改口令间隔最多的天数,在例子中都是99999天;这个值如果在添加用户时没有指定的话,是通过/etc/login.defs来获取默认值,PASS_MAX_DAYS 99999;您可以查看/etc/login.defs来查看,具体的值;
  第六字段:提前多少天警告用户口令将过期;当用户登录系统后,系统登录程序提醒用户口令将要作废;如果是系统默认值,是在添加用户时由/etc
/login.defs文件定义中获取,在PASS_WARN_AGE 中定义;在例子中的值是7 ,表示在用户口令将过期的前7天警告用户更改期口令;
  第七字段:在口令过期之后多少天禁用此用户;此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用;在例子中,此字段两个用户的都是空的,表示禁用这个功能;
  第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;在例子中,
我们看到beinan这个用户在此字段是空的,表示此用户永久可用;而linuxsir这个用户表示在距1970年01月01日后13108天后过期,算
起来也就是2005年11月21号过期;哈哈,如果有兴趣的的弟兄,自己来算算,大体还是差不多的;);
  第九字段:保留字段,目前为空,以备将来Linux发展之用;
二、关于用户组;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/73686
推荐阅读
相关标签
  

闽ICP备14008679号