Linux Shell编程第2章——Linux文件系统

用户和用户组管理

用户管理常用命令

用户的角色是通过UID来识别的,且UID是全局唯一的。Linux用户可以分为三类。

  • root用户(超级用户):可以登录系统,系统唯一,可以操纵系统中的一切文件和执行一切命令,拥有最高权限。
  • 虚拟用户(伪用户、假用户):不可以登录系统,系统必不可少,比如bin、daemon、adm、ftp、mail。这类用户是系统自身拥有的,非后来添加,不过我们也可以添加虚拟用户。
  • 普通用户:可以登录系统,只能操纵用户根目录的内容,权限受到限制。这类用户由系统管理员添加。
    Linux用户管理常用命令有:用户添加命令useradd或adduser、用户修改命令usermod、用户删除命令userdel及用户口令管理命令passwd。

1.用户添加——useradd或adduser
useradd和adduser是等价的,都用于创建新的用户账号。命令格式如下:

useradd [option] [username]			#option为命令选项,username为用户名

执行该命令后,系统会做以下两件事

  • 在/etc/passwd文件中添加一行记录。
  • 在/home目录下创建新用户的主目录,并将/etc/skel目录中的文件复制到该目录中。
    使用该命令后,新建的用户还无法登陆,需要用passwd命令设置口令后才能登陆。用户的UID和GID是自动生成的,将/etc/passwd文件中的UID加1得到新建用户的UID,将/etc/group文件中的GID加1得到新建用户的GID。

常用useradd或adduser命令选项及其意义

选项 意义
-g [initial_grp 指定新建用户的私有组。若未指定-g参数,则该用户私有组的名称与新建用户账号同名
-G [grp...] 添加附属组
-D 显示或设置useradd命令使用的默认值
-d [directory] 指定用户主目录,如果此目录不存在,则同时使用-m选项来创建主目录
-m 使用的目录若不存在,则自动建立
-u UID 指定用户的用户号,若同时有-o选项,则可以重复使用其他用户的标识号。UID不能为负,预设为最小不得小于99而逐次增加。0~99一般保留给系统账号使用
$ sudo useradd wang					#新建一个用户wang
[sudo] password for jerring:
$ tail -1 /etc/passwd				#查看passwd文件中添加的用户账号信息
wang:x:1001:2221::/home/wang:
$ sudo tail -1 /etc/shadow			#查看加密后的用户账号及密码信息
wang:!:17241:0:99999:7:::			#“!”表示还未指定密码

2.用户修改——usermod
usermod命令可用来修改用户账号的各种属性,包括用户主目录、私有组、登录Shell等内容,命令格式如下:

usermod [option] [username]			#option为命令选项,username为用户名

常用usermod命令选项及其意义

选项 意义
-d [directory] 修改用户登入时的目录
-e [days] 修改账户的有效期限,days表示天数
-g [group] 修改用户所属的群组
-l [login_name] 修改用户登录时的名称为login_name
-p [password] 修改用户密码
-s [shell] 指定用户登陆的Shell,若未设置,则选用系统默认的Shell

需要注意的是,不建议使用usermod -p修改用户密码。因为如果用useradd命令,则显示在/etc/shadow文件中的是明文密码,建议使用passwd命令修改密码。

$ sudo usermod -p 123456 wang		#修改用户wang的密码为123456
$ sudo tail -1 /etc/shadow			#查看用户账号及密码信息
wang:123456:17241:0:99999:7:::		#可以看到此时密码显示为123456,且是明文显示

还需注意,usermod不允许修改已登录用户的账号名称。当用户修改UID时,也必须确认这个用户没有正在运行的程序。

3.用户删除——userdel
命令格式如下:

userdel [option] [username]			#option为命令选项,username为用户名

常用的命令选项是-r,即userdel -r username,删除用户的同时一并删除主目录和邮件池。

4.用户密码管理——passwd
用户账号刚创建时是没有密码的,会被系统锁定,必须为其指定密码才能使用,这是需要使用passwd命令。命令格式如下:

passwd [option] [username]			#option为命令选项,username为用户名

常用的passwd选项及其意义

选项 意义
-l 锁定指定的账户
-u 解锁被指定账户
-d 删除指定账户的密码,需要有root权限

用户组管理常用命令

1.用户组添加——groupadd
命令格式如下:

groupadd [option] [groupname]		#option为命令选项,groupname为用户名

常用groupadd命令选项及其意义

选项 意义
-g GID 为新组使用GID
-o GID 允许创建有重复 GID 的组
-r 创建一个系统账户
-f 如果组已经存在则成功退出,并且如果 GID 已经存在则取消 -g
$ sudo groupadd -g 666 wangyq       #新建一个用户组wangyq,GID为666
$ tail -1 /etc/group                #查看信息
wangyq:x:666:

如果调用groupadd命令时不设置GID,如下面的命令:

groupadd group1

则在系统中增加的新组的组标识GID是当前最大组标识加1

2.用户组修改——groupmod
命令格式如下:

groupmod [option] [groupname]       #option为命令选项,groupname为用户名

常用groupmod命令选项及其意义

选项 意义
-g GID 指定新的GID
-o GID 重复使用GID
-n 为群组改名
$ sudo groupmod -g 555 wangyq       #修改GID为555
$ tail -1 /etc/group                #查看信息
wangyq:x:555:

3.用户组删除——groupdel
命令格式如下:

groupdel [option] [groupname]       #option为命令选项,groupname为用户名
$ sudo groupdel wangyq      #删除用户组wangyq
$ tail -1 /etc/group        
guest-zlp0vy:x:999:         #用户组wangyq已被删除

文件和目录操作

文件操作常用命令

1.文件清单——ls
ls是英文单词list的简写,作用是列出目录下的文件和子目录的信息。命令格式如下:

ls [option] [file or directory]

如果[file or directory]为目录,则ls命令列出该目录下的子目录和文件;如果[file or directory]为文件,则ls命令将列出文件名及相关信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当前目录的信息。下面是常用ls命令选项及其意义

选项 意义
-a 显示指定目录下所有子目录和文件,包括隐藏文件
-A 显示指定目录下所有子目录和文件,包括隐藏文件,但不包含“.”和“..”
-b 对文件名中不可显示字符用八进制逃逸字符显示
-c 按文件的修改时间排序
-C 分成多列显示各项
-d 如果参数是目录,只显示其名称而不显示其下的各文件。往往与l选项一起使用,以得到目录的详细信息
-f 不排序,该选项使ls选项失效,使用aU选项有效
-i 在输出的第一列显示文件的i节点号
-l 显示文件详细信息。每行的信息依次是:文件类型与权限、链接数、文件属主、文件属组、文件大小、最近修改的时间、名字
-L 若指定的文件是一个符号链接文件,则显示链接所指向的文件
-m 输出按字符流格式,文件跨页显示,以逗号分开
-n 输出格式与l选项相同,只不过在输出文件属主和属组用UID和GID表示
-o 输出格式与l选项相同,只是不显示用户属组信息
-p 在目录后面加上“/”
-q 将文件名中的不可显示字符用“?”代替
-r 逆序显示
-R 递归地显示指定目录的各个子目录中的文件
-s 给出每个目录项所用的块数,包括间接快
-t 按修改时间排序,最近修改排在前面
-u 按访问时间排序,最近访问排在前面
-x 按行显示信息
$ ls -l     #显示当前目录下文件和目录的详细信息
-rw-rw-r-- 1 jerring jerring 1829 3月  16 13:31 ch01.md
-rw-rw-r-- 1 jerring jerring 5655 3月  16 23:00 ch02.md
-rwxrw-r-- 1 jerring jerring   21 3月  14 22:33 log.sh

2.文件复制——cp
cp命令把文件复制到目标文件或把多个文件复制到目标目录中。命令格式如下:

cp [option] [source] [destination]      #option为命令选项,source为源文件,destination为目标目录或目标文件

常见cp命令选项及其意义

选项 意义
-a 通常在复制目录时使用,它保留链接、文件属性,递归地复制目录
-d 复制时保留链接
-i 在覆盖目标文件之前将给出提示要求用户确认。
-p 不仅复制源文件,还复制修改时间和访问权限
-r 递归复制
-l 不复制,只是链接文件

3.文件移动或重命名——mv
mv命令将文件从一个位置移动到另一个位置,同时可移动多个文件。mv命令还可用于重命名,命令格式如下:

mv [option] [source] [destination]      #option为命令选项,source为源文件,destination为目标目录或目标文件

如果[destination]类型是文件时,mv命令将所给源文件或目录重命名为给定的目标文件,此时,源文件只能有一个(也可以是源目录);如果[destination]是已存在的目录名称,源文件或目录参数有多个,mv命令将各参数指定的源文件全部移至目标目录中。在跨文件系统移动时,mv先复制,再将原有文件删除,从而导致该文件的链接丢失。常用mv命令选项及其意义如下:

选项 意义
-i 交互方式操作。如果mv操作将覆盖已存在的文件时,则系统会询问是否覆盖
-f 强制操作。在mv将覆盖已存在的文件时不给出提示,直接覆盖。使用此选项,i选项将不起作用
-p 移动时保持权限

4.文件删除——rm
命令格式如下:

rm [option] [fileName or directoryName]     #option为命令选项,fileName or directoryName为文件名或目录名

常用rm命令选项及其意义如下

选项 意义
-f 忽略不存在的文件,从不给出提示
-r 递归删除
-i 交互式删除,即删除前会提示是否删除
-d 删除空目录

运用rm命令删除文件后文件是不能恢复的。如果不确定文件是否应被删除,可以加上-i选项,这样每次删除前都会给出提示。删除目录及目录里的内容加上-r,这样可以递归删除。此时也可加上-i选项,即rm -ri directoryName,这样在删除每个文件或目录前均会提示,避免删错。如果很明确整个目录需要被删除,可以加上-f,即rm -rf directoryName

目录操作常用命令

1.目录创建——mkdir
命令格式如下:

mkdir [option] [directoryName]      #option为命令选项,directoryName为需要创建的目录名称

运用mkdir命令创建目录时,要求创建目录的用户在当前目录中(directoryName的父目录中)具有写权限,并且directoryName不能是当前目录中已有的目录或文件名称。常用的mkdir命令选项及其意义如下:

选项 意义
-m 对新建目录设置存取权限
-p directoryName是一个路径名称,若路径中的某些目录不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
-v 每次创建新目录都显示信息
$ ls
ch01.md  ch02.md  log.sh
$ mkdir -m 777 tsk      #创建目录,并指定权限
$ ls -l                 #显示信息
总用量 24
-rw-rw-r-- 1 jerring jerring 1829 3月  16 13:31 ch01.md
-rw-rw-r-- 1 jerring jerring 8671 3月  17 20:29 ch02.md
-rwxrw-r-- 1 jerring jerring   21 3月  14 22:33 log.sh
drwxrwxrwx 2 jerring jerring 4096 3月  18 10:05 tsk

上面的例子创建了一个名为tsk的目录,所有的用户都具有rwx权限(读、写、执行权限)

$ mkdir testdir/test        #testdir目录不存在,不带-p选项将报错
mkdir: 无法创建目录"testdir/test": 没有那个文件或目录
$ mkdir -p testdir/test     #带上-p选项成功创建testdir目录及其子目录test
$ ls
ch01.md  ch02.md  log.sh  testdir  tsk
$ cd testdir
$ ls
test

在上例中,由于testdir目录是不存在的,不带-p选项创建testdir/test时产生错误;当带上-p选项后,mkdir能够成功创建testdir目录及其子目录test。

2.目录删除——rmdir
rm命令可以删除一个或多个目录,在删除目录时,目录必须为空,且必须拥有该目录的父目录的写权限。命令格式如下:

rmdir [option] [directoryName]

常用的rmdir命令选项为-p,即删除子目录时,若父目录为空,父目录也会被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统会在标准输出上显示相应的信息。rmdir -p a/b/c相当于rmdir a/b/c a/b a。由于rmdir只能删除目录中只包含空子目录的目录,如果目录中存在文件,则使用rmdirrmdir -p命令是无法删除该目录的,需要使用rm -r命令。

3.目录切换——cd
命令格式如下:

cd [directoryName]

该命令用于变换当前工作目录。其中,directoryName可以为绝对路径,也可以为相对路径。常用cd命令如下:

命令 说明
cd 切换到登录目录
cd ~ 切换到登录目录
cd / 切换到根目录
cd /root 切换到root用户(超级用户)的主目录,只有root用户才能访问该目录
cd /home 切换到home目录,home目录通常为用户登录目录的上一级目录
cd .. 切换到上一级目录
cd - 切换到上次的工作目录

在目录切换过程中,有三个比较重要的字符:. .. ~.表示当前目录,.. 当前目录的上一级目录,~表示用户的主目录。

文件和目录权限管理

Linux系统中的每个文件和目录都有访问许可权限,以此确定用户能以何种方式对文件和目录进行操作。文件或目录的访问权限分为读、写、可执行三种。文件或目录被创建时,所有者自动拥有对该文件或目录的读写权限(对目录还有可执行权限),以便用户进行阅读和修改。用户也可根据需要把访问权限设置为任何组合。

有三种不同类型的用户可对文件或目录进行访问:文件所有者、同组用户和其他用户。文件所有者一般是文件的创建者,他可以允许同组用户访问文件,还可以将文件的访问权限赋予系统中的其他用户,从而使系统中每一位用户都能访问该所有者拥有的文件或目录。

每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限,与属主同组的用户的读、写和执行权限,以及系统中其他用户的读、写和执行权限。

$ ls -l testdir
总用量 4
-rw-rw-r-- 1 jerring jerring    0 3月  18 10:36 data
drwxrwxr-x 2 jerring jerring 4096 3月  18 10:54 test

上例中,用ls命令显示目录下详细信息。第一个字符为-代表文件,第一个字符为d代表目录。权限字段r代表可读,w代表可写,x代表可执行。文件和目录都有三组权限。以data文件为例,第1组是rw,表示文件属主具有读写权限;第2组是rw,表示文件属主的同组用户具有读写权限;第3组是r,表示其他用户只有读的权限。test目录也是类似分析。

文件和目录权限管理依赖于两个重要的命令:chmod和chown。

1.文件(目录)权限更改——chmod
chmod命令用于更改文件或目录的访问权限,它有两种用法:一种是包含字母和操作符表达式的文字设定法,另一种是包含数字的数字设定法。
文字设定法的格式如下:

chmod [userType] [signal] [type] [fileName]

chmod命令的三种参数类型如下:

用户类型(userType) 数学符号(signal) 文件类型(type)
u 表示用户(user),即文件(目录)属主 + 添加 r 可读
g 表示同组(group),即与文件(目录)属主同组的用户 - 取消某个权限 w 可写
o 表示其他(others)用户 = 清空权限后赋予给定权限 x 可执行
a 表示所有(all)用户

下面运用chmod命令改变data文件的权限,将data文件的权限改为:属主可读可写可执行,同组用户和其他用户只可读,不能写和执行。

$ ls -l data                    #查看权限信息
-rw-rw-r-- 1 jerring jerring 0 3月  18 10:36 data
$ chmod u+x,g-w data            #属主添加可执行权限,同组用户取消可写权限
$ ls -l data                    #再次查看权限信息
-rwxr--r-- 1 jerring jerring 0 3月  18 10:36 data

文字设定法我们已经知道了,那么什么是数字设定法呢?首先需要知道数字表示属性的含义,用3个二进制位表示文件权限,即???,从左到右依次表示可读可写可执行,当具有某个权限时,相应位为1。因此可用1个八进制数字表示可读可写可执行权限,可用3个八进制数字表示属主、同组用户、其他用户的权限,其顺序为u、g、o。
如刚才的chmod u+x,g-w data命令替换为chmod 744 data可以达到同样的效果。下面新建一个data2文件演示一下:

$ touch data2           #新建一个文件data2
$ ls -l data2
-rw-rw-r-- 1 jerring jerring 0 3月  18 13:14 data2
$ chmod 744 data2
ls -l data2
-rwxr--r-- 1 jerring jerring 0 3月  18 13:14 data2

2.文件(目录)属主更改——chown
利用chown命令可以改变文件或目录的属主。一般而言,这个指令只有系统管理员(root)才能使用,一般使用者没有权限改变别人的文件或目录属主,也没有权限将自己的文件属主更改为他人。它的命令格式如下:

chown [option] [owner] [fileName]

其中,option为命令选项,owner为改变后的用户属主,fileName为需要改变属主的文件或目录。常用chown命令选项及其意义如下:

选项 意义
-c 若该文件或目录属主确实已更改,显示更改动作
-h 改变符号链接文件的属主时不影响该链接所指向的目标文件
-f 若该文件或目录属主无法被更改也不要显示错误信息
-v 显示属主变更的详细资料
-R 对目录下的所有文件和子目录进行相同的属主变更(即递归地变更)

3.特殊权限——SUID和SGID
除了上面提到的基本权限以外,还有所谓的特殊权限存在。用户若无特殊需要,不应该打开这些特权,避免系统出现严重漏洞。但有时却需要没有被授权的用户完成某项任务,例如passwd命令,它允许用户改变密码,这就要求更改/etc/passwd文件,然而系统管理员决不允许普通用户拥有直接更改这个文件的权利。为了解决权限问题,SUID、SGID、SBIT应运而生,下面介绍这三个特殊权限的说明。

  • SUID:当一个设置了SUID位的可执行文件被执行时,执行者以文件所有者的身份运行该文件。如果所有者是root,那么执行者在执行文件时临时拥有root权限。
  • SGID:当一个设置了SGID位的可执行文件被执行时,执行者在执行过程中会获得该文件用户组的权限(相当于执行者临时加入了文件的用户组)。若一个目录设置了SGID,则所有被复制到这个目录下的文件,其用户组都会被设置为和这个目录的用户组相同,除非在复制文件时加上-p选项,才能保留原来的设置。
  • SBIT,只针对目录有效,当用户对目录拥有wx权限时,用户在该目录创建的文件或目录,只有自己与root才可以删除。最具有代表性的例子就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与root能够删除自己的目录或文件。 注意,SBIT对文件不起作用。

和之前所说的rwx权限类似,也有字符和数字两种命令格式。

#字符形式
chmod u+s [fileName]        #设置SUID
chmod u-s [fileName]        #去除SUID
chmod g+s [fileName]        #设置SGID
chmod g-s [fileName]        #去除SGID
chmod u+t [fileName]        #设置SBIT
chmod u-t [fileName]        #去除SBIT

#数字形式
chmod ???? [fileName]       #?代表八进制数字。第一个?表示这三个特殊权限,即代表的三位从高到低为SUID、SGID、SBIT。后面三个?代表普通权限。
#如果希望查找系统中所有具有特殊权限的文件,则可以通过命令find / -perm +7000 解决。

查看特殊权限的方法就是普通的ls命令:

  • SUID会在所属用户权限本应是x的地方显示s
  • SGID会在所属用户组权限本应是x的地方显示s
  • SBIT会在其它用户权限本应是x的地方显示t

上面的规则适用于文件或目录已被赋予x权限。如果首先没有被赋予x权限,那么这个特殊的权限就相当于一个空的权限,没有意义。相应的地方字母会变成大写,即s变为St变为T。如下例所示:

$ ls -l
总用量 0
-rwxr--r-- 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-- 1 jerring jerring 0 3月  18 13:14 data2
$ chmod u+s data            #data设置SUID
$ ls -l
总用量 0
-rwsr--r-- 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-- 1 jerring jerring 0 3月  18 13:14 data2
$ chmod g+s data            #data设置SGID
$ ls -l
总用量 0
-rwsr-Sr-- 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-- 1 jerring jerring 0 3月  18 13:14 data2
$ chmod o+x data2           #data2添加x权限
$ ls -l
总用量 0
-rwsr-Sr-- 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-x 1 jerring jerring 0 3月  18 13:14 data2
$ chmod o+t data2           #data2设置SBIT
$ ls -l
-rwsr-Sr-- 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-t 1 jerring jerring 0 3月  18 13:14 data2
$ chmod o+t data            #data设置SBIT
$ ls -l
总用量 0
-rwsr-Sr-T 1 jerring jerring 0 3月  18 10:36 data
-rwxr--r-t 1 jerring jerring 0 3月  18 13:14 data2

文件查找——find

find命令是Linux系统查找文件的命令,格式如下:

find [路径] [选项] [操作]

路径是find命令所查找的目录路径。例如,用.表示当前目录,用/表示系统根目录。选项用于指定查找条件,可以指定按照文件属主、更改时间、文件类型等条件来查找。find命令的操作名称及其意义如下:

操作名称 意义
print 将匹配到的文件输出到标准输出
exec 对匹配的文件执行该参数所给出的Shell命令。相应命令的形式为command {} \;
ok 和-exec的作用相同,只不过以一种更安全的方式来执行参数给出的Shell命令:对于每一个匹配项,都会给出提示,让用户来确定是否执行命令

两个详细讲解find命令的例子如下:

posted on 2017-03-18 22:12  月夜下  阅读(331)  评论(0编辑  收藏  举报

导航

"320px">