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文件中写入内容 可以