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

  • 相关阅读:
    virtualenv+pyenv管理python工作环境
    OpenStack 安装:neutron服务
    OpenStack 安装:nova服务
    node.js工具 nodemon使用
    js的数据类型及数据类型检测
    Git 工具
    Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()判断数组的方法的优缺点
    重绘和回流及优化
    jsapi 调起微信支付的的踩坑
    总结Jquery中获取自定义属性使用.attr()和.data()以及.prop()的区别
  • 原文地址:https://www.cnblogs.com/Alannic/p/13795930.html
Copyright © 2011-2022 走看看