2019-2020-1 20209329《Linux内核原理与分析》第一周作业

《Linux内核原理与分析》第一周作业

实验3 Linux用户及文件权限管理

1.查看用户所在用户组

方法一:使用groups命令

输入命令:

groups [用户名]

返回结果:

遇到的疑问:返回结果与实验楼实验楼环境返回的结果不一致。

通过百度了解到,Linux系统的用户可以属于多个组,一个用户在某个组内就说明该用户具有该组相应的权限,例如zbl用户在sudo组内说明该用户具有执行一些或所有需要root权限的命令;在adm组内说明该用户具有访问某种系统日志文件的权限。

问题延申:

普通用户加sudo执行与root用户执行有什么区别?
不同的用户之间的环境配置并不相同,sudo执行需要root权限的命令可以让普通用户执行需要root的操作的同时,保持原有的环境配置。

为什么不直接用root用户对系统进行操作?
root用户权限过大,一条命令的执行错误有可能会造成不可挽回的后果,且root用户环境下执行程序会有重大安全隐患。

方法二:查看/etc/group文件

输入命令:

cat /etc/group | sort

这里cat命令用于读取指定文件的内容并打印到终端输出,sort表示将读取的文本进行一个字典排序再输出。
返回结果为以下格式:

group_name:password:GID:user_list

可以看到sudo组中有zbl用户,password为x表示密码不可见。

2.将其它用户加入 sudo 用户组

一般情况下,新创建的用户是不具有 root 权限的,也不在sudo组,我们可以让其加入 sudo 用户组从而获取 root 权限。
输入命令

sudo usermod -G sudo [用户名]

注意要在具有sudo权限的用户环境下,执行此条命令。

执行以下命令,查看li用户所在的组是否包含sudo组。

groups li

输出结果:

可以看到我们成功将li用户添加到sudo组中,这样li用户也可以拥有root权限了。

3.查看文件权限及修改权限

我们事先在li用户下创建iphone11文件
输入以下命令查看iphone11权限

ls -alh iphone11

返回结果:

可以看到文件所有者是li用户,所属用户组是li组。

我们可以使用以下命令往iphone11文件写入一些内容

echo ""hello world"" > iphone11

输入以下命令修改iphone11所有者为zbl

sudo chown zbl iphone11

此时再次查看iphone11的权限发现,文件所有者已经改为zbl。

4.修改文件权限

目前iphone11对li组的用户仍提供读和写的权限

执行命令

cat iphone11

可以看到iphone11里面的内容

我们可以通过修改文件权限使得li组无法读写iphone11文件
输入以下命令修改iphone11文件为仅供文件所有者读写

sudo chmod 600 iphone11

查看iphone文件权限,可以发现此时iphone11仅供文件所有者读写

此时在li用户下无法查看iphone11

5.作业

添加一个用户 loutest,使用 sudo 创建文件 /opt/forloutest,设置成用户 loutest 可以读写。
首先通过以下命令新建用户loutest,并设置相关的内容。

sudo adduser loutest

返回结果:

然后将loutest用户添加到sudo组,使得loutest用户拥有sudo权限
输入以下命令

sudo usermod -G sudo loutest

再输入以下命令

su -l loutest

切换到loutest用户环境

输入命令

sudo touch /opt/forloutest

创建文件/opt/forloutest

可以看到opt文件夹下已成功创建forloutest文件。

实验4 Linux 目录结构及文件基本操作

Linux的目录结构一般是遵循FHS标准构建的。FHS 定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin 与 /sbin 则应该放置可执行文件等等。第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统日志文件,/usr/share 放置共享数据等等。

FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

1.批量修改文件名

通过ls查看当前文件发现有几个.txt文件

执行命令

rename 's/.txt/.c/' *.txt
ls

可以发现之前的几个.txt文件都变成了.c文件
执行命令

rename 'y/a-z/A-Z/' *.c
ls

可以发现之前的.c文件的小写字母都变成大写字母了。

2.作业

创建一个 homework 目录,建立名为 1.txt ~ 10.txt 文件,并删除 1.txt ~ 5.txt
输入以下命令

mkdir homework
ls

返回结果

新的目录homework已经创建。
输入以下命令

touch {1..10}.txt
ls

1.txt ~ 10.txt 文件已经创建。
输入以下命令,删除1.txt ~ 5.txt

rm {1..5}.txt
ls


可以看到,1.txt ~ 5.txt已经被删除。

实验5环境变量与文件查找

1.创建一个shell脚本

利用Vim创建新文件hello_shell.sh,并写入如下代码

#!/bin/bash

for ((i=0; i<10; i++));do
    echo "hello shell"
done

exit 0

保存退出,修改hello_shell.sh文件权限,添加可执行文件权限

chmod 755 hello_shell.sh

运行hello_shell.sh文件

./hello_shell.sh

2.添加自定义路径到“ PATH ”环境变量

执行以下命令将hello_bash.sh移动到mybin目录

mv hello_bash.sh mybin/

为了打开不在当前目录下的可执行文件,我们需要对将可执行文件的路径添加到环境变量。

PATH=$PATH:/home/zbl/mybin

此时,打开可执行文件不需要在文件所在目录

心得:在编写linux脚本的时候第一行不能省略#!/bin/bash,#!是特殊的表示符,其后指明了解释此脚本的shell的路径。

3.作业

找出 /etc/ 目录下的所有以 .list 结尾的文件。

locate /etc/*.list

返回结果

挑战1 寻找文件

有一个非常重要的文件(sources.list)但是你忘了它在哪了,你依稀记得它在 /etc/ 目录下,现在要你把这个文件找出来,然后设置成自己可以访问,但是其他用户并不能访问。

首先执行命令

locate /etc/*.list

返回结果

执行命令切换到文件所在目录下,并修改sources.list文件权限为仅自己可以访问。

cd /etc/apt
sudo chown zbl sources.list
sudo chmod 600 sources.list

查看sources.list文件权限是否修改成功

ls ahl sources.list

返回结果

实验6 文件打包与解压缩

1.zip打包

-r 表示递归打包,将目录下所有文件打包。
-9 表示打包速度与大小等级设定,1表示最快压缩但体积大,9表示体积最小但耗时最久。
-q 表示静默打包,不向终端输出信息。
-o 表示输出文件,后面需要紧跟文件名。
输入命令对当前目录下的1.txt文件进行压缩,并查看是否压缩成功

zip -r -9 -q -o zbl.zip /home/zbl/1.txt
ls

2.zip解压缩

输入命令,将zbl.zip解压缩到ziptest目录(没有目录将自动创建)

unzip -q zbl.zip -d ziptest

3.作业

创建一个名为 test 的文件,分别用 zip 和 tar 打包成压缩包,再解压到 /home/zbl/ziptest 目录。

touch test
zip -9 -q -o test.zip test
tar -cf test.tar test 
ls


解压

unzip -q test.zip -d /home/zbl/ziptest
tar -xf test.rar -C /home/zbl/ziptest

实验7 文件系统操作与磁盘管理

1.创建虚拟磁盘

dd if=/dev/zero of=virtual.img bs=1M count=256

2.虚拟磁盘挂载

mount -o loop -t ext4 virtual.img /mnt

3.作业

找出当前目录下面占用最大的前十个文件

du -a | sort -n -r | head -n 10

实验8 Linux下的帮助命令

Linux命令分为内建命令和外部命令。

内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在 bash 源码的 builtins 里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等。

外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin 等等。比如:ls、vi 等。

type命令可以对此进行区分

help命令是用于显示 shell 内建命令的简要帮助信息。

实验9 Linux任务计划crontab

1.在/home/zbl目录下创建一个以当前的年月日时分秒为名字的空白文件。

crontab -e

利用vim对任务进行书写,在文档的最后一排输入

*/1 * * * * touch /home/zbl/$(date +\%Y\%m\%d\%H\%M\%S)

2.启动cron守护进程

ps aux | grep cron
# or
pgrep cron

查看文件,可以看到每一分钟生成一个文件,任务已经开始执行了。

挑战2备份日志

小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用 alternatives.log 日志替代),备份当天的日志并删除之前的日志。而且备份之后文件名是 年-月-日 的格式。alternatives.log 在 /var/log/ 下面。

  • 目标
    • 1.为 zbl 用户添加计划任务
    • 2.每天凌晨 3 点的时候定时备份 alternatives.log 到 /home/shiyanlou/tmp/ 目录
    • 3.命名格式为 年-月-日,比如今天是 2017 年 4 月 1 日,那么文件名为 2017-04-01
      为当前用户添加计划任务
crontab -e

利用vim添加如下代码

0 3 * * * cp alternatives.log /home/zbl/tmp/$(date +\%Y-\%m-\%d)

实验10 命令执行顺序控制与管道

1.执行顺序选择

which cowsay>/dev/null && echo "exist"

&& 表示前一条命令执行成功时才执行后一条命令,|| 表示上一条命令执行失败后才执行下一条命令

2.cut命令,1,6显示第1和第6段

cut /etc/passwd -d ':' -f 1,6

3.wc计数命令

wc -l /etc/passwd # 行数
wc -w /etc/passwd # 单词数

4.wc结合管道,统计/etc下面所有目录数

ls -dl /etc/*/ | wc -l

心得体会

这几天快速地学习了Linux系统相关的概念和命令,对Linux系统有了更直观的认识,也发现了Linux系统于Windows系统的不同之处,比如一切皆文件(包括物理设备),以及目录结构的概念,磁盘是挂载在目录上的,这些概念都让我耳目一新。目前我对Linux系统的认识都还比较模糊且浅显,对于Linux命令的应用,还比较缺乏实践,未能形成肌肉记忆,还需要继续深入学习。

原文地址:https://www.cnblogs.com/Alannic/p/13795930.html