1. Linux的基本原则

  • 一些皆文件
  • 配置文件保存为纯文本格式
  • 由目的单一的小程序组成,组合小程序完成复杂任务
  • 尽量避免捕获用户接口(尽量减少与用户交互,比如如果命令运行成功则不会显示任何信息,没有消息是最好的消息)

2. Linux交互

2.1 Shell分类

Shell是用户和操作系统进行交互的软件。在Linux中它分为如下类型:

  • GUI(图形界面交互)
    • Gnode
    • KDE
    • XFace
  • CLI(命令行交互)
    • sh
    • bash
    • csh
    • zsh
    • ksh
    • tcsh

使用bash登陆Linux后会显示命令提示符(prompt):

[root@localhost ~]#  

其中root是用户名,localhost是主机名,~代表家目录(/代表根目录),#代表管理员($代表普通用户)

虚拟终端(terminal):Ctrl+Alt+F1-F6。Linux中有六个虚拟终端,每个虚拟终端都是一个Shell程序。一个用户可以在多个虚拟终端中同时登陆互不影响。使用init 3命令可以将图形shell转换为命令行Shell,使用init 5则相反。

2.2 bash特性

1、命令历史、命令补全

  history:查看命令历史
 -c:清空命令历史
 -d OFFSET [n]: 删除指定位置的命令
 -w:保存命令历史至历史文件中 

 HISTSIZE环境变量: 命令历史缓冲区大小
 ~/.bash_history:命令历史文件路径

 命令历史的使用技巧:
 !n      :执行命令历史中的第n条命令;
 !-n     :执行命令历史中的倒数第n条命令; 
 !!      : 执行上一条命令;
 !string :执行命令历史中最近一个以指定字符串开头的命令
 !$      :引用前一个命令的最后一个参数; 
 Esc, .  :引用前一个命令的最后一个参数,先按Esc,再按.;
 Alt+.	 :引用前一个命令的最后一个参数,只在linux终端中可以;

 命令、路径补全:
 命令补全:搜索PATH环境变量所指定的每个路径下以我们给出的字符串开头的可执行文件,如果多于一个,两次tab,可以给出列表;否则将直接补全;
 路径补全:搜索我们给出的起始路径下的每个文件名,并试图补全;

2、管道、重定向
3、命令别名

alias CMDALIAS='COMMAND [options] [arguments]' 定义别名
在shell中定义的别名仅在当前shell生命周期中有效;别名的有效范围仅为当前shell进程;

ualias CMDALIAS 解除别名
\CMD : 执行原命令

4、命令行编辑

光标跳转:  

Ctrl+a:跳到命令行首
Ctrl+e:跳到命令行尾
Ctrl+u: 删除光标至命令行首的内容
Ctrl+k: 删除光标至命令行尾的内容
Ctrl+l: 清屏

5、命令行展开

命令替换: $(COMMAND), 反引号:`COMMAND`
把命令中某个子命令替换为其执行结果的过程,如::file-2013-02-28-14-53-31.txt

bash支持的引号:
``: 命令替换
"": 弱引用,可以实现变量替换
'': 强引用,不完成变量替换

命令行展开:
{a,d}_{b,c}
mkdir -pv /mnt/test/{x/m,y}
cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp/

6、文件名通配

 globbing
 *: 任意长度的任意字符
 ?:任意单个字符
 []:匹配指定范围内的任意单个字符
     [abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
     [:space:]:空白字符
     [:punct:]:标点符号
     [:lower:]:小写字母
     [:upper:]: 大写字母
     [:alpha:]: 大小写字母
     [:digit:]: 数字
     [:alnum:]: 数字和大小写字母

  # man 7 glob
  [^]: 匹配指定范围之外的任意单个字符
  [[:alpha:]]*[[:space:]]*[^[:alpha:]]
  注:文件通配符并不能匹配所有情况,比如:显示所有以数字结尾且文件名中不包含空白的文件;ls *[^[:space:]]*[0-9]   ?????????

7、变量
8、编程

注:/etc/shells:指定了当前系统可用的安全shell
练习:
1、创建a123, cd6, c78m, c1 my, m.z, k 67, 8yu, 789等文件;注意,以上文件是以逗号隔开的,其它符号都是文件名的组成部分;
2、显示所有以a或m开头的文件;

ls [am]*  

3、显示所有文件名中包含了数字的文件;

ls *[0-9]*   
ls *[[:digit:]]*  

4、显示所有以数字结尾且文件名中不包含空白的文件;

ls *[^[:space:]]*[0-9]   ?????????  

5、显示文件名中包含了非字母或数字的特殊符号的文件;

ls *[^[:alnum:]]*

2.3 登陆式shell和非登陆式shell

站在用户登录的角度来说,SHELL的类型:

  • 登录式shell:
    • 正常通过某终端登录
    • su - USERNAME
    • su -l USERNAME
  • 非登录式shell:
    • su USERNAME
    • 图形终端下打开命令窗口
    • 自动执行的shell脚本

bash的配置文件:

  • 全局配置

      /etc/profile  
      /etc/profile.d/*.sh  
      /etc/bashrc 
    
  • 个人配置

      ~/.bash_profile 
      ~/.bashrc
    

profile类的文件:

  • 设定环境变量
  • 运行命令或脚本

bashrc类的文件:

  • 设定本地变量
  • 定义命令别名

登录式shell如何读取配置文件?

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell如何配置文件?

~/.bashrc --> /etc/basrc --> /etc/profile.d/*.sh

3. Linux文件系统

Linux的一级目录如下:

  • /boot: 系统启动相关的文件,如内核、initrd,以及grub(bootloader)
  • /dev: 设备文件
  • 设备文件:
    • 块设备:随机访问,数据块
    • 字符设备:线性访问,按字符为单位
    • 设备号:主设备号(major)和次设备号(minor)
  • /etc:配置文件
  • /home:用户的家目录,每一个用户的家目录通常默认为/home/USERNAME
  • /root:管理员的家目录;
  • /lib:库文件
  • 静态库, .a
  • 动态库, .dll, .so (shared object)
  • /lib/modules:内核模块文件
  • /media:挂载点目录,移动设备
  • /mnt:挂载点目录,额外的临时文件系统
  • /opt:可选目录,第三方程序的安装目录
  • /proc:伪文件系统,内核映射文件
  • /sys:伪文件系统,跟硬件设备相关的属性映射文件
  • /tmp:临时文件, /var/tmp
  • /var:可变化的文件
  • /bin: 可执行文件, 用户命令
  • /sbin:管理命令

/usr:shared, read-only
        /usr/bin
        /usr/sbin
        /usr/lib

/usr/local:
        /usr/local/bin
        /usr/local/sbin
        /usr/local/lib

Linux中文件命名规则:

  1. 长度不能超过255个字符;
  2. 不能使用/当文件名
  3. 严格区分大小写

4. Linux命令基础

命令格式:命令 选项 参数

  • 选项
  • 短选项:-
        多个选项可以组合:-a -b = -ab
  • 长选项:--
  • 参数:命令的作用对象

命令类型:

- 内置命令(shell内置),内部,内建  
- 外部命令:在文件系统的某个路径下有一个与命令名称相应的可执行文件

环境变量:命名的内存空间
        变量赋值:NAME=Jerry
        PATH: 使用冒号分隔的路径,命令的默认搜索路径

type: 显示指令属于哪种类型

[root@localhost ~]# type ls
ls is aliased to `ls --color=auto' (命令别名)
[root@localhost ~]# type cd
cd is a shell builtin  (内部命令)
[root@localhost ~]# type vi
vi is /usr/bin/vi (外部命令,对应文件)

5. 查看命令帮助

获得命令的使用帮助:
      内部命令:help COMMAND
      外部命令:COMMAND --help
      在线手册:info COMMAND (不常用)
         文档    :/usr/share/doc
      命令手册:man COMMAND

      注:帮助中符号的意思
            <>:必选
            [] :可选
            ...:可以出现多次
             | :多选一
            {} :分组

man [指定章节数字] COMMAND

[root@localhost ~]# man DATE

DATE(1)(1代表章节)                                                            User Commands                                                                   DATE(1)

NAME(命令名称及功能简要说明)
       date - print or set the system date and time

SYNOPSIS(用法说明,包括可用的选项)
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION(命令功能的详尽说明,可能包括每一个选项的意义)
     OPTIONS:说明每一个选项的意义  
       Display the current time in the given FORMAT, or set the system date.

       Mandatory arguments to long options are mandatory for short options too.

       -d, --date=STRING
              display time described by STRING, not 'now'
FILES:此命令相关的配置文件  
      ......
BUGS: 
      ......
EXAMPLES:使用示例  
      ......
SEE ALSO:另外参照
      ...... 

注:man文档查看方法
    翻屏:
		向后翻一屏:SPACE
		向前翻一屏:b
		向后翻一行:ENTER
		向前翻一行:k

    查找:
		/KEYWORD: 向后
			n: 下一个
			N:前一个 
	
		?KEYWORD:向前
		n: 下一个
		N:前一个 
	
	q: 退出

man帮助中分章节,每个章节中存放不同类型的命令。比如1和5章节中都包含passwd。man命令如果不指定章节数,则默认显示最小章节的命令。查看5章节的passwd帮助使用man 5 passwd:
      1:用户命令(/bin, /usr/bin, /usr/local/bin)
      2:系统调用
      3:库用户
      4:特殊文件(设备文件)
      5:文件格式(配置文件的语法)
      6:游戏
      7:杂项(Miscellaneous)
      8: 管理命令(/sbin, /usr/sbin, /usr/local/sbin)

whatis COMMAND:查看命令属于那些章节

[root@localhost ~]# whatis date  
date (1)             - print or set the system date and time  
date (1p)            - write the date and time

练习:

  1. 使用date单独获取系统当前的年份、月份、日、小时、分钟、秒
  2. echo和printf是内部命令还是外部命令?
  3. echo和printf作用?
  4. echo和printf如何显示“The year is 2013. Today is 26.”为两行?
  5. file命令及其用法?

6. 时间管理

Linux时间有两种。一种是硬件时钟,另一种是系统时钟。

  • 硬件时钟:CPU内置振荡器确定时间,同时CPU内置纽扣电源为振荡器提供电量。
  • 系统时钟:Linux系统启动后,读取硬件时间并以软件方式模拟一个振荡器。date查看的便是系统时钟。

date:时间管理
      -d 后跟字符串,显示字符串指定的时间

[root@localhost ~]# date -d "2 days ago"  
Fri Nov 19 02:05:54 EST 2021  
[root@localhost ~]# date -d "2021/11/21"  
Sun Nov 21 00:00:00 EST 2021    

\\\\ 指定时间输出格式:  
[root@localhost ~]# date -d "10 days ago" +"The day is %Y-%m-%d %H:%M:%S%nThe day is %A"  
The day is 2021-11-11 02:27:09  
The day is Thursday  

\\\\ 修改时间  
[root@localhost ~]# date -s "2019-01-01 08:08:08"
Tue Jan  1 08:08:08 EST 2019

clock、hwclock:硬件时钟

-s 将系统时间更新为硬件时钟
-w 将硬件时钟更新为系统时间

cal:查看日历

7. 目录管理

ls(list):列出指定路径下的文件

 -l:长格式  
	文件类型:  
		-:普通文件 (f)  
		d: 目录文件  
		b: 块设备文件 (block)  
		c: 字符设备文件 (character)  
		l: 符号链接文件(symbolic link file)  
		p: 命令管道文件(pipe)  
		s: 套接字文件(socket)  
	文件权限:9位,每3位一组,每一组:rwx(读,写,执行), r--  
	文件硬链接的次数  
	文件的属主(owner)  
	文件的属组(group)  
	文件大小(size),单位是字节  
	时间戳(timestamp):最近一次被修改的时间  
		访问:access,文件最近访问时间  
		修改:modify,文件内容发生了改变  
		改变:change,metadata,元数据(如文件名、文件权限等属性改变)  
-h:做单位转换,提高信息可读性  
-a: 显示以.开头的隐藏文件  
	. 表示当前目录  
	.. 表示父目录  
-A  显示以.开头的隐藏文件(除.和..目录)  
-d: 显示目录自身属性,而不是目录下的内容。只显示当前文件或目录的属性  
-i: index node, inode  
-r: 逆序显示  
-R: 递归(recursive)显示  

pwd(Printing Working directory):输出当前工作路径

cd: change directory

cd ~: 进入指定用户的家目录  
cd -:在当前目录和前一次所在的目录之间来回切换  

mkdir:创建空目录
      -p: 目录已存在不报错,父路径不存在自动创建
      -v: verbose 打印出创建的每个目录

      mkdir -pv /mnt/test2/{a,d}_{b,c}:命令行展开,创建a_b, a_c, d_b, d_c目录

tree:查看目录树

rmdir (remove directory):删除空目录
      -p: 如果父目录为空也会自动删除

du : 用于显示目录或文件的大小
      -s 仅显示总计
      -h 做单位换算,提高信息可读性

8. 文件管理

8.1 文件操作

touch 修改文件的访问和修改时间为当前时间

 -a  仅仅改变访问时间  
 -m  仅仅改变修改时间  
 -t  指定[[CC]YY]MMDDhhmm[.ss],代替当前时间  
 -c  不创建任何文件  
 注:修改访问或修改任何一个时间都会自动修改改变时间为当前时间

stat 展示文件或文件系统属性

[root@localhost Music]# stat 11.txt 
  File: '11.txt'
  Size: 14              Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 3169019     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2019-01-01 01:01:00.000000000 -0500
Modify: 2019-01-01 01:01:00.000000000 -0500
Change: 2021-11-21 06:07:26.151522828 -0500
 Birth: -

nano:文本编辑器,不常用。

rm 删除文件或目录

-i 每一次删除之前都提示    
-f 忽略不存在的文件,强制删除不提示  
-r 递归删除

cp SRC DEST 复制文件

-r:递归拷贝目录下内容  
-d:复制时保留链接,如果是链接文件复制后依然是链接文件。  
-i:存在目标文件则提示是否覆盖  
-f:覆盖已经存在的目标文件而不给出提示。
-p(小写):保留这个文件原来的权限、属主、属组、时间戳。注:目前我用普通用户复制属主和属组还是变化。
-P(大写):如果是链接复制为连接
-a:归档复制,常用于备份,相当于-dR --preserve=all

多个文件到一个目录
cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp/

mv SRC DEST 移动文件
mv -t DEST SRC -t 是将源和目标位置反向

install 复制文件并可以设置属性

 install -d DIRECOTRY ... :创建目录    
 install -m :可以指定权限  
 install SRC DEST 复制文件,复制之后会有执行权限  
 install -t DIRECTORY SRC...  

8.2 查看文本

cat:连接文件并显示
-n 显示行号
-E 显示每一行的结束符$

[root@localhost Music]# cat file1 file2  
this file is one.  
this file is two.   
[root@localhost Music]# cat -n file1 file2  
     1  this file is one.  
     2  this file is two.  
[root@localhost Music]# cat -E file1 file2  
this file is one.$  
this file is two.$  
[root@localhost Music]# cat -nE file1 file2  
     1  this file is one.$  
     2  this file is two.$

tac: 将文件内容倒着显示

[root@localhost Music]# tac file1
this file is one, the line is 6.
this file is one, the line is 5.
this file is one, the line is 4.
this file is one, the line is 3.
this file is one, the line is 2.
this file is one, the line is 1.

more:以一页一页的方式查看文本,到文件末尾会自动退出。详细使用见man命令

less:less 与 more 类似,less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。到文件末尾不会自动退出。

head:查看前n行
-n: 指定行数,默认为10
tail:查看后n行
      -n: 指定行数,默认为10
      -f: 会把文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。

8.3 文本处理

file: 文本内容

Tom:25:male:2013/05/06  
Jack:24:famale:2013/05/06
Json:23:male:2013/05/06
Mark:26:famale:2013/05/06

cut: 分割文件中的每一行,并只显示选择字段

 -d: 指定字段分隔符,默认是空格
 -f: 指定要显示的字段
	-f 1,3
	-f 1-3

[root@localhost Music]# cut -d : -f 1,3 file3
Tom:male
Jack:famale
Json:male
Mark:famale

sort:文本排序

 -n:数值排序
 -r: 降序
 -t: 字段分隔符
 -k: 以哪个字段为关键字进行排序
 -u: 排序后相同的行只显示一次
 -f: 排序时忽略字符大小写

[root@localhost Music]# sort -n -t : -k 2 file3
ZhangSan:6:famale:2013/05/06
Json:23:male:2013/05/06
WangWu:23:male:2013/05/06
Jack:24:famale:2013/05/06
Tom:25:male:2013/05/06
Mark:26:famale:2013/05/06
ZhaoLiu:26:male:2013/05/06
LiSi:111:male:2013/05/06
[root@localhost Music]# sort -n -t : -k 2 -u file3
ZhangSan:6:famale:2013/05/06
Json:23:male:2013/05/06
Jack:24:famale:2013/05/06
Tom:25:male:2013/05/06
Mark:26:famale:2013/05/06
LiSi:111:male:2013/05/06

uniq:去重,去重时两行相邻并且内容一致才会认定是重复

 -c: 显示文件中行重复的次数
 -d: 只显示重复的行

wc (word count):文本统计,打印文件的行数、单词数、字节数

 -l:打印行数
 -w:打印单词数
 -c:打印字节数
 -L:打印最长行的长度

tr —— 转换或删除字符

tr [OPTION]... SET1 [SET2]
      -d: 删除出现在字符集中的所有字符
tr ab AB :将文档中的a全部转换为A,将b全部转换为B,并不是ab转AB

练习:
1)在/mnt下创建boot和sysroot;
2)在/mnt/boot下创建grub;
3)在/mnt/sysroot下创建proc, sys, bin, sbin, lib, usr, var, etc, dev, home, root, tmp
      a)在/mnt/sysroot/usr下创建bin, sbin, lib
      b)在/mnt/sysroot/lib下创建modules
      c)在/mnt/sysroot/var下创建run, log, lock
      d)在/mnt/sysroot/etc下创建init.d
4)创建目录/backup;
5)复制目录/etc至/backup目录中,并重命名为“etc-当前日期”,如etc-2013-02-26;要求保留文件原来的属性,保持链接文件;
6)复制文件/etc/inittab为/tmp/inittab.new,并删除inittab.new文件的后两行;

  # cp /etc/inittab  /tmp/inittab.new  
  # nano /tmp/inittab.new

7)描述GPL, BSD, Apache三个开源协定的大体联系及区别。 8)如何获取Linux当前最新的内核版本号?

  www.kernel.org

9)列出你所了解的Linux发行版,并说明其跟Linux内核的关系。

Linux, GNU: GNU/Linux, 源代码

发行版:Fedora, RedHat(CentOS), SUSE, Debian(Ubuntu, Mint), Gentoo, LFS(Linux From Scratch)

9. 用户、权限和组基础

Linux的用户管理使用如下机制:
      认证机制:Authentication(使用用户名密码)
      授权:Authorization(使用权限管理)
      审计:Audition (日志)

权限: r, w, x

文件:

  • r:可读,可以使用类似cat等命令查看文件内容;
  • w:可写,可以编辑或删除此文件;
  • x: 可执行,eXacutable,可以命令提示符下当作命令提交给内核运行;

目录:

  • r: 可以对此目录执行ls以列出内部的所有文件;
  • w: 可以在此目录创建文件;
  • x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息;

权限和数字对应关系:

 0 000 ---: 无权限
 1 001 --x: 执行
 2 010 -w-: 写
 3 011 -wx: 写和执行
 4 100 r--: 只读
 5 101 r-x: 读和执行
 6 110 rw-: 读写
 7 111 rwx: 读写执行

 755:rwxr-xr-x
 640:rw-r----- 
 660: rw-rw----
 775: rwxrwxr-x

用户:UID, /etc/passwd

account: 登录名
password: 密码
UID:
GID:基本组ID
comment: 注释
HOME DIR:家目录
SHELL:用户的默认shell

组:GID, /etc/group

组名:  
密码:  
GID:  
以此组为其附加组的用户列表:

影子口令:
用户:/etc/shadow

account: 登录名  
encrypted password: 加密的密码  
date of last password change:最近一次修改密码的时间
minimum password age:最短使用期限
maximum password age:最长使用期限
password warning period:警告时间
password inactivity period:非活动时间
account expiration date:账号过期时间

组:/etc/gshadow

影子文件中存储的密码都会进行相应的单向加密,加密算法分类如下:

  • 对称加密:加密和解密使用同一个密码
  • 公钥加密:每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key)
  • 单向加密,散列加密:提取数据特征码,常用于数据完整性校验
  • 1、雪崩效应
  • 2、定长输出
  • MD5:Message Digest, 128位定长输出
  • SHA1:Secure Hash Algorithm, 160位定长输出

用户类别:

  • 管理员:0
  • 普通用户: 1-65535
  • 系统用户:1-499
  • 一般用户:500-60000

用户组类别:

  • 私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户名同名的组
  • 基本组:用户的默认组
  • 附加组,额外组:默认组以外的其它组

10. 用户管理

useradd [options] USERNAME 添加用户

 -u UID(用户ID)
 -g GID(基本组ID\基本组名,组必须存在)
 -G GID,...  (附加组)
 -c "COMMENT" (注释)
 -d /path/to/directory (家目录)
 -s SHELL (指定SHELL)
 -m -k (创建家目录。-k将/etc/skel下内容复制到家目录中)
 -M (不创建家目录)
 -r: 添加系统用户

/etc/login.defs : 文件用于在Linux创建用户时,对用户的一些基本属性做默认设置。该配置对root用户无效。并且,当此文件中的配置与 /etc/passwd 和 /etc/shadow 文件中的用户信息有冲突时,系统会以/etc/passwd 和 /etc/shadow 为准。

userdel [option] USERNAME 删除用户

 -r: 同时删除用户的家目录

id:查看用户的帐号属性信息

 -u: 显示用户ID
 -g: 显示基本组ID
 -G: 显示附加组ID
 -n: 每个选项不显示ID,显示名称

[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

finger USERNAME:查看用户账号信息

usermod : 修改用户帐号属性

-u UID 修改用户ID
-g GID 修改基本组
-a -G GID:不使用-a选项,会覆盖此前的附加组;
-c:修改用户账户备注文字
-d -m:修改用户的家目录,-m选项是将原来家目录中的内容复制新的家目录
-s:修改用户shell
-l:修改用户帐号名称
-L:锁定帐号
-U:解锁帐号
usermod -a -G GROUPNAME,... USERNAME

chage : 修改用户密码信息

-d: 最近一次的修改时间
-E: 过期时间
-I:非活动时间
-m: 最短使用期限
-M: 最长使用期限
-W: 警告时间

chsh: 修改用户的默认shell

chfn:修改注释信息

11. 密码管理

passwd [USERNAME]

 --stdin : 从标准输入中读入,主要用于管道传入
 -l:锁定帐号 
 -u:解锁帐号  
 -d: 删除用户密码

pwck:检查用户帐号完整性

[root@localhost ~]# pwck
user 'ftp': directory '/var/ftp' does not exist
user 'saslauth': directory '/run/saslauthd' does not exist
user 'gluster': directory '/run/gluster' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'gnome-initial-setup': directory '/run/gnome-initial-setup/' does not exist
pwck: no changes

12. 组管理

groupadd 添加组

 -g GID 指定组ID
 -r:添加为系统组

groupmod 修改组

 -g GID 修改组ID
 -n GRPNAME 更改组名称

groupdel 删除组
gpasswd:为组设定密码
      gpasswd -d A GROUP :将用户A从GROUP组移除
newgrp GRPNAME <--> exit:为用户指定临时基本组,需要指定组密码,用exit退出。

[demo@localhost ~]$ id
uid=1000(demo) gid=1000(demo) groups=1000(demo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[demo@localhost ~]$ newgrp hadoop 
Password: 
[demo@localhost ~]$ id
uid=1000(demo) gid=1001(hadoop) groups=1001(hadoop),1000(demo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[demo@localhost ~]$ exit
exit
[demo@localhost ~]$ id
uid=1000(demo) gid=1000(demo) groups=1000(demo) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

练习:
1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux;

# groupadd -g 3003 distro
# groupadd linux
# useradd -u 2002 -g distro -G linux mandriva

2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh;

# useradd -c "Fedora Community" -s /bin/tcsh fedora

3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora;

# usermod -u 4004 -g linux -G distro,fedora mandriva

4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天;

# passwd -n 2 -x 50 fedora

5、将mandriva的默认shell改为/bin/bash;

usermod -s /bin/bash mandirva

6、添加系统用户hbase,且不允许其登录系统;

# useradd -r -s /sbin/nologin hbase

13. 修改权限

chown USERNAME file,... 改变文件属主(只有管理员可以使用此命令)

 -R: 修改目录及其内部文件的属主
 --reference=/path/to/somefile file,...:将文件的属主和属组和参照文件保持一致
 
 chown    :GRPNAME file,...      :改变文件属组信息
 chown    .GRPNAME file,...      :改变文件属组信息
 chown USERNAME:GRPNAME file,... :改变文件属主、属组信息
 chown USERNAME.GRPNAME file,... :改变文件属主、属组信息

chgrp GRPNAME file,... 改变文件属组(只有管理员可以使用此命令)

-R: 修改目录及其内部文件的属组
--reference=/path/to/somefile file,...:将文件的属组和参照文件保持一致  

chmod MODE file,... 修改文件的权限

-R: 修改目录及其内部文件的权限
--reference=/path/to/somefile file,... :将文件的权限和参照文件保持一致 

修改所用户用户权限:
chmod  MODE file,...
chomd  755 /home/demo/11.txt

修改某类用户用户权限:
u(属主),g(属组),o(其他),a(所有)
chmod 用户类别=MODE file,...
chomd  u=rw /home/demo/11.txt	

修改某类用户的某位或某些位权限:
u,g,o,a
chmod 用户类别+|-MODE file,...
chmod u+w /home/demo/11.txt	
chmod ug+w /home/demo/11.txt	
chmod u+w,g+r /home/demo/11.txt

练习:

1、新建一个没有家目录的用户openstack;

# useradd -M openstack  

2、复制/etc/skel为/home/openstack;

# cp -r /etc/skel /home/openstack  

3、改变/home/openstack及其内部文件的属主属组均为openstack;

# chown -R openstack:openstack /home/openstack  

4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限

# chmod -R go= /home/openstack  (不修改属主的权限) 

5、不用命令如何添加一个用户

在/etc/passwd、/etc/shadow、/etc/group中分别添加一条记录
使用openssl passwd -1 -salt xxxxxxxx(八位随机数) password 获取加密密码
使用如上步骤

14. 遮掩码

umask:遮罩码 每个用户都会有一个遮掩码,遮掩码的作用是设置用户创建文件或目录的权限。Linux文件默认不具有执行权限。

文件权限:666-umask (文件不具有执行权限) 
目录权限:777-umask

umask: 023

文件:666-023=643 X (文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限加1;故结果应为644)
目录:777-023=754

注:umask:027 创建的文件或目录其它用户无任何权限

15. 管道与重定向

程序在运行过程中需要和I/O设备打交道,而程序一般是不直接指定具体的输入和输出设备的。因此系统为我们提供了一些默认的输入和输出设置。

  • 默认输出设备:标准输出,STDOUT, 1(文件描述符),键盘
  • 默认输入设备:标准输入, STDIN, 0(文件描述符) ,显示器
  • 标准错误输出:STDERR, 2(文件描述符) ,显示器

I/O重定向就是修改程序的输入和输出的位置。

>:  标准输出覆盖输出
>>:标准输出追加输出
2>: 重定向错误输出
2>>:重定向错误输出追加方式
&>: 重定向标准输出或错误输出至同一个文件
<:输入重定向
<<:Here Document 此处生成文档
    使用:<<EOF或者END
         cat << EOF
         cat >> /tmp/myfile.txt << EOF

        [root@localhost ~]# cat
		this is my first line.
		this is my first line.
		this is my secondary line.
		this is my secondary line.
		^C
		[root@localhost ~]# cat << EOF
		> this is my first line.
		> this is my secondary line.
		> EOF
		this is my first line.
		this is my secondary line.
		[root@localhost ~]# cat >> /tmp/myfile.txt << EOF
		> this is my first line.
		> this is my secondary line.
		> EOF
		[root@localhost ~]# cat /tmp/myfile.txt 
		this is my first line.
		this is my secondary line.

tee:将标准输入写入标准输出和文件
    echo “hello world”|tee /tmp/hello.out

set可以对系统的某些功能性选项进行开启或关闭。

set -C: 禁止对已经存在文件使用覆盖重定向;  
强制覆盖输出,则使用 >|
set +C: 关闭上述功能

管道:一端流入,一端流出。即前一个命令的输出,作为后一个命令的输入。

命令1 | 命令2 | 命令3 | ...
echo “redhat” | passwd -stdin hive:使用命令行修改用户密码

练习: 1、统计/usr/bin/目录下的文件个数;

 # ls /usr/bin | wc -l

2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;

 # cut -d: -f7 /etc/passwd | sort -u

3、思考:如何显示/var/log目录下每个文件的内容类型?

 # file /var/log/*
 # file 'ls /var/log'

4、取出/etc/inittab文件的第6行;

 # head -6 /etc/inittab | tail -1

5、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;

 # tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users

6、显示/etc目录下所有以pa开头的文件,并统计其个数;

# ls -d /etc/pa* | wc -l

7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;

# echo "alias cls=clear" >> ~/.bashrc

16. 文本匹配

16.1 常规正则表达式

grep: 根据模式搜索文本,并将符合模式的文本行显示出来。 Pattern(模式): 文本字符和正则表达式的元字符组合而成匹配条件 grep [options] PATTERN [FILE...]

-i:忽略大小写
--color : 匹配到的字符串亮色显示
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-E:使用扩展正则表达式
-A:显示匹配字符串的前N行
-B:显示匹配字符串的后N行
-C:显示匹配字符串的前后N行

Pattern(模式)元字符如下:

字符匹配::
	.: 匹配任意单个字符
	[]: 匹配指定范围内的任意单个字符
	[^]:匹配指定范围外的任意单个字符
	字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]
匹配次数(贪婪模式)
    *: 匹配其前面的字符任意次	
	\?: 匹配其前面的字符1次或0次
	\{m,n\}:匹配其前面的字符至少m次,至多n次
        a, b, ab, aab, acb, adb, amnb
		a*b, a?b
		a.*b
	
		.*: 任意长度的任意字符
        \{1,\}
        \{0,3\}

位置锚定:

^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行

\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

分组:

\(\)
\(ab\)* 
后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
如:demo
	He love his lover.
	She like her liker.
	He like his lover.
[root@localhost ~]# grep "\(l..e\).*\1r\." demo
He love his lover.
She like her liker.

练习: 1、显示/proc/meminfo文件中以不区分大小的s开头的行;

grep -i '^s' /proc/meminfo
grep '^[sS]' /proc/meminfo

2、显示/etc/passwd中以nologin结尾的行;

grep 'nologin$' /etc/passwd

3、取出默认shell为/sbin/nologin的用户列表

grep "nologin$' /etc/passwd | cut -d: -f1

4、取出默认shell为bash,且其用户ID号最小的用户的用户名

grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

5、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行; grep ':[0-9]:' /etc/inittab

5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;

grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;

grep '^\([0-9]\).*\1$' /etc/inittab

7、找出某文件中的,1位数,或2位数;

grep '[0-9]\{1,2\}' /proc/cpuinfo
grep --color '\<[0-9]\{1,2\}\>' /proc/cpuinfo

8、找出ifconfig命令结果中的1-255之间的整数;

9、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd

grep '^student\>' /etc/passwd | cut -d: -f3
id -u student

10、 分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:

l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3

grep '^l\([0-9]\):\1.*\1$' /etc/inittab

16.2 扩展正则表达式

grep -E = egrep

字符匹配:
.
[]
[^]

次数匹配:
*: 
?:
+: 匹配其前面的字符至少1次
{m,n}

位置锚定:
^
$
\<
\>

分组:
():分组
\1, \2, \3, ...

或者
|: or
C|cat: 为 C或cat 不是 Cat或cat

练习: 1、显示所有以数字结尾且文件名中不包含空白的文件;

ls *[^[:space:]]*[0-9]   ?????????

2、找出/boot/grub/grub.conf文件中1-255之间的数字;

\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
ifconfig | egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' 

ifconfig | egrep --color '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

只查找前三类IP地址:(1-223)
\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>

17 权限提升

su [-l] 用户名:切换用户
sudo COMMAND:完成部分特权指令

配置文件/etc/sudoers文件中的如下行: 
106 ## Allows people in group wheel to run all commands
107 %wheel  ALL=(ALL)       ALL

18 其它

计算机总线:

  • 地址总线:内存寻址
  • 数据总线:传输数据
  • 控制总结:控制指令

环境变量:

PATH  
HISTSIZE  
SHELL:用户当前使用SHELL  

LANG=en 修改Linux编码

进程:在每个进程看来,当前主机上只存在内核和当前进程
进程是程序的副本,进程是程序执行实例

read : 从标准输入中读取数据,并以空格切分。将分割结果存入后面参数中的变量。
https://www.runoob.com/linux/linux-comm-read.html