Linux

Linux课堂笔记(2)

man page


  • 本地系统上的一个文档(系统手册页);使用man命令访问
  • 阅读man page

标准输入,标准输出和标准错误


  • 一个运行的程序或者为进程需要从某位置读取输入,并将输出写入某位置;从shell提示符运行的命令通常从键盘读取其输入,并将输出发送到终端窗口
  • 一个进程使用称为文件描述符的编号通道获取输入并发送输出;所有进程开始时至少有三个文件描述符
  • 通道(文件描述符)
  • 将输出重定向到文件
1)	>file 2>&1 将标准输出重定向到file,然后将标准错误作为标准输出重定向到相同位置file
2)	2>&1   >file 将标准错误重定向到标准输出的默认位置(终端窗口),然后仅将标准输出重定向到file

构建管道


  • 管道:一个或多个命令的序列,用竖线字符(|)分隔;管道将第一个命令的标准输出连接到下一个命令的标准输入
  • 管道和重定向组合使用
a)	管道输出后使用重定向:  cat /etc/passwd | tail -1 >file1
b)	管道中间使用输出重定向:cat /etc/passwd >file1 | tail -n 2   观察现象,如何解决?
c)	tee命令:在管道中,将标准输入复制到标准输出,并且将标准输出重定向到指定文件
cat  /etc/hosts | tee file1
cat  /etc/hosts | tee file1 | tail -n 1
cat  /etc/hosts | tail -n 1 | tee file1
d)	tee -a 选项:附加到指定文件

tee命令


Linux系统tee命令从标准输入读取内容并同时将标准输出写入一个或多个文件。tee最常用于通过管道与其他命令结合使用

语法: tee [-ai][–help][–version][文件…]

-a或–append  附加到既有文件的后面,而非覆盖它.

-i或–ignore-interrupts  忽略中断信号。

–help  在线帮助。

–version  显示版本信息。

 如何在 Linux 上使用这个命令?

假设因为某些原因,你正在使用 ping 命令。

 ping google.com

然后同时,你想要输出的信息也同时能写入文件。这个时候,tee 命令就有其用武之地了。

 ping google.com | tee output.txt

下面的截图展示了这个输出内容不仅被写入 output.txt 文件,也被显示在标准输出中。

如何确保 tee 命令追加信息到文件中? 默认情况下,在同一个文件下再次使用 tee 命令会覆盖之前的信息。如果你想的话,可以通过 -a 命令选项改变默认设置。

 [command] | tee -a [file]

课堂练习及参考答案


cat /etc/hosts  aa bb cc 完成如下需求

1)	向终端显示输出并忽略所有错误:cat  /etc/hosts  aa  bb  cc   2>/dev/null
2)	将标准输出发送到文件f1;将错误发送到另一个文件f2:cat  /etc/hosts  aa  bb  cc  >f1  2>f2
3)	将标准输出和错误发送到同一个文件f2,且保留原文件内容
cat  /etc/hosts  aa  bb  cc   >>f2    2>&1
4)	将f1文件和f2文件中的内容连接到1个新文件f3:cat  f1  f2  >f3

Vim(vi improved)编辑器:是vi编辑器的改进版,兼容vi指令,语法高亮。


  • Vim管理模式:命令模式,编辑模式,扩展模式(末行模式),可视模式
  • 命令模式按键说明
  • 编辑模式:命令模式中使用字母 i 进入
  • 末行模式:命令模式中使用冒号进入;下表为末行模式操作
  • 可视模式:命令模式中使用字母 v 进入后,使用上下左右键移动
  • 可视模式包含:字符模式(v);行模式(shift+v);块模式(ctrl+v);屏幕底部分别显示VISUAL;VISUAL LINE;VISUAL BLOCK

课堂练习及参考答案


1)	用户家目录下执行ls -al命令将所有内容重定向到名为test文件中
ls  -al   >test
2)	vim编辑文件test,显示行号
vim  test后使用shift冒号进入扩展模式,输入 :set  number回车即可
3)	可视化模式的行模式删除前三行
shift+v进入可视化的行模式,选中删除内容后,x删除
4)	可视化模式的字符模式删除第一行第一列点后面的所有字符
v进入可视化模式的字符模式,选中删除内容后,x删除
5)	可视化模式的块模式删除第二行到最后一行的第一列(不含点)
ctrl+v进入可视化的块模式,选中删除内容后,x删除
6)	删除月份所在列,保存退出
ctrl+v进入可视化的块模式,选中删除内容后,x删除
7)	使用复制方法为文件test做备份,新文件名在原文件名后面加日期的秒数。提示:%s
cp  test  test$(date  +%s)
8)	在原文件test中附加1条虚线,虚线中包含15个短划线---------------
echo  “---------------”  >>test
9)	 1条命令将tmp目录列表附加到文件test,同时将tmp列表附加到一个文件file中,且在屏幕显示最后2行
 ls /tmp | tee -a test | tee file | tail -n 2

用户账户和组概念


  • 用户账户概念:用于在运行命令的不同人员和程序之间提供安全界限;标识UID
  • 用户账户的类型:超级用户,系统用户,普通用户
  • 超级用户账户:用于管理系统;超级用户的名称root;UID=0;对系统具有完全访问权限。
  • 系统用户账户:提供服务进程使用;进程或守护进程通常不需要以超级用户身份运行
  • 普通用户账户:用于处理日常工作,对系统具有有限的访问权限;UID=>1000
  • /etc/passwd文件存储本地用户信息
 该用户的用户名
 固定值x
 该用户账户的UID
 该用户账户的GID
 该用户账户的描述信息
 该用户账户的主目录
 该用户的默认shell程序,登录时运行/bin/bash

组概念


  • 共享文件和其它系统资源访问权限的用户集合;标识GID
  • /etc/group 文件存储本地用户组信息
 该组的组名称
 固定值x
 该组的GID
 属于作为附属组的该组成员的用户列表
  • 主要组和附属组

获取超级用户访问权限


用户切换
su 方式:启动非登录shell,仅以该用户身份启动shell,使用原始用户的环境设置
su - 方式:启动登录shell,将shell环境设置为如同使用该用户身份重新登录一样
sudo 命令
sudo 要求用户输入自己的密码进行身份验证
执行sudo需要配置sudo的配置文件

配置sudo


方法1:使用visudo或者vim修改sudo配置文件,位置:/etc/sudoers
方法2:使用vim在/etc/sudoer.d目录中添加需要提升权限的用户文件

创建用户:useradd  username


  • 创建新用户时在/home目录中自动创建1个和该用户同名的目录作为该用户的家目录
  • 创建新用户时在/etc/passwd文件和/etc/shadow文件中自动添加新用户信息
  • 创建新用户时在/var/spool/mail 目录中创建1个和该用户同名的文件作为该用户的邮箱文件
  • 创建新用户时自动创建1个和该用户同名的组作为该用户的主要组

现有用户修改:usermod   可选项  用户名


删除用户:userdel   可选项   用户名


注意:userdel  用户名:将保留用户的主目录,同时系统将回收未分配的UID,具有未分配UID的所拥有文件;如果未分配的UID分配给了新用户,那么新用户将拥有被删除用户文件的所有权!

创建本地组:groupadd   [选项]  组名


修改本地组:groupmod  [选项]  组名


删除本地组:groupdel [选项] 组名;如果组是任何现有用户的主要组则无法删除


组管理命令:gpasswd

课堂练习及参考答案


1)	创建新用户u1,u2,u3,u4,密码均为redhat123
[root@localhost ~]# useradd u1
[root@localhost ~]# useradd u2
[root@localhost ~]# useradd u3
[root@localhost ~]# useradd u4
[root@localhost ~]# echo redhat123 | passwd --stdin u1
[root@localhost ~]# echo redhat123 | passwd --stdin u2
[root@localhost ~]# echo redhat123 | passwd --stdin u3
[root@localhost ~]# echo redhat123 | passwd --stdin u4
2)	修改配置文件的方式赋予用户u1所有命令权限且免密
[root@localhost ~]# echo "u1 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers
3)	在/etc/sudoers.d/目录中添加文件赋予用户u2所有命令权限且不免密
[root@localhost ~]# echo "u2 ALL=(ALL) ALL" >>/etc/sudoers.d/u2
4)	使用u1用户创建2个新组:group1,GID=30000;group2
[u1@localhost ~]$ sudo groupadd -g 30000 group1
[u1@localhost ~]$ sudo groupadd group2
5)	使用u2用户将u1添加到group1和group2,u2和u3添加到group1
[u2@localhost ~]$ sudo usermod -aG "group1,group2" u1
[u2@localhost ~]$ sudo usermod -aG group1 u2
[u2@localhost ~]$ sudo usermod -aG group1 u3
6)	使用root用户将组group1现在和未来的组成员可以使用的命令权限设置为ALL,用u3验证
[root@localhost ~]# echo "%group1 ALL=(ALL) ALL">> /etc/sudoers
[root@localhost ~]# su - u3
[u3@localhost ~]$ sudo cat /etc/shadow
7)	设置用户u4是组group1和group2的管理员,使用用户u4将group1和group2的组成员清空
[root@localhost ~]# gpasswd -A u4 group1
[root@localhost ~]# gpasswd -A u4 group2
[root@localhost ~]# su - u4
[u4@localhost ~]$ gpasswd -d u1 group1
[u4@localhost ~]$ gpasswd -d u2 group1
[u4@localhost ~]$ gpasswd -d u3 group1
[u4@localhost ~]$ gpasswd -d u1 group2
8)	完成上述实验后,使用root用户删除所有新建的用户,组以及sudo命令提权配置
[root@localhost ~]# userdel -rf u1
[root@localhost ~]# userdel -rf u2
[root@localhost ~]# userdel -rf u3
[root@localhost ~]# userdel -rf u4
[root@localhost ~]# groupdel group1
[root@localhost ~]# groupdel group2
[root@localhost ~]# rm -f /etc/sudoers.d/u2
[root@localhost ~]# vim /etc/sudoers  然后删除如下信息后,保存退出

管理用户密码


  • 配置文件/etc/shadow介绍
a)	3号:上次更改密码的日期距离1970-1-1的天数,按UTC时区计算
b)	4号:上次更改密码到可以再次更改密码之前必须经过的最短天数(0表示可随时更改)
c)	5号:在密码过期之前不进行密码更改可以经过的最长天数
d)	6号:警告期:用户在截至日期之前登陆到达该天数时,收到密码过期警告
e)	7号:非活动期。密码过期后,指定天数内仍然可以登陆。过了这个时间,账户被锁定
f)	8号:密码过期日期。距离1970-1-1起的天数,按UTC时区计算
  • 加密密码的格式:哈希算法;salt;加密哈希;每段信息由$符号分隔
1)	使用的哈希算法:6表示SHA-512(默认);1表示MD5;5表示SHA-256
2)	用于加密密码的salt
3)	用户密码加密的哈希值:salt和未加密密码组合并加密,生成加密的密码哈希
4)	不同用户使用相同相同,生成加密的密码哈希不同,因为salt不同

chage命令配置密码期限


1)	chage  -d  0  user:强制用户user登录时必须更新密码
2)	chage  -E  2021-12-12  user:用户user于2021年12月12日到期
3)	设置密码非活动日期前,必须先设置密码到期日   
  • 限制访问
1)	chage设置用户账户到期日期
2)	usermod命令通过-L选项锁定用户账户
3)	nologin shell

文件权限


  • 文件具有三个应用权限的用户类别:文件所有者;文件所属组;其它
  • 权限优先级:用户权限覆盖组权限;组权限覆盖其它权限
第1个字符:表示文件类型(-常规文件;d目录;l软连接;b和c硬件设备)
第2个字符到第4个字符为一组:表示文件或目录所有者的权限
第5个字符到第7个字符为一组:表示文件或目录所属组的权限
第8个字符到第10个字符为一组:表示其它用户对文件或目录的权限
第11位表示是否有特殊权限
第12位表示硬链接数

课堂练习题如图


1)	哪个常规文件归operator1所有并可被所有用户读取?
2)	哪个文件可以被contractor1用户修改
3)	哪个文件无法被operator2用户读取?
4)	哪个文件的组所有者为consultant1?
5)	哪些文件可以被operator1用户删除?
6)	哪些文件可以被operator2用户删除?
答案:① rfile1     ② lfie2      ③   rfile2    ④  lfile1     ⑤ 都可以      ⑥ 都不可以

更改文件和目录权限:符号法和数值法


  • 符号法
a)	u代表用户,g代表组,o代表其它,a代表全部
b)	+代表添加,-代表删除,=代表精确设置
c)	-R选项以递归方式对目录及目录中的文件设置权限
  • 数值法

更改文件和目录的所有者或组所有权


  • 只有root用户可以更改文件的所有者
  • 文件组所有权可以由root用户或者文件所有者更改
  • root用户可以将文件所有权授予任何组
  • 普通用户只能将文件所有权授予普通用户所属的组(这个组可以是主要组或附属组)

命令格式

chown  所有者    文件或目录
chown   :所属组   文件或目录
chown  所有者:所属组  文件或目录
注意:建议不要用. 替换:

课堂练习


1. root用户创建目录/home/shida和1个名为group1组
[root@localhost ~]# mkdir /home/shida
[root@localhost ~]# groupadd group1
2. 目录/home/shida所属组修改group1
[root@localhost ~]# chown :group1 /home/shida/
3. group1组成员可以在/home/shida目录中创建和删除文件,禁止其它用户访问文件
[root@localhost ~]# chmod 770 /home/shida/
4. 创建两个新用户u1和u2,密码都是redhat123,group1是两个新用户的附属组
[root@localhost ~]# useradd u1
[root@localhost ~]# useradd u2
[root@localhost ~]# echo redhat123 | passwd --stdin u1
[root@localhost ~]# echo redhat123 | passwd --stdin u2
[root@localhost ~]# gpasswd -a u1 group1
[root@localhost ~]# gpasswd -a u2 group1
5. u1用户在/home/shida目录中创建名为u1.txt文件
[u1@localhost ~]$ touch /home/shida/u1.txt
6. u1用户将文件u1.txt所属组修改为组group1
[u1@localhost ~]$ chown :group1 /home/shida/u1.txt
7. 思考u2用户是否可以向u1.txt文件中写入内容
可以