当前位置:文档之家› 马哥Linux学习笔记(2016.6.16)

马哥Linux学习笔记(2016.6.16)

?★ 常用命令
1、命令格式
命令(command)+空格+选项(options)+空格+参数(argumengts)
选项:分为短选项和长选项。短选项可以组合,组合的先后顺序一般没区别,特殊情况下有区别,长选项一般不能组合。某些选项也可以带自己的参数。例如:ls -a -l = ls -al = ls -la。
参数:命令的作用对象。
小技巧:
ctrl+c:1、终止当前已开始执行的命令;2、取消在命令提示符下输入的所有内容(不必一个一个删了,更快捷)。
2、常用命令
su(switch user):切换用户。
格式:su 用户名
passwd:更改用户名
pwd(Printing Working Directory):显示当前的路径
ls(list):显示当前目录下的文件(不加选项则只显示文件名)
-l:用长格式显示当前目录下的所有文件,或用长格式显示指定的单个文件。
显示内容解释(从左往右):
1、10位字符
10位的第1位:文件类型
-:普通文件
d:目录文件
b:块设备文件(block)
c:字符设备文件(character)
l:符号链接文件(symbolic link file)
p:命令管道文件(pipe)
s:套接字文件(socket)
10位的后9位:文件权限。每3位是1组,每组:rwx(读,写,执行),没有相应功能则用-表示,例如:rw-(能读,能写,不能执行)
2、1位数字:文件硬链接的次数。
3、文件的属主。root等。
4、文件的属组。
5、文件大小。默认单位是字节。
6、时间戳(timestamp)之最近一次被修改的时间。
每个文件都有3个时间戳,分别表示文件最近一次被访问(access)、被修改(modify)、被改变(change)的时间。修改是指修改文件内容,改变是指改变文件元数据(即文件的名字、类型等属性)。
7、文件名
-h:文件大小做单位转换后显示
-a:显示包括隐藏文件在内的所有文件
Linux中以.开头的文件是隐藏文件,只有一个.表示当前目录,只有两个.表示上一级目录。所以,ls . = ls;ls .. 是显示上一级目录的文件。
-A:显示包括隐藏文件在内的所有文件(不包含.和..)
-d:显示目录自身属性(而不是显示目录下文件的属性)
-i:显示文件的索引号
每个文件都有一个索引号(index node,缩写为inode),相当于文件的身份证。

-r:逆序显示文件
-R:递归(recursive)显示文件,即目录中的文件、目录全都显示。
/:显示根目录下的所有目录
cd(change directory):切换目录
cd:回到用户的主目录(主目录,又叫家目录,是用户登录时默认所在的目录)。
cd ~student:回到student用户的家目录(只有管理员用户可以使用此命令)
cd /root:回到root目录
cd -:回到上一次所在的目录。(连续使用此命令即可在当前目录和上一次所在的目录之间来回切换)
type:显示指定命令属于哪种命令类型(命令类型分为两种:内置命令、外部命令。内置命令是指shell自带的命令,外部命令指在某个路径下有对应的可执行文件的命令。)
例如:type ls
printenv:显示环境变量信息
hash:显示缓存信息
(每个命令执行时,Linux会在环境变量中PATH指定的目录下寻找这个命令的可执行文件,执行完后会把这个命令的路径存在缓存里,下次再执行这个命令时就不再去环境变量中PATH里去找了,这样可以提高执行速度。hash命令可以显示执行过所有命令的次数)
date:显示、修改当前系统时间
date 022*******.30 (将系统时间修改为2月26号10点49分2013年30秒,其中年和秒如果无需修改就可以省略,秒如果要修改前边要加.)
date +%F:以年-月-日的格式显示当前日期
date +%F-%H-%M-%S:以年-月-日-时-分-秒的格式显示当前时间
clock:显示当前硬件时间(=hwclock)
hwclock -s:将系统时间修正为硬件时间
hwclock -w:将硬件时间修正为系统时间
(关于时间:主板上依靠纽扣电池驱动的计时器的时间叫硬件时间,Linux开机后系统会自动读取硬件时间来作为当前的时间,之后就用软件自己计时了,软件自己的计时就叫系统时间,一般来说硬件时间比系统时间更准确)
help:获取内部命令的使用帮助
例如:help cd
--help:获取外部命令的使用帮助
例如:ls --help
man(manual):在命令手册中查看某个命令
例如:man ls
查询完毕后按q键可以退出man命令
(关于命令手册:命令手册中对内部命令、外部命令都有说明,而且比help更详细。但要注意,对于内部命令,man的结果是对这个内部命令所属的shell的说明,所以,内部命令最好用help获取帮助。命令手册的内容是分章节的,可以只查看指定章节的内容,例如:man 2 ls。命令手册各章节内容:1、用户命令。2、系统调用。3、库调用。4、特殊文件(设备文件)。5、文件格式(配置文件的语法)。6、游戏。7

、杂项。8、管理命令。命令手册中出现的[]表示可以省略的内容,<>表示必须要有的内容,用|隔开表示多选一,...表示以此类推。查看man内容时,向后翻一屏:空格键,向前翻一屏:b,向后翻一行:下箭头或者回车键,向前翻一行:上箭头或者k。按/加查找内容即可查找关键字,用上下箭头查看)
whatis:查看命令所在命令手册的哪些章节
例如:whatis read
info:查看命令的在线文档(发展史等信息)
例如:info ls
which:查看命令对应文件的存放路径
cal:日历
例如:cal 2016(2016年的年历);cal 5 2016(2016年5月的日历)
echo:显示指定的内容(末尾默认有换行符)
例如:echo “the year is 2016,today is monday”(显示“”中的这句话)
echo -e “the year is 2016,\ntoday is monday”(从,开始换行显示这句话,-e的作用是启用转意符\n)
echo -n “the year is 2016,today is monday”(显示这句话并去掉这句话后边的换行符)
printf:显示指定内容(末尾默认无换行符)
例如:printf “the year is 2016.\n”(\n是手动添加的换行符)
printf “the year is 2016,\ntoday is monday.\n”(分两行显示这句话)

★ 根文件系统详解
Linux根目录下的目录有:
1、/boot:系统启动相关的文件
2、/dev:设备文件(属于特殊文件)
设备分为两类:块设备(随机访问的设备);字符设备(线性访问,以字符为单位)
设备文件是特殊文件,文件名显示背景为黑色字符为黄色,没有大小,直接存储为元数据,只作为设备的访问入口。在显示大小的位置显示的是用逗号隔开的两个数字,分别是主设备号(major)和次设备号(minor)。
3、/etc:配置文件
4、/home:用户的家目录,每个用户的家目录默认为/home/用户名。但是root用户的家目录例外,在根目录下的/root。
5、/lib:库文件和内核模块文件
/lib/modules:内核模块文件
库文件分为两类:静态库和动态库。静态库是嵌在程序内部的库,程序直接复制到其他主机上即可运行,但是当许多使用静态库的程序运行时会把许多重复的库复制进内存,占用内存空间而且效率低;动态库本身存放在主机磁盘上,并不在程序内部,程序运行时通过链接来将动态库复制到内存,多个程序可在内存中共享使用这个库,节省内存空间,但是程序直接复制到其他主机后不一定能运行,因为其他主机不一定有这个程序所需的库。
6、/media:挂载点目录,用来挂载移动设备
7、/mnt:挂载点目录,用来挂载额外的临时文件系统
挂载:新添加的设备

必须关联到Linux文件系统的某个路径节点上才可以访问,这个关联过程就叫挂载。
8、/opt:可选目录,以前用来安装第三方软件
9、/proc:伪文件系统,系统运行时里面的文件都是内核映射文件,记录有系统运行状态信息等,系统关闭后这些文件全都消失。系统性能监控和系统性能调优都和这个目录有关。
10、/sys:伪文件系统,系统运行时里面的文件都是和硬件属性相关的映射文件,系统关闭后这些文件全都消失。
11、/tem:临时文件,一般每月清除一次。
12、/var:可变化的文件,系统刚运行时这个目录中的文件很少,随着系统运行,这个目录中文件越来越多
13、/bin:可执行文件。用户命令。
14、/sbin:可执行文件。管理命令。
15、/usr:全局共享只读文件
/usr/bin
/usr/sbin
/usr/lib
/usr/local:用于安装第三方软件
/usr/local/bin
/usr/local/sbin
/usr/local/lib
/usr/local下的这些目录是用来存放第三方软件需要的一些东西。

★ 目录管理
ls
cd
pwd
mkdir(make directory):创建空目录
注意:mkdir /root/x/y/z 这个命令的含义是在/root/x/y创建Z目录,所以必须要确保x和y目录是存在的,这里使用的是绝对路径(绝对路径以/开始),也可用相对路径(相对路径以./开始),假设当前目录是/root/x,在当前目录下创建y目录:mkdir y,然后在y目录下再创建z目录:mkdir y/z(本该是mkdir ./y/z的,只是./可以省略而已)
-p:创建指定路径上全部缺少的目录
-v:查看创建过程
例如1:mkdir -pv /root/x/y/z (在root目录下依次创建嵌套的x、y、z目录)
{}用法举例(这些花括号的用法属于bash特性中的命令行展开功能中的花括号展开功能):
例如2:mkdir -pv /mnt/test/{x/m,y} (在mnt下建立test目录,在test目录下建立x目录和y目录,在x目录下建立m目录。)
例如3:mkdir -pv /mnt/test/{x,y}/m (在mnt下建立test目录,在test目录下建立x目录和y目录,在x目录下建立m目录,在y目录下建立m目录)
例如4:mkdir -pv /mnt/test2/{a,b}{c,d}(在mnt下建立test2目录,在test2目录下建立ac目录、ad目录、bc目录、bd目录)
例如5:mkdir -pv /mnt/test2/{a,b}_{c,d}(在mnt下建立test2目录,在test2目录下建立a_c目录、a_d目录、b_c目录、b_d目录)
rmdir(remove directory):删除空目录
-p:删除没有分支的一串空目录
例如:假设已经有/root/x/y/z目录结构,而且xyz这3个目录都是空目录,则可以rmdir -p /root/x(删除xyz目录)

★ 文件管理
文件命名规则:
1、长

度不能超过255个字符
2、不能使用/
3、严格区分大小写
touch:创建文件/修改文件的时间戳
例如1:touch c(在当前目录下创建一个名称是c的文件)
例如2:touch ‘a b’(在当前目录下创建一个名称是“a b”的文件,Linux系统允许空格字符作为文件名的组成部分)
-c:只修改文件的时间戳而不创建文件
例如:touch -c c(修改文件c的时间戳,如果c不存在也不再创建c)
-a:只修改文件的访问时间
例如:touch -a c(修改文件c的访问时间为当前时间,修改时间不变,因为文件的访问时间属于文件属性,所以c的改变时间也同时变为当前时间)
-m:只修改文件的修改时间
例如:touch -m c(修改文件c的修改时间为当前时间,访问时间不变,因为文件的修改时间属于文件属性,所以c的改变时间也同时变为当前时间)
-t:修改文件的时间戳为指定时间
例如:touch -m -t 201212131415 c(修改文件c的修改时间为2012年12月13号14点15分,c的访问时间不变,c的改变时间变为当前时间)
(注意:touch一个文件后,这个文件的改变时间一定会变为当前时间,这是不能由任何命令控制的)
stat:查看文件的状态信息(名称、大小、时间戳等)
file:查看文件的内容类型
nano:编辑文本文件内容(其实nano就是一个文本编辑器)
例如:nano hello(编辑名为hello的文本文件,如果该文件不存在,就在当前目录下新建一个叫hello的文件。下方有操作提示,其中的^表示ctrl键)
rm(remove):删除文件
例如:rm hello(删除叫hello的文件,如果是以管理员身份删除,会有确认提示,再打y、回车即可完成删除,普通用户删除不会有确认提示)
(注:有些命令是有别名的,比如rm就是rm -i的别名,原生态的rm命令是不会提示删除确认的,rm -i是带删除确认的命令,后来人们给rm -i起了个别名叫rm,所以现在打rm命令就是带删除确认的了,如果想使用原生态的rm命令,就需要在rm前加\,例如:\rm a(删除a文件,且不带删除确认)。同样,ls也是ls --color=tty的别名,所以ls查询结果中的目录和特殊文件会有颜色区分,原生态的ls命令是没有任何颜色区分的。查看一个命令是不是别名,使用type即可,例如:type ls。别名机制是红帽系统的特色)
-f(force):强行删除(不带删除确认提示)
-r(recursive):递归删除目录(即删除该目录及其中的所有内容)
例如:rm -rf /mnt/test2(强行删除mnt目录下的test2目录,且不带确认提示)
注意:rm -rf /(强行

删除Linux的根目录,这是最危险的操作,一旦删除,Linux系统就不复存在了,相当于自杀。)
cp(copy):复制文件、目录
例如1:cp /etc/passwd /tem/(将etc目录下的passwd文件复制到tem目录下,并保持文件名不变。如果tem目录不存在,则cp操作失败)
例如2:cp /etc/passwd /tem/test(将etc目录下的passwd文件复制到/tem/test目录下,并保持文件名不变(如果test是目录);将etc目录下的passwd文件复制到tem目录下并覆盖test文件(如果test是文件)。覆盖的意思是先删除test文件,再把passwd文件复制到test所在的目录并将passwd文件重命名为test)
例如3:cp /etc/a /etc/b /etc/c /tem/(将etc目录下的a、b、c三个文件复制到tem目录下,并全都保持文件名不变)
-r:递归复制一个目录(即复制这个目录下的所有内容)
例如:cp -r /etc/ /tem/a(将etc目录递归复制到/tem/a/目录下。如果a目录存在,就将etc目录复制到a目录下;如果a目录不存在,就在将etc目录复制到tem目录下并重命名为a;如果a是个文件,则会出错)
总结:cp的格式是:cp 源 目的地。当源是文件时,目的地可以是目录和文件,如果目的地是目录,则要求该目录必须存在,否则操作失败,如果目的地是文件,则会覆盖目的地文件;当源是目录是,目的地只能是目录,如果目的地目录存在,则会将源目录复制到目的地目录中,如果目的地目录不存在,则会将源目录复制到目的地目录所在的目录中并将源目录重命名为目的地目录。如果源是多个文件或目录,则可以使用花括号展开机制,例如:cp /etc/{a,b,c/d} /tmp(将etc目录下的a、b文件以及etc/c下的d文件复制到tmp目录下)。小技巧:输入文件名后按一下tab键,如果自动补上/,就说明这个文件名是个目录。
-f:强行覆盖(覆盖目的地文件前不会有确认提示,且如果目的地文件不能打开,则先删掉再复制)
-p:保留文件的属主、属组、时间戳(一般复制文件之后,这个文件的属主、属组、时间戳都会改变,谁复制的属主就改成谁)
-a:保留文件的所有属性(比-p保留的更多,可以认为保留了源文件的原貌,这个操作通常用来备份文件,所以称为归档复制)
-P:保持链接文件依然是链接(cp操作如果复制的是一个链接文件,则默认会把链接文件指向的文件复制过去,而不是复制链接文件本身)
-L:复制链接文件本身(cp -L = cp)
mv(move):剪切文件、目录
例如:mv /tmp/a /var/abc(将tmp目录下的a文件剪切到/var/abc目录下(如果abc是目录);将tmp目录下的a文件剪切到var目录下并重命名为abc(

如果abc是文件且不存在);)
注意:mv的源既可以是文件也可以是目录,且不用加任何选项(这一点和cp不同)
总结:mv的格式是:mv 源目的地。如果源是目录,则要求目的地必须也是目录,如果目的地目录存在,就把源目录复制到目的地目录下,如果目的地目录不存在,就把源目录重命名为目的地目录并剪切到目的地目录所在的目录下;如果源是文件,则目的地可以是文件或者目录,如果目的地是已有文件,则把源文件剪切过去并覆盖目的地文件,如果目的地文件不存在,则把源文件剪切过去并重命名为目的地文件。如果目的地是目录,则把源文件剪切到目的地目录中。
小技巧:mv a b(把当前目录下的a文件、目录重命名为b)
-t(target):目的地提前
例如:mv -t /tem a(把当前目录下的a文件剪切到tem目录下)
install:复制文件或者创建目录
例如1:install /etc/a /var(把etc目录下的a文件复制到var目录下)
例如2:install -d /tmp/{a,b}(在tmp目录下新建a目录和b目录)(install -d = mkdir)

★ 文本查看
cat:连接并显示文本文件
例如:cat /tem/a /var/b(显示tem目录下的a文件和var目录下的b文件)
-n:给显示的内容加行号
-E:显示每行的行结束符$
关于行结束符:行结束符标志着一行的结束,在windows系统中行结束符是$加回车,在Linux系统中是$。所以,在Linux中编辑的文本在windows中打开就会发现所有内容都在一行中,而在windows中编辑的文本在Linux中查看就有可能出乱码。
-A:显示所有内容(包含行结束符、回车符等非打印字符)
tac:连接并从后往前显示文本文件(与cat显示顺序相反)
cat的缺陷:瞬间把所有内容显示完,虽然我们可以使用shift+page up/page down在Linux终端(不是使用第三方软件连入Linux)查看内容时的翻屏操作,但是因为缓存的内容有限,所以只能往前翻有限的屏数,如果信息量太大(如:/etc/rc.d/rc.sysinit),则有可能看不到全部的内容。
more:分屏显示文本文件
例如:more /etc/rc.d/rc.sysinit
使用空格键向后翻一屏,b键向前翻一屏,回车键向后翻一行(不支持向前翻一行),但是一旦翻到文件尾部就自动退出了。
less:分屏显示文本文件(最常用)
例如:less /etc/rc.d/rc.sysinit
使用空格键向后翻一屏,b键向前翻一屏,回车键或下箭头向后翻一行,k键或上箭头向前翻一行,q键退出查看,使用方法同man命令(其实man命令执行的就是less命令)
head:查看文本文件前n行
-n:指定显示的行数
例如

:head -n2 /etc/rc.d/rc.sysinit(显示/etc/rc.d/rc.sysinit的前2行内容)
tail:查看文本文件后n行
-n:指定显示的行数
-f(follow):实时显示文件后n行内容,ctrl+c退出(文件后n行内容一旦改变立即显示,这个命令很有用,尤其在监控日志文件时)

★ 文本处理
(以下命令并不实际更改文本内容,只是控制显示方式而已)
cut:切割文本文件并显示
-d:指定字段分隔符(不指定的话就默认一个空格)
-f:指定要显示的字段
例如:cut -d: -f1,7 /etc/passwd(切割显示/etc/passwd文件,:为字段分隔符,显示第1和第7字段)(-f1-7就是显示第1至7字段)
join:合并文本文件并显示(用的较少,不再细解)
sort:排序显示
例如:sort sort.test(按照每行首字符在asc码表中的顺序由小到大显示sort.test文件)
-r:有大到小显示
-n:按数值排序(不再按照asc码表顺序排序)
例如:sort -n -r sort.test(按照数值由大到小的顺序显示sort.test文件)
-t:指定字段分隔符
-k:指定以哪个字段为标准进行排序
-u:排重显示
例如:sort -t:-k3 -n -r -u /etc/passed(以:为分隔符,以第3字段为标准按照数值由大到小顺序对/etc/passed文件进行排序并排重显示)
-f:忽略字符大小写
uniq:忽略相邻的重复行之后再显示
例如:sort sort.test
-d:只显示相邻的重复行(只显示1行)
-D:显示相邻的所有重复行(只要是相邻的重复的行全都显示出来)
-c:显示每一行及相邻行重复的次数(重复行只显示1行)

★ 文本统计
wc(word count):统计文本文件的行数、单词数、字节数
-l:只显示行数
-w:只显示单词数
-c:只显示字节数
-m:只显示字符数
-L:最长的一行有多少个字符
(一个字节就是一个字符,因为一个字符就占用一个字节,1Byte。一个汉字、中文标点占用2字节)

★ 字符处理
tr:转换或删除字符
例如1:tr ‘ab’ ‘AB’(把以后输入字符中的所有a和b都转成大写)
例如2:tr ‘a-z’ ‘A-Z’ < /etc/passwd(把/etc/passwd这个文件中所有的小写字母都转成大写)
-d:删除指定的字符
例如:tr -d ‘ab’ < /etc/passwd(把/etc/passwd这个文件中所有的a和b都删除)

★ bash及其特性
shell本身就是一个可执行程序,在shell中运行一次shell就打开了一个子shell,以此类推,执行一次exit就退出一层shell,以此类推。可以用pstree查看进程树。
☆ bash特性:
1、命令历史
2、命令补全

3、管道、重定向
4、命令别名
5、命令行编辑
6、命令行展开
7、文件名通配
8、变量
9、编程
☆ bash支持的3种引号:
反引号``:用于命令替换
双引号"":弱引用,用于实现变量替换
单引号'':强引用,不完成变量替换
☆ bash特性学习:
1、命令行编辑
光标跳转:
ctrl+a 跳到命令行首
ctrl+e 跳到命令行尾
ctrl+u 删除光标左侧所有内容
ctrl+k 删除光标右侧所有内容
ctrl+左右箭头 光标向左右跳转一个单词(只在图形界面中打开shell时适用)
ctrl+l 清屏
2、命令历史
bash会自动记录执行过的命令,并保存在内存的缓冲区中,以后再输入命令时可以使用上下箭头寻找合适的历史命令直接执行。当用户退出时,该用户的命令历史会从内存中保存到该用户家目录中的一个叫bash history的隐藏文件中,所以当该用户再次登录时,以往的命令历史还存在。
history:查看命令历史(这是一个bash内置的命令)
-c:清空命令历史
-d:删除指定的一个或多个命令记录
例如1:history -d 500(删除第500条命令记录)
例如2:history -d 500 10(删除从第500条开始的10条命令记录)
-w:将缓冲区中的命令历史保存到历史文件中
查看命令历史缓冲区大小的方法:
1、环境变量中HISTSIZE:命令历史缓冲区大小(默认是1000条)
2、用命令查看命令历史缓冲区大小:echo $HISTSIZE
命令历史的使用技巧:
!n:执行命令历史中第n条命令
!!:执行上一条命令
!string:执行命令历史中最近一个以指定字符串开头的命令
例如:!man(执行命令历史中最近一个以man开头的命令)
按一下ESC键,再按一下。键:引用上一次命令的最后一个字符串(alt+. 在本地窗口中也可以)
3、命令补全
输入命令时,输入到一半时,按一下tab键,就有可能补全剩余的命令。(在环境变量的设置中搜索,如果有唯一一个匹配的命令,就会补全)
输入命令到一半时,如果想不起剩余的字母怎么拼写,就按两下tab键,会自动给出所有可能的命令。
同理还有路径补全。
4、命令别名
alias:给一个命令起别名(这个别名只在当前shell进程的生命周期内有效,而且对其他shell进程是无效的。如果想永久有效且对所有用户有效,就必须在bash程序的配置文件中修改。)
例如1:alias cl=clear(

执行以后,cl就相当于clear了)
例如2:alias head=‘head -n2 /etc/rc.d/rc.sysinit’(注意:中间有空格时要用单引号引起来)
例如3:alias(查看目前全部的命令别名)
unalias:撤销别名
例如:unalias cl(以前设置的alias cl=clear就失效了)
5、命令替换
把命令中某个子命令替换为其执行结果的过程,子命令需要用$()括起来,或者用反引号``引起来。(反引号就是~键的那个引号)
例如1:echo "The current directory is $(pwd)"(假设当前目录是/root,则这个命令实际执行结果是"The current directory is /root")
例如2:touch ./file-$(date +%F-%H-%M-%S).txt(在当前目录下创建一个名称是当前时间的文件,时间格式是年-月-日-时-分-秒)
例如3:ls -l $(which useradd)(用长格式显示useradd文件)
6、文件名通配(globbing)
命令行展开特性有3方面:波浪线展开、花括号展开、文件名展开(即文件名通配)
文件名通配通常使用3个符号:
*:匹配任意长度的任意字符(包括空白字符)
例如:ls a*3(显示文件名是以a开头且以3结尾的文件)
?:匹配任意单个字符(包括空白字符)
例如:ls a?3(显示文件名是3个字符且以a开头、以3结尾的文件)
[]:匹配指定范围内的任意单个字符
例如1:ls [a-zA-Z]*[0-9a-zA-Z](显示文件名以字母开头且以数字或字母结尾的文件)
例如2:ls [abc]*[A-Z](显示文件名以abc三个字母其中之一开头且以大写字母结尾的文件)
例如3:ls *[0-9]*(显示文件名中包含有数字的文件)
[^]:匹配指定范围之外的任意单个字符
例如:ls [^0-9]*(显示文件名是以非数字开头的文件)
特殊表示法:
[:space:]:空格
[:punct:]:标点符号
[:digit:]:数字(注意:[:digit:] = 0-9 )
[:alnum:]:数字和字母(同理:[:alnum:] = 0-9a-zA-Z)
[:lower:]:小写字母(同理:[:lower:] = a-z)
[:upper:]:大写字母(同理:[:upper:] = A-Z)
[:alpha:]:大小写字母(同理:[:alpha:] = a-zA-Z)
查看所有的特殊表示法可使用命令:man 7 glob
特殊表示法的运用:
例如:ls [[:alpha:]]*[[:space:]*[^[:alpha:]](显示文件名是以字母开头、非字母结尾且中间包含空白字符的文件)
特别注意:
上述文件名通配的规则并不能描述所有的情况,例如:文件名不包含a的文件。要想描述所有情况,就需要使用正则表达式。

★ 用户及权


☆ 计算机有用户、用户组,文件有属主、属组,进程也有属主、属组,一一对应。每个用户名登录后都会在系统内进行名称解析,生成与用户一一对应的一串数字,即UID,存放在/etc/passwd,密码存放在/etc/shadow。同理,组名(GID),存放在/etc/group,密码存放在/etc/gshadow。所以,与用户信息相关的文件有:passwd文件(记录用户的大部分信息)、shadow文件(记录用户的密码)、group文件(记录用户的附加组),创建新用户除了用命令以外,手动直接编辑上述3个文件内容,然后手动创建家目录后把/etc/skel目录里的环境配置文件复制到家目录中,修改家目录的属主属组也完全可以实现。
☆ 用户的3种权限:
对文件来说:r(可读)、w(可写-可以编辑或删除)、x(可执行)
对目录来说:r(可对此目录执行ls)、w(可在此目录中创建文件)、x(可使用cd切换进此目录,也可以使用ls -l查看内部文件详细信息)
☆ 用户类别
管理员:0
普通用户:1-65535(使用16位二进制数表示,实际中个别系统用户超过了65535,他们就用32位二进制数表示)
系统用户:1-499,无家目录
一般用户:500-60000
说明:管理员是权限最大的用户,普通用户有分为两种:一是系统用户,开机之后跟随操作系统一起启动的进程就是以系统用户的身份运行的,所以系统用户户不需要登录。
☆ 用户组类别:
管理员组
普通组
系统组
一般组
更常用的用户组分类方法:
基本组:一个用户属于多个用户组时,这个用户创建的文件的属组就是这个用户的默认组,也叫基本组。
私有组:创建一个用户时,如果没有给这个用户指定组,那么系统会自动给这个用户分配一个与这个用户同名的组,这个组就是用户的私有组。所以,用户的基本组不一定是他的私有组。
附加组:用户基本组以外的其他组,也叫额外组。
☆ 关于密码的期限
密码最短使用时间:两次修改密码之间最短的时间间隔。
密码最长使用时间:密码的有效期限,即密码保持有效的最大天数。
密码到期日期:expire date,超出之后密码过期。
警告时间:距离密码过期多少天给用户发警告,warning date。
非活动时间:密码过期后距离禁用的最后期限,inactive date。
假设用户的密码最长使用期限是50天,密码过期警告时间是20天,密码非活动时间是3天,如果用户一直不修改密码,则会:第30天开始给用户发密码即将过期警告,在用户每次登陆的时候警告用

户密码即将过期,第50天开始密码过期,用户每次登陆都会强制修改密码,不修改就不能登陆,53天开始用户密码被锁定,只能找管理员解锁。
☆ 关于创建用户时的一些默认设置:
创建用户时如果没指定组,则默认给用户分配一个与其用户名相同的组作为其私有组,GID一般与其UID保持一致,如果GID被其他组占用了,GID就无法与UID一致了,这种情况下,这个用户就属于特殊用户了,其权限也与一般用户不同了。创建用户时如果没指定UID,则默认给用户分配的UID是passwd中最后一个用户UID加1。创建用户时如果没指定家目录,则用户默认的的家目录是在/home下与用户名同名的目录。
☆ 新增用户自动会有家目录、密码期限等一些默认设置的原因:
/etc/default/useradd这个文件记录了新增用户的一些默认设置,可以使用cat /etc/default/useradd来查看,其中HOME=/home表示新增用户的家目录是在/home下与用户名同名的目录,INACTIVE表示密码过期后距离禁用的最后期限,-1表示无限制,EXPIRE表示密码使用期限(即过期期限)
☆ 关于进程、文件的属主和属组
进程有属主、属组,文件也有属主、属组。进程的属主就是运行这个进程的人,进程的属组就是运行这个进程的人的用户组,文件的属主就是创建这个文件的人,文件的属组是创建这个文件的人的基本组。
☆ 关于文件权限位
1、文件权限位表示为3组rwx:第1组是属主的权限,第2组是属组的权限,第3组是其他用户的权限。每一组权限的状态可用3位二进制数表示,例如:rw-(110),而3位2进制数又可用1位8进制数表示,这样3组权限就可用3位8进制数表示了。
2、掌握两种情况下文件权限的判断方法
a、判断用户能否运行一个文件(用户应以什么权限访问文件)
方法:先判断用户是不是文件的属主,如果是,用户就以属主的身份访问文件,用户的权限就是第1组rwx;如果不是,就再判断用户是否属于文件的属组,如果属于,用户就以属组的身份访问文件,用户的权限就是第2组rwx,如果不属于,用户就以其他用户的身份访问这个文件,用户的权限就是第3组rwx。
举例:
用户:tom tom
文件:rwxr-xr-x root root /bin/ls
分析:tom使用ls命令时,相当于访问了ls这个文件。判断tom能否执行ls命令:tom不是ls文件的属主,也不属于ls文件的属组,所以tom要以其他用户的身份访问ls文件,tom的权限是第3组rwx,即r-x,所以tom能够执行ls命令。(这个ls进程的属主就是tom)
b、判断一个进程应以什么权限访问一个文


方法:首先判断进程的属主和文件的属主是不是一样,如果一样,进程就以属主的身份访问这个文件,进程的权限就是第1组rwx;如果进程的属主不是文件的属主,就继续判断进程的属主是不是属于文件的属组,如果属于,进程就以属组的身份访问这个文件,进程的权限就是第2组rwx,如果不属于,进程就以其他用户的身份访问这个文件,进程的权限就是第3组rwx。
举例:
进程:tom tom
文件:rwxrw-r-- jerry tom a.txt
分析:进程的属主不是文件的属主,所以进程的权限不是第1组rwx,进程的属主属于文件的属组,所以进程的权限是第2组rwx,即rw-。
3、关于创建新文件的默认权限
管理员:
创建的文件:644(rw-r--r--)
创建的目录:755
普通用户:
创建的文件:664
创建的目录:775
解释:实际上,创建文件的权限是:666-umask,创建目录的权限是:777-umask。umask叫遮罩码,专门用来计算新建文件或目录的权限,直接输入命令umask即可查看当前用户的遮罩码,管理员的是0022,取后3位022就是管理员的umask,普通用户是0002,取后3位002就是普通用户的umask。所以,管理员创建文件的权限:666-022=644,管理员创建目录的权限:777-022=755,普通用户创建文件的权限:666-002=664,普通用户创建目录的权限:777-002=775。umask命令也可以设定当前用户的umask值,例如:umask 022(设定当前的用户umask值为022)。注意两点:1、不够减的时候该位的结果为0,例如666-027=640;2、Linux强制使新建文件不能有x权限,如果修改umask后使得结果中有x权限,则其权限自动加1。3、
☆ passwd文件内容的解读(可以使用man 5 passwd命令查看)
执行cat /etc/passwd命令,会发现passwd文件中每一行都有7个用“;”隔开的字段,每个字段的含义如下:
第1字段:用户名,account
第2字段:密码,password。这个字段内容是一个X字母,意思是用户的密码不在这里(在/etc/shadow文件中)
第3字段:用户ID,UID
第4字段:用户的基本组ID,GID。(用户的附加组信息不在这里,在group文件中)
第5字段:用户的其他信息(住址、联系方式等,中间用逗号隔开),这个字段的内容往往为空,或者为其用户名。
第6字段:用户的家目录,home dir(系统用户虽然也写有家目录,但实际上这个家目录是没意义的,因为系统用户不允许登录的)
第7字段:用户的默认shell(系统用户写的是nologin,意思是不允许登录。对于普通用户来说

,如果这里记录的是一个非法shell,则这个普通用户也是不能登录的,可以使用cat /etc/shells来查看所有的合法shell)
☆ shadow文件内容的解读(可以使用man 5 shadow命令查看)
执行cat /etc/shadow命令,会发现shadow文件中每一行都有7个用“;”隔开的字段,每个字段的含义如下:
第1字段:用户名,account
第2字段:加密过的密码,encrypted password,使用的是MD5加密算法。记录为:$1$8位字符$长串字符。1表示加密方式,8位字符表示“杂质”(也称sault,随机生成的字符),用来附加在数据后面一起计算特征码,长串字符就是特征码。有的用户这个字段内容是!!或*,表示这个用户是锁定的或者是不允许登录的。
关于加密:
加密有3种方法:1、对称加密:加密和解密使用同一个密码;2、公钥加密:每个密码都成对出现,一个为私钥,一个为公钥,用私钥加密就用公钥解密,用公钥加密就用私钥解密。公钥加密与对称加密相比:密钥更长,安全性更高,但是解密速度更慢。3、单向加密(又叫散列加密、指纹加密、哈希加密),只能由加密前数据生成加密后数据,反之不可以。单向加密采用提取数据特征码的方法来实现(每一个数据都有一个唯一的独有的特征码,数据一样则特征码一样),多用于数据校验。单向加密的特征:单向性、雪崩效应(即蝴蝶效应,数据有一点点改变,会造成其特征码发生巨大变化,可以防破解。蝴蝶效应的演示:先将一个文件复制到当前目录下cp /etc/inittab ./,然后计算其特征码md5sum inittab,会得到一长串字符,再使用nano修改一点点文件内容nano inittab,再计算其特征码md5sum inittab,就会发现这个特征码已经与先前的大不相同了)、定长输出(即文件计算得到的特征码长度固定)。单向加密常用的算法:MD5算法,即Message Digest 5(信息摘要5,5表示算法版本号),是128位的定长输出,这是麻省理工学院人工智能实验室研发的加密算法。SHA1算法,Secure Hash Algorithm 1(安全的哈希算法,1是版本号),是160位定长输出,安全性比MD5更高,此外还有SHA256(256位定长输出)、SHA512(512位定长输出)等多个变种,安全性能达到军用级别。
第3字段:从1970年1月1号到密码最近一次被修改所经过的天数。
第4字段:密码最短使用期限,即两次修改密码之间最短的时间间隔,设置为0则无限制,可以连续修改密码。
第5字段:密码最长使用期限,即到期限之前必须修改密码。
第6字段:密码过期警告时间,即距离密码过期多久的时候给用户发警告。
第7字段:密码禁用

时间,即密码过期之后多久如果再不修改密码就密码禁用
第8字段:密码有效期,设置为99999则为永久有效。
第9字段:保留字段(无任何意义)
☆ group文件内容的解读
执行cat /etc/group命令,会发现group文件中每一行都有4个用“;”隔开的字段,每个字段的含义如下:
第1字段:组名
第2字段:密码占位符
第3字段:组ID
第4字段:以这个组为附加组的用户列表
☆ 锁定用户的方法:在shadow文件中该用户的第2字段起始位置加!!即可。
☆ 用户管理命令
useradd:创建新用户
-u:给新用户指定UID
例如:useradd -u 1000 user1(创建一个名为user1的新用户,指定其UID为1000)
-g:给新用户指定GID(基本组)(必须是已存在的组)
-G:给新用户指定附加组(可以有多个,中间用逗号隔开)
-r:创建一个系统用户(UID小于500且无家目录)
-c:给新用户输入其他信息(注释信息)(用双引号引起来)
-d:给新用户指定家目录
-s:给新用户指定shell的路径(必须是合法的shell)
SHELL也是一个环境变量,到目前为止,我们一共学习了3个环境变量:PATH(可执行文件的默认路径)、HISTSIZE(命令历史缓存的大小)、SHELL(用户默认shell的路径)。可以使用命令:echo $SHELL查看当前用户的默认shell。
-m:强行给新用户创建家目录(-m经常和-k一起使用)
-M:强行不给新用户创建家目录
(即使是在/etc/login.defs中设定要创建家目录也照样不创建,这会导致用户得不到/etc/skel目录里的环境配置信息,但是由于用户有默认shell,所以用户是可以登录的,也可以使用su命令切换到这个用户上,但是会出现警告:“cannot change directory to /home/user1:No such file or directory”以提示该用户没有家目录,用户此时处于/root目录中,另外该用户登录后的命令提示符也有了变化,变成了-bash-3.2$)
关于/etc/login.defs文件:
这个文件记录了创建新用户时所有的默认设定,使用cat /etc/login.defs即可查看这些信息。
-k:强行复制环境配置文件到新用户的家目录中
/etc/skel目录里存放的是环境配置文件,是bath的配置文件(用户默认是bath的话),这些文件时隐藏文件。创建新用户时系统会自动将这些文件复制到新用户的家目录中,所以,-k选项可有可无。
附:手动创建用户的简要过程:(创建用户名为hive,UID和GID都是5000,基本组是hive,附加组mygroup)
nan

o /etc/group(光标移至最后一行,输入:hive:x:5000:,再在mygroup一行的最后输入hive,以加入附加组)
nano /etc/passed(光标移至最后一行,输入:hive:x:5000:5000:HIVR:/home/hive:/bin/bash)
nano /etc/shadow(光标移至最后一行,输入:hive:!!:15765:0:99999:7:::)(15765是用bc计算器算出来的,先用命令查看秒数date +%s,再除以每天的秒数86400即可得到天数15765)
cp -r/etc/skel/ /home/hive(创建家目录)
chown -R hive.hive /home/hive(修改家目录的属主属组)
chmod -R go= /home/hive(修改家目录的权限,使得除属主以外任何人都不能访问)
创建完毕(除了密码以外),然后验证一下:(要养成随手验证的习惯)
ls -la /home/hive(验证家目录中文件的权限)
su - hive(切换到创建的用户看是否正常,新用户还没密码,不能登录,但是能用su切换过去)
id(验证UID、GID、默认组、附加组)
验证无问题,继续手动给新用户加密码:(使用openssl命令来加密)
openssl passwd -1 -salt '86486246'(-1表示使用MD5加密算法,-salt表示给原始密码加盐后再加密,8位的salt自己随便输入,然后敲回车,系统会提示输入密码,输完后敲回车即可显示$1$86486246$...,然后将这一长串字符复制到/etc/shadow中替换掉!!即可)
userdel:删除用户
例如:userdel user1(如果不带任何选项删除以后,用户的家目录是不会被删除的)
-r:删除用户的同时删除其家目录
id:查看用户的UID、GID信息
-u:只看UID
例如1:id -u user1(查看user1用户的UID)
例如2:id -u(查看当前用户的UID)
-g:查看基本组的GID
-G:查看所有组的GID(包括基本组和附加组)
-n:查看用户名或组名(需和-u、-g或-G一起用)
例如:id -u -n user1(查看用户user1的用户名)
finger:查看用户的账号属性信息(家目录、默认shell、上次登录时间、邮箱等)
例如1:finger(查看当前用户的账号属性信息)
例如2:finger user1(查看user1用户的账号属性信息)
usermod:修改用户的账号属性
-u:修改用户的UID
例如1:usermod -u 2002 user3(把user3用户的UID修改为2002)
例如2:usermod -u 2002(把当前用户的UID修改为2002)
-g:修改用户的基本组的GID(该到的组必须是已经存在的组)
-G:修改用户附加组的GID
注意:如果用户此前

已经有一个或多个GID,则修改后用户就只有改完后的一个附加组了,先前的附加组都被覆盖了。
-a:为用户追加一个附加组(需和-G一起用)
-c:为用户增加注释信息
-d:修改用户的家目录
注意:直接使用-d选项会带来一个严重后果:用户如果以前的家目录里有很多文件,则修改家目录后,以前家目录中的文件全都不能访问了。所以,-d选项很少单独使用,-d选项经常配合-m一起使用,表示修改家目录后把以前家目录中的所有文件移至修改后的家目录中。
-l(login name):修改用户的登录名(即用户名)
例如:usermod -l wangwei root(将root用户的用户名改为wangwei)
-s:修改用户的默认shell
-L:锁定用户账号(禁止其登陆)
-U:解锁用户账号
chsh(change shell):修改用户的默认shell
例如:chsh user1(开始修改用户user1的shell),(回车后系统会提示输入新shell的路径),/bin/tcsh(将该用户的默认shell修改为tcsh)
chfn(change finger):修改用户的finger信息(这里指的是注释信息)
例如:chfn user1(开始修改用户user1的注释信息),(回车后系统会依次提示输入用户名、公司地址、公司电话、家庭电话,对应输入后即可修改完毕)
chage(change age):修改用户密码过期信息
-d:修改上次修改密码的日期
-E:修改用户密码到期的日期
-I:修改用户密码的非活动时间
-m:修改用户密码最短使用时间
-M:修改用户密码最长使用时间
-W:修改用户密码告警时间
passwd:修改用户密码
注意:普通用户只能使用passwd修改自己的密码,管理员可以使用passwd修改自己或者其他用户的密码。
例如:passwd user1
--stdin(standard in):接收标准输入密码(即键盘输入来的密码)
说明:此选项一般用于脚本中,用以自动执行完密码修改全过程,因为使用passwd修改密码时系统会提示输入新密码,这对于脚本来说是一种打断,所以在脚本中可以利用管道来自动完成密码修改过程:echo "redhat" | passwd --stdin user1(在脚本中利用管道将user1的密码修改为redhat)
-l:锁定用户账号
-u:解锁用户账号
-d:删除用户密码(删除密码之后,用户就无法登陆了,因为Linux要求所有用户必须有密码才能登陆)
-n:修改用户密码最短使用时间
-x:修改用户密码最长使用时间
-i:修改用户密码的非活动时间(即密码过

期之后的锁定时间,inactive date)
-w:修改用户密码的警告时间(即密码距离过期还剩多少天时发警告,warning date)
pwck(password check):检查用户账号完整性(不常用)
☆ 组管理命令
groupadd:创建组(不加选项时,组的GID默认是上一个组的GID加1)
-g:给创建的组指定GID
-r:创建一个系统组
groupmod:修改组的相关属性
-g:修改GID
-n:修改组名
groupdel:删除一个组
gpasswd:给组加密码
关于组的密码:
当使用newgrp命令临时切换用户的默认组时,系统会提示输入密码,这个密码就是新默认组的组密码,只有这种情况时才用得到组密码。(当用户的新默认组是该用户的附加组时,就不需要输入组密码了,当用户退出登录后,该用户的默认组自动恢复成原来的默认组)
☆ 权限管理命令
chown(change owner):改变文件、目录的属主或属组(只有管理员才可以使用此命令)(不加任何选项则只改变属主)
例如1:chown tom /tmp/a,/tmp/b(把a文件/目录和b文件/目录的属主改为tom)
注意:如果是改变目录的属主,不加选项时改变的只是目录自身的属主,目录里的文件属主并没改变。
-R:递归修改目录及其内部文件或子目录的属主
--reference=:将文件、目录的属主、属组改为和某个文件、目录的属主、属组相同
例如:chown -R --reference=/tmp/abc /tmp/test(将/tmp/test的属主、属组递归修改为和/tmp/abc文件是同一个属主、属组)
USERNAME:GRPNAME(或USERNAME.GRPNAME)用法:同时改变文件、目录的属主和属组
例如:chown tom:root /tmp/abc(把/tmp/abc这个文件、目录的属主改为tom,属组改为root)
:GRPNAME(或.GRPNAME)用法:只改变文件、目录的属组
chgrp(change group):改变文件、目录的属组(只有管理员才可以使用此命令)
例如1:chgrp tom /tmp/a,/tmp/b(把a文件/目录和b文件/目录的属组改为tom)
注意:如果是改变目录的属组,不加选项时改变的只是目录自身的属组,目录里的文件属组并没改变。
-R:递归修改目录及其内部文件或子目录的属组
--reference=:?
例如:chgrp --reference=/tmp/abc /tmp/test(?)
chmod(change mode):修改文件、目录权限
第一类用法:同时修改文件、目录的3类用户权限
例如:chmod 750 /tmp/abc(将/tmp/abc文件、目录的权限修改为rwxr-x---)
注意:如果是改变目录的权限,不加

选项时改变的只是目录自身的权限,目录里的文件权限并没改变。如果输入的是75,则是075,输入的是5,则是005。
-R:递归修改目录及其内部文件或子目录的权限
--reference=:将文件、目录的权限改为和某个文件、目录的权限相同
第二类用法:只修改某类用户或某几类用户的权限
3类用户分别是:属主(u)、属组(g)、其他(o),其实还有一类:全部(a)
例如1:chmod u=r-x /tmp/abc(把/tmp/abc文件、目录的属主权限修改为r-x)
例如2:chmod u=rx /tmp/abc(作用同例1)
例如3:chmod g=r,o=r /tmp/abc(把/tmp/abc文件、目录的属组和其他权限修改为r--)
例如4:chmod go=r /tmp/abc(作用同例3)
例如5:chmod g=rx,o= /tmp/abc(把/tmp/abc文件、目录的属组权限修改为r-x,其他权限修改为---)
第三类用法:只修改某类用户的某位或某些位权限
例如1:chmod u+x,g-x /tmp/abc(把/tmp/abc文件、目录的属主权限添加x,属组权限去掉x)
例如2:chmod +x /tmp/abc(把/tmp/abc文件、目录的属主、属组、其他权限都添加x)(或者写成a+x也行)
例如3:chmod u+rw /tmp/abc(把/tmp/abc文件、目录的属主权限添加rw)

相关主题
文本预览
相关文档 最新文档