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命令的应用,还比较缺乏实践,未能形成肌肉记忆,还需要继续深入学习。