抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Linux 考试知识点详解(更易懂版本)

没有安装centos?没关系在线运行centos8(访问该网站不能使用网络代理):CentOS 8点击就用

1、创建文件,复制文件;注意复制的路径

  • 学习重点命令: touch, cp
  • touch 命令作用: 想象你有一个笔记本,touch 命令就像是你在笔记本上新建了一个空白页,或者在已有的页面上更新了一下日期,表示你最近看过它。简单来说,它用于创建新的空文件,或者更新现有文件的“最后访问时间”和“最后修改时间”。
  • touch 命令详细参数与解释:

    • 不加任何参数:

      touch my_document.txt
      

      这会在你当前所在的目录下创建一个名为 my_document.txt 的空文件。如果这个文件已经存在,那么它会更新这个文件的“最后访问时间”和“最后修改时间”为你执行命令的那一刻。

    • -a: 只修改文件的“最后访问时间”。就像你只是翻阅了笔记本的某一页,但没有在上面写任何东西。

      touch -a my_document.txt
      

      执行后,my_document.txt 的“最后访问时间”会被更新,但“最后修改时间”保持不变。

    • -c--no-create: 如果文件不存在,则不会创建它。就像你本来想在笔记本上写点东西,但发现笔记本不在身边,所以你什么也没做。

      touch -c non_existent_file.txt
      

      如果 non_existent_file.txt 不存在,这条命令不会创建它,也不会报错。

    • -d--date=STRING: 使用你指定的日期和时间来设置文件的“最后访问时间”和“最后修改时间”。就像你在笔记本的某一页上写下了“我是在 X 年 X 月 X 日读到这里的”。

      touch -d "2023-10-26 15:00" old_document.txt
      

      这条命令会将 old_document.txt 的时间设置为 2023 年 10 月 26 日下午 3 点。

    • -m: 只修改文件的“最后修改时间”。就像你在笔记本的某一页上写了一些新的内容。

      touch -m my_document.txt
      

      执行后,my_document.txt 的“最后修改时间”会被更新,但“最后访问时间”保持不变。

    • -r--reference=FILE: 使用另一个文件的时间戳来设置目标文件的时间戳。就像你把两页笔记本的日期都改成了相同的日期。

      touch -r reference_file.txt target_file.txt
      

      这条命令会将 target_file.txt 的时间设置得和 reference_file.txt 一样。

    • -t STAMP: 使用 [[CC]YY]MMDDhhmm[.ss] 格式的时间戳来设置时间。这是一种更精确的指定时间的方式。

      touch -t 202310271030.50 my_log.txt
      

      这条命令会将 my_log.txt 的时间设置为 2023 年 10 月 27 日上午 10 点 30 分 50 秒。

  • touch 命令使用示例总结:

    • 创建单个空文件:
      touch newfile.txt
      
    • 一次性创建多个空文件:
      touch file1.txt file2.txt file3.txt
      
    • 更新文件的“最后访问时间”和“最后修改时间”为当前时间:
      touch existingfile.txt
      
  • cp 命令作用: cp 命令就像是复印机,它可以复制文件或整个文件夹。
  • cp 命令详细参数与解释:

    • 不加任何参数:

      cp source.txt destination.txt
      

      这会将 source.txt 复制一份,并命名为 destination.txt,放在你当前所在的目录下。如果 destination.txt 已经存在,它会被覆盖。

    • -a--archive: 复制时保留所有信息,包括文件权限、时间戳等。就像复印的时候连纸张的质地和颜色都一起复制了。通常用于备份。

      cp -a /home/user/documents /backup/documents
      

      这会完整地复制 documents 目录及其内容到 /backup/ 目录下。

    • -d--no-dereference --preserve=links: 如果是复制链接文件(类似快捷方式),则复制链接本身,而不是链接指向的实际文件。

      cp -d symbolic_link.txt /backup/
      

      这条命令会复制 symbolic_link.txt 这个链接文件本身,而不是它指向的文件。

    • -f--force: 如果目标文件已存在,强制覆盖,不提示。就像你复印的时候直接把原来的文件扔掉,换上新的。

      cp -f new_version.txt /data/old_version.txt
      

      即使 /data/old_version.txt 已经存在,这条命令也会用 new_version.txt 直接覆盖它。

    • -i--interactive: 如果目标文件已存在,会提示你是否覆盖。就像你复印的时候会问你:“这里已经有一份了,要覆盖吗?”

      cp -i document.txt /backup/
      

      如果 /backup/document.txt 存在,会提示你输入 y (yes) 或 n (no) 来决定是否覆盖。

    • -l--link: 不复制文件内容,而是创建一个硬链接。硬链接就像是同一个文件的多个名字,它们指向同一个数据块。

      cp -l original.txt link_to_original.txt
      

      修改 link_to_original.txt 的内容,original.txt 的内容也会改变,因为它们实际上是同一个文件。

    • -p--preserve[=ATTR_LIST]: 复制时保留指定的属性,例如文件权限、时间戳等。

      cp -p important.txt /backup/
      

      这条命令会尽可能地保留 important.txt 的原有属性。

    • -r-R--recursive: 递归复制,用于复制整个目录及其内容。就像你把整个文件夹,包括里面的所有文件和子文件夹都一起复制了。

      cp -r my_folder /backup/my_folder_backup
      

      这条命令会复制 my_folder 目录及其所有内容到 /backup/ 目录下。

    • -s--symbolic-link: 创建符号链接而不是复制文件。符号链接就像是快捷方式,指向另一个文件或目录。

      cp -s target_file.txt symbolic_link.txt
      

      symbolic_link.txt 会成为指向 target_file.txt 的快捷方式。

    • -u--update: 只有当源文件比目标文件新,或者目标文件不存在时,才进行复制。就像你只复印更新的版本。

      cp -u newer_file.txt /data/
      

      如果 /data/newer_file.txt 不存在,或者 newer_file.txt 比它新,才会执行复制。

    • -v--verbose: 显示详细的复制过程,你会看到每个文件是如何被复制的。

      cp -rv my_folder /backup/
      

      这条命令会详细列出复制 my_folder 目录时每个文件的复制情况。

  • cp 命令使用示例总结:

    • 复制单个文件到当前目录并重命名:
      cp source.txt destination.txt
      
    • 复制单个文件到指定目录:
      cp source.txt /home/user/backup/
      
    • 复制整个目录到当前目录并重命名:
      cp -r sourcedir destdir
      
    • 复制整个目录到指定目录:
      cp -r sourcedir /opt/
      
  • 注意事项:

    • 路径问题至关重要! 复制时要搞清楚源文件和目标文件的位置。
    • 绝对路径:从根目录 / 开始的完整路径,像一棵树的主干,例如 /home/user/document.txt
    • 相对路径:相对于你当前所在目录的路径,像树枝。例如,如果你在 /home/user/ 目录下,要访问 documents 目录下的 file.txt,可以使用 documents/file.txt
    • 覆盖风险:不加 -i 参数时,如果目标路径已存在同名文件,cp 命令会直接覆盖,像直接替换,所以要小心!
    • 复制目录时必须使用 -r-R 参数,告诉 cp 命令要递归复制整个目录树。

2、创建用户,用户组

  • 学习重点命令: useradd, passwd, groupadd, usermod, groupmod, userdel, groupdel
  • useradd 命令作用: 想象你的电脑是一个大房子,useradd 命令就像是给这个房子添加一个新的房间,并给房间分配一个主人。简单来说,它用于创建新的用户账户。
  • useradd 命令详细参数与解释:

    • 不加任何参数:

      sudo useradd newuser
      

      这会在系统中创建一个名为newuser的新用户,但是这个用户没有设置密码,也没有家目录。家目录可以理解为用户自己的房间,用于存储自己的文件。

    • -c COMMENT: 给用户添加注释信息,就像是给房间贴上标签,说明这个房间是做什么用的。

      sudo useradd -c "John Doe's Account" johndoe
      

      这条命令会创建一个名为 johndoe 的用户,并添加注释信息 “John Doe’s Account”。

    • -d HOME_DIR: 指定用户的主目录,也就是用户的“房间”的位置。

      sudo useradd -d /home/janedoe janedoe
      

      这条命令会创建一个名为 janedoe 的用户,并将其主目录设置为 /home/janedoe

    • -e EXPIRE_DATE: 设置用户的过期日期,就像是租房合同到期一样。日期格式为 YYYY-MM-DD

      sudo useradd -e 2024-12-31 tempuser
      

      这条命令会创建一个名为 tempuser 的用户,该用户将在 2024 年 12 月 31 日过期。

    • -g INITIAL_GROUP: 指定用户的初始组。组就像是家庭,初始组就是用户的主要家庭。组必须已经存在。

      sudo groupadd developers # 首先创建一个名为 developers 的组
      sudo useradd -g developers devuser
      

      这条命令会创建一个名为 devuser 的用户,并将其初始组设置为 developers

    • -G GROUP1[,GROUP2,...]: 指定用户的附加组,也就是用户的其他家庭。组必须已经存在。

      sudo groupadd testers # 首先创建一个名为 testers 的组
      sudo useradd -g developers -G testers devuser
      

      这条命令会将 devuser 用户添加到 testers 组。

    • -m--create-home: 自动创建用户的主目录。这是最常用的选项,就像是给用户分配一个房间。

      sudo useradd -m testuser
      

      这条命令会创建一个名为 testuser 的用户,并自动创建其主目录 /home/testuser

    • -M--no-create-home: 不创建用户的主目录。

      sudo useradd -M specialuser
      

      这条命令会创建一个名为 specialuser 的用户,但不创建主目录。

    • -p PASSWORD: 指定用户的加密密码。不建议直接在命令行中使用这个选项,因为这样不安全。 设置密码应该使用 passwd 命令。
    • -s SHELL: 指定用户的默认 Shell。Shell 可以理解为用户和系统之间的翻译官。

      sudo useradd -s /bin/bash scriptuser
      

      这条命令会创建一个名为 scriptuser 的用户,并将其默认 Shell 设置为 /bin/bash

    • -u UID: 指定用户的 UID (用户ID),这是用户的唯一标识符,就像是身份证号码。

      sudo useradd -u 1001 newguy
      

      这条命令会创建一个名为 newguy 的用户,并将其 UID 设置为 1001。

  • useradd 命令使用示例总结:

    • 创建一个用户并自动创建主目录(常用):

      sudo useradd -m testuser
      
    • 创建用户并指定主目录、初始组和附加组:

      sudo useradd -d /opt/devhome -g developers -G testers devuser
      
  • passwd 命令作用: 用于设置或更改用户的密码。就像是给用户的房间设置一把锁。
  • passwd 命令使用示例:

    • 设置当前用户的密码(如果是第一次设置,需要输入旧密码进行验证):

      passwd
      
    • 设置指定用户的密码(需要 sudo 权限):

      sudo passwd testuser
      

      系统会提示你输入两次新密码。

  • groupadd 命令作用: 用于创建新的用户组。就像是建立一个新的家庭。
  • groupadd 命令详细参数与解释:

    • 不加任何参数:

      sudo groupadd newgroup
      

      这会在系统中创建一个名为newgroup的新组。

    • -g GID: 指定组的 GID (组ID),这是组的唯一标识符,就像是家庭的门牌号。

      sudo groupadd -g 1005 testers
      

      这条命令会创建一个名为 testers 的组,并将其 GID 设置为 1005。

    • -r: 创建系统组。系统组的 GID 通常较小,用于系统服务。

      sudo groupadd -r systemgroup
      

      这条命令会创建一个名为 systemgroup 的系统组。

  • groupadd 命令使用示例总结:

    • 创建一个普通组:

      sudo groupadd developers
      
    • 创建一个指定 GID 的组:

      sudo groupadd -g 1005 testers
      
  • usermod 命令作用: 用于修改已存在用户的属性。就像是修改用户的房间配置或者更改用户的家庭。
  • usermod 命令详细参数与解释: usermod 的许多参数与 useradd 相同,只是它们用于修改现有用户,而不是创建新用户。

    • -aG:将用户追加到某个组中。-a参数必须和-G参数配合使用,-a表示追加。

      sudo usermod -aG testers testuser
      

      这条命令会将 testuser 用户添加到 testers 组,而不会影响 testuser 已经属于的其他组。

    • -g:修改用户的初始组。

      sudo usermod -g newgroup testuser
      

      这条命令会将 testuser 用户的初始组改为 newgroup

    • -l:修改用户名。

      sudo usermod -l newuser olduser
      

      这条命令会将 olduser 的用户名改为 newuser

    • -d:修改用户的主目录。

      sudo usermod -d /home/newhome testuser
      

      这条命令会将 testuser 用户的主目录改为 /home/newhome

    • -m: 将家目录中内容移动到新位置. (只有在和-d一起时才会生效)

      sudo usermod -d /home/newhome testuser -m
      

      这条命令会将 testuser 用户的主目录改为 /home/newhome,并将家目录中内容移动到新位置。

  • usermod 命令使用示例总结:

    • 将用户添加到某个组:

      sudo usermod -aG testers testuser
      
    • 修改用户的初始组:

      sudo usermod -g newgroup testuser
      
    • 修改用户名:

      sudo usermod -l newuser testuser
      
  • groupmod 命令作用: 用于修改已存在用户组的属性。就像是修改家庭的配置,例如改名或者换门牌号。
  • groupmod 命令详细参数与解释:

    • -g GID: 修改组的 GID。

      sudo groupmod -g 1010 developers
      

      这条命令会将 developers 组的 GID 修改为 1010。

    • -n NEW_GROUP_NAME: 修改组的名称。

      sudo groupmod -n dev_team developers
      

      这条命令会将 developers 组重命名为 dev_team

  • groupmod 命令使用示例总结:

    • 修改组的 GID:

      sudo groupmod -g 1010 developers
      
    • 修改组名:

      sudo groupmod -n dev_team developers
      
  • userdel 命令作用: 用于删除用户账户。就像是把用户的房间从房子里移除。
  • userdel 命令详细参数与解释:

    • 不加任何参数:

      sudo userdel olduser
      

      这会从系统中删除名为olduser的用户, 但是不会删除它的家目录。

    • -r: 同时删除用户的主目录以及邮件池。就像是把用户的房间和所有物品都清理掉。

      sudo userdel -r olduser
      

      这条命令会删除 olduser 用户及其主目录和邮件池。

  • userdel 命令使用示例总结:

    • 删除用户,但不删除其主目录:

      sudo userdel testuser
      
    • 删除用户并删除其主目录和邮件池:

      sudo userdel -r olduser
      
  • groupdel 命令作用: 用于删除用户组。就像是解散一个家庭。
  • groupdel 命令使用示例:

    • 删除用户组:
      sudo groupdel oldgroup
      
  • 注意事项:

    • 创建和管理用户及用户组通常需要管理员权限,因此需要使用 sudo 命令,就像你需要房子的钥匙才能进行这些操作。
    • 删除用户时,要考虑清楚是否需要删除用户的主目录。如果该用户的文件归属关系没有妥善处理,可能会导致文件权限问题,就像是房间被移除了,但里面的东西还在,不知道该归谁。
    • 删除用户组前,需要确保该组没有任何用户,否则可能会导致用户账户异常,就像是一个家庭解散了,但还有人住在里面。

3、设置定时任务

  • 学习重点命令: crontab
  • crontab 命令作用: crontab 就像一个智能闹钟,可以让你设置在特定的时间自动执行某些任务。
  • crontab 命令详细参数与解释:

    • -e: 编辑当前用户的定时任务列表。就像是设置你的闹钟。

      crontab -e
      

      执行后,会打开一个文本编辑器(通常是 vinano),你可以在里面编辑你的定时任务。

    • -l: 列出当前用户的定时任务列表。就像是查看你已经设置了哪些闹钟。

      crontab -l
      

      执行后,会显示你当前已有的定时任务。

    • -r: 删除当前用户的定时任务列表。就像是清空你的闹钟设置。

      crontab -r
      

      执行后,会删除你所有的定时任务。

    • -u user: 指定要操作哪个用户的定时任务列表(需要 sudo 权限)。就像是帮别人设置闹钟。

      sudo crontab -u otheruser -e
      

      这条命令会编辑 otheruser 用户的定时任务列表。

  • crontab 文件格式: 每一行代表一个定时任务,格式如下:

    minute hour day_of_month month day_of_week command
    

    这五个时间字段分别代表:

    • minute: 分钟 (0-59),表示每个小时的第几分钟执行。
    • hour: 小时 (0-23),表示每天的几点钟执行(24 小时制)。
    • day_of_month: 月份中的日期 (1-31),表示每个月的哪一天执行。
    • month: 月份 (1-12 或 Jan-Dec),表示每年的哪个月执行。
    • day_of_week: 星期几 (0-6 或 Sun-Sat,其中 0 和 7 都表示星期日),表示每周的星期几执行。
    • command: 要执行的命令或脚本的完整路径。就像是闹钟响了之后要做的事情。
  • 特殊字符:

    • *: 星号表示“任意”或“所有”。例如,hour 字段设置为 * 表示每个小时都执行。
    • ,: 逗号用于分隔多个值。例如,minute 字段设置为 15,45 表示每个小时的第 15 分钟和第 45 分钟都执行。
    • -: 连字符表示一个范围。例如,day_of_month 字段设置为 1-5 表示每个月的 1 号到 5 号都执行。
    • /n: 斜杠表示每隔 n 个单位。例如,minute 字段设置为 */10 表示每隔 10 分钟执行一次。
  • crontab 命令使用示例:

    • 编辑当前用户的定时任务列表:

      crontab -e
      

      然后在打开的编辑器中添加定时任务,例如:

      0 3 * * * /home/user/backup.sh
      

      这表示每天凌晨 3 点执行 /home/user/backup.sh 这个脚本。

      30 4 1 * * /home/user/monthly_report.sh
      

      这表示每月1号凌晨4点30分执行 /home/user/monthly_report.sh 这个脚本。

      0 0 * * 0 /home/user/weekly_report.sh
      

      这表示每周日凌晨0点执行/home/user/weekly_report.sh 这个脚本。

      */5 * * * * /home/user/check_status.sh
      

      这表示每5分钟执行一次 /home/user/check_status.sh 这个脚本。
      保存并退出编辑器,定时任务就会生效。

    • 列出当前用户的定时任务列表:

      crontab -l
      
    • 删除当前用户的定时任务列表:

      crontab -r
      
  • 注意事项:

    • 编辑定时任务时,要确保命令或脚本的路径正确,并且该脚本有执行权限 (可以使用 chmod +x script.sh 添加执行权限)。
    • 定时任务的执行结果通常会通过邮件发送给用户。如果你不需要邮件通知,可以将输出重定向到 /dev/null,例如:

      0 3 * * * /home/user/backup.sh >/dev/null 2>&1
      

      >/dev/null 表示将标准输出重定向到空设备,2>&1 表示将标准错误输出也重定向到标准输出。

    • 你可以查看系统日志(例如 /var/log/syslog/var/log/cron)来确认定时任务是否按预期执行。
    • 除了用户级别的定时任务,还有系统级别的定时任务,通常配置在 /etc/crontab 文件中,需要 sudo 权限进行编辑。/etc/crontab 文件中每行定时任务配置的第六个位置可以指定执行定时任务的用户。

4、文件内容的替换,sed命令

  • 学习重点命令: sed
  • sed 命令作用: sed 是一个强大的“流编辑器”,它可以对文本进行各种操作,比如查找、替换、删除、插入等等。你可以把它想象成一个文本加工厂,可以按照你的指令对文本进行批量处理。
  • sed 命令详细参数与解释:

    • -e script--expression=script: 添加一个 sed 命令到要执行的命令列表中。你可以使用多个 -e 选项来执行多个命令。

      sed -e 's/apple/orange/g' -e 's/banana/grape/g' fruits.txt
      

      这条命令会将 fruits.txt 文件中所有的 “apple” 替换为 “orange”,所有的 “banana” 替换为 “grape”。

    • -f script-file--file=script-file: 从文件中读取 sed 命令。这在你有很多命令需要执行时很有用。

      # 首先创建一个包含 sed 命令的文件 commands.sed:
      # s/apple/orange/g
      # s/banana/grape/g
      sed -f commands.sed fruits.txt
      

      这条命令会执行 commands.sed 文件中的所有 sed 命令。

    • -i[SUFFIX]--in-place[=SUFFIX]: 直接修改文件内容。使用这个选项要特别小心,因为它会直接修改原始文件! 建议先备份文件。如果提供 SUFFIX,则会先备份原始文件,例如 .bak

      sed -i 's/red/blue/g' colors.txt
      

      这条命令会直接修改 colors.txt 文件,将所有的 “red” 替换为 “blue”。

      sed -i.bak 's/red/blue/g' colors.txt
      

      这条命令会先将 colors.txt 备份为 colors.txt.bak,然后再进行替换操作。

    • -n--quiet--silent: 取消默认输出。sed 默认会输出每一行,不管它是否被修改过。使用 -n 选项可以只输出那些被修改过的行。

      sed -n 's/hello/world/p' greetings.txt
      

      这条命令只输出那些 “hello” 被替换为 “world” 的行。p 命令表示打印匹配的行。

    • -r--regexp-extended: 使用扩展的正则表达式。扩展的正则表达式支持更多的元字符,例如 +, ?, |, (), {}

      sed -r 's/colou?r/color/g' text.txt
      

      这条命令会将 “color” 和 “colour” 都替换为 “color”。? 表示前面的字符 u 是可选的。

  • sed 命令常用命令:

    • s/pattern/replacement/flags: 替换命令,这是 sed 最常用的命令。

      • s:表示替换 (substitute)。
      • pattern:要查找的模式,可以是普通文本或正则表达式。
      • replacement:替换后的文本。
      • flags:标志,可以修改替换行为。
        • g:全局替换,替换所有匹配项,而不是只替换第一个。
        • i:忽略大小写。
        • N:替换第 N 次匹配项。例如,s/a/b/2 会将每行中第二个出现的 “a” 替换为 “b”。
      sed 's/apple/orange/g' fruits.txt # 全局替换
      sed 's/Apple/Orange/i' fruits.txt # 忽略大小写替换
      sed 's/the/THE/2' text.txt # 只替换每行中第二个出现的 "the"
      
    • d: 删除匹配到的行。

      sed '/^#/d' config.txt # 删除以 "#" 开头的行(通常是注释)
      sed '5,10d' data.txt # 删除第 5 行到第 10 行
      sed '$d' file.txt # 删除最后一行
      
    • p: 打印匹配到的行(通常与 -n 选项一起使用)。

      sed -n '/error/p' log.txt # 只打印包含 "error" 的行
      
    • a\: 在匹配到的行之后添加新行。

      sed '/total/a\---' report.txt # 在包含 "total" 的行之后添加一行 "---"
      
    • i\: 在匹配到的行之前添加新行。

      sed '/header/i\***' document.txt # 在包含 "header" 的行之前添加一行 "***"
      
    • c\: 将匹配到的行替换为新行。

      sed '/old data/c\new data' file.txt # 将包含 "old data" 的行替换为 "new data"
      
  • sed 命令使用示例总结:

    • 将文件中所有的 “old” 替换为 “new” 并输出到终端:

      sed 's/old/new/g' file.txt
      
    • 直接修改文件,将所有的 “old” 替换为 “new”:

      sed -i 's/old/new/g' file.txt
      
    • 备份文件,然后将所有的 “old” 替换为 “new”:

      sed -i.bak 's/old/new/g' file.txt
      
    • 只打印包含 “error” 的行:

      sed -n '/error/p' file.txt
      
    • 删除包含 “warning” 的行:

      sed '/warning/d' file.txt
      
    • 在包含 “info” 的行之后添加一行 “—- End of Info —-“:

      sed '/info/a\--- End of Info ---' file.txt
      
    • 替换每一行的第一个“foo”为“bar”

      sed 's/foo/bar/' file.txt
      
    • 替换每一行的第3个到最后所有的“foo”为“bar”

      sed 's/foo/bar/3g' file.txt
      
  • 注意事项:

    • 使用 -i 选项直接修改文件内容时要格外小心,最好先备份文件,就像做手术前要先做检查。
    • 正则表达式在 sed 命令中非常强大,但学习起来也比较复杂。
    • sed 默认使用 / 作为分隔符,但如果模式中包含 /,可以使用其他字符作为分隔符,例如 s#old#new#g,这里使用 # 作为分隔符。
    • 可以结合多个简单的sed命令来完成复杂的编辑任务。例如,要删除文件中的所有空行,并将所有“apple”替换为“orange”,可以使用:sed '/^$/d; s/apple/orange/g' file.txt。其中/^$/d删除空行,s/apple/orange/g替换文本。两个命令之间使用分号分隔。

5、查找文件并删除,find命令

  • 学习重点命令: find
  • find 命令作用: find 命令就像一个超级侦探,可以在你的文件系统中找到符合你指定条件的文件或目录。
  • find 命令详细参数与解释:

    • path...: 指定要查找的目录路径。可以指定多个路径,find 会在这些路径下进行查找。如果不指定路径,则默认在当前目录下查找。

      find /home /var/log # 在 /home 和 /var/log 目录下查找
      find . # 在当前目录下查找
      find # 不指定路径,也是在当前目录下查找
      
    • -name pattern: 按文件名查找,支持通配符 (*, ?, [])。

      find / -name "*.txt" # 查找所有以 .txt 结尾的文件
      find . -name "report?.doc" # 查找 report 开头,后面跟一个任意字符,以 .doc 结尾的文件,例如 report1.doc, reportA.doc
      find . -name "[abc]*" # 查找以 a, b 或 c 开头的文件
      
    • -iname pattern: 按文件名查找,忽略大小写。

      find . -iname "readme.md" # 查找 readme.md, ReadMe.MD, README.md 等文件,不区分大小写
      
    • -type c: 按文件类型查找。c 可以是以下几种:

      • f:普通文件 (regular file)。
      • d:目录 (directory)。
      • l:符号链接 (symbolic link)。
      • b:块设备文件 (block special file)。
      • c:字符设备文件 (character special file)。
      • p:命名管道 (FIFO)。
      • s:套接字 (socket)。
      find /tmp -type f # 查找 /tmp 目录下所有的普通文件
      find . -type d # 查找当前目录下所有的子目录
      find / -type l -name "lib*" # 查找 / 目录下所有以 "lib" 开头的符号链接
      
    • -size n[ckMG]: 按文件大小查找。n 是数字,单位可以是:

      • c:字节 (bytes)。
      • k:KB (kilobytes)。
      • M:MB (megabytes)。
      • G:GB (gigabytes)。
      • 可以使用 + 表示大于,- 表示小于,不加符号表示等于。
      find . -size +10M # 查找当前目录下大于 10MB 的文件
      find / -size -1k # 查找根目录下小于 1KB 的文件
      find . -size 50c # 查找当前目录下大小为 50 字节的文件
      
    • -user username: 按文件所有者查找。

      find /home -user alice # 查找 /home 目录下所有者为 alice 的文件
      
    • -group groupname: 按文件所属组查找。

      find /data -group developers # 查找 /data 目录下所属组为 developers 的文件
      
    • -mtime n: 按文件修改时间 (modification time) 查找,n 是天数。

      • +n:n 天前被修改过。
      • -n:n 天内被修改过。
      • n:正好在 n 天前被修改过。
      find . -mtime -7 # 查找当前目录下 7 天内被修改过的文件
      find / -mtime +30 # 查找根目录下 30 天前被修改过的文件
      find . -mtime 1 #查找1天前那天修改的文件
      
    • -atime n: 按文件访问时间 (access time) 查找,用法同 -mtime

      find . -atime -1 # 查找当前目录下 1 天内被访问过的文件
      
    • -ctime n: 按文件状态更改时间 (change time) 查找,用法同 -mtime。文件状态更改包括文件权限、所有者、所属组的变化,也包括文件内容的修改。

      find / -ctime +90 # 查找根目录下 90 天前状态被更改过的文件
      
    • -exec command {} \;: 对找到的文件执行指定的命令。

      • {}:表示找到的文件名。
      • \;:表示命令结束。
      find . -name "*.tmp" -exec rm {} \; # 查找当前目录下所有以 .tmp 结尾的文件并删除它们
      find /data -type f -size +100M -exec ls -lh {} \; # 查找 /data 目录下大于 100MB 的文件并列出它们的详细信息
      
    • -delete: 删除找到的文件或目录。使用这个选项要非常小心,因为它会直接删除文件,且不可恢复!

      find . -name "*~" -delete # 查找当前目录下所有以 "~" 结尾的文件并删除它们(很多编辑器会生成这种临时备份文件)
      
    • -print: 打印找到的文件名。这是 find 命令的默认行为,所以通常不需要显式指定。

      find . -name "*.txt" -print # 查找当前目录下所有以 .txt 结尾的文件并打印它们的文件名
      
  • find 命令使用示例总结:

    • 在当前目录下查找所有以 .txt 结尾的文件:

      find . -name "*.txt"
      
    • /home 目录下查找所有名为 important.conf 的文件:

      find /home -name "important.conf"
      
    • /var/log 目录下查找所有大于 1MB 的日志文件:

      find /var/log -type f -size +1M
      
    • 在当前目录下查找所有属于用户 testuser 的文件:

      find . -user testuser
      
    • 在当前目录下查找所有 7 天前被修改过的文件并删除它们:

      find . -mtime +7 -delete
      
    • 在当前目录下查找所有以 .log 结尾的文件,并将它们移动到 /tmp/logs/ 目录:

      find . -name "*.log" -exec mv {} /tmp/logs/ \;
      

    如果/tmp/logs目录不存在,需要先创建:mkdir -p /tmp/logs-p参数表示连同上级目录一起创建。

  • 注意事项:

    • 使用 -delete 参数删除文件时务必小心,删除操作不可逆,就像泼出去的水收不回来。建议先使用 -print 确认要删除的文件,确保无误后再使用 -delete
    • -exec 参数可以执行任何命令,需要注意安全性,防止误操作或被恶意利用。
    • 通配符在不同的上下文中含义可能不同,在 find -name 中,需要用引号括起来以避免 shell 解释。例如,find . -name *.txt 会查找以 .txt 结尾的文件,但 find . -name * 由于没有引号,shell 可能会先展开 *,导致结果不符合预期。
    • find命令默认是递归查找,如果不想递归查找,可以使用-maxdepth参数指定最大深度。例如:find . -maxdepth 1 -name "*.txt"表示只在当前目录下查找,不进入子目录。

6、文件权限,chmod,chown

  • 学习重点命令: chmod, chown
  • chmod 命令作用: chmod 用于修改文件或目录的权限。在 Linux 中,每个文件和目录都有三组权限:所有者 (user)、所属组 (group) 和其他用户 (others)。每组权限又分为三种:读 (read)、写 (write) 和执行 (execute)。就像是给你的文件或目录设置不同的访问密码。
  • chmod 命令权限表示:

    • 对象:

      • u:所有者 (user)。
      • g:所属组 (group)。
      • o:其他用户 (others)。
      • a:所有用户 (all),相当于 ugo
    • 操作:

      • +:添加权限。
      • -:移除权限。
      • =:设置权限。
    • 权限:

      • r:读权限 (read),可以查看文件内容或列出目录中的文件。
      • w:写权限 (write),可以修改文件内容或在目录中创建、删除文件。
      • x:执行权限 (execute),可以运行可执行文件或进入目录。
  • chmod 命令数字模式: 除了使用字母表示权限,还可以使用数字来表示。

    • r:4
    • w:2
    • x:1

    将用户、组和其他用户的权限值相加得到一个三位数字。例如:

    • 755u=rwx (4+2+1=7), g=rx (4+1=5), o=rx (4+1=5)。表示所有者有读、写、执行权限,所属组和其他用户有读和执行权限。
    • 644u=rw (4+2=6), g=r (4), o=r (4)。表示所有者有读、写权限,所属组和其他用户只有读权限。
    • 600u=rw (4+2=6), g=--- (0), o=--- (0)。表示只有所有者有读、写权限,其他用户没有任何权限。
  • chmod 命令详细参数与解释:

    • -R--recursive: 递归修改目录及其所有内容的权限。

      chmod -R 755 my_folder
      

      这条命令会递归地将 my_folder 目录及其所有子目录和文件的权限设置为 755

    • --reference=RFILE: 使用参考文件 RFILE 的权限来设置目标文件的权限。

      chmod --reference=template.txt new_file.txt
      

      这条命令会将 new_file.txt 的权限设置得和 template.txt 一样。

    • -v--verbose: 显示详细的权限修改信息。

      chmod -v u+x script.sh
      

      这条命令会显示 script.sh 的权限修改过程。

  • chmod 命令使用示例:

    • 给文件 script.sh 的所有者添加执行权限:

      chmod u+x script.sh
      
    • 移除文件 data.txt 所属组的写权限:

      chmod g-w data.txt
      
    • 设置目录 myfolder 的权限为所有者读写执行,所属组读执行,其他用户只读:

      chmod 754 myfolder
      
    • 递归设置目录 webroot 及其所有内容的权限为所有者读写执行,所属组读执行,其他用户只读:

      chmod -R 755 webroot
      
    • 设置文件data.txt权限为-rw-r--r--

      chmod 644 data.txt
      
    • 设置文件script.sh权限为-rwxr--r--

      chmod 744 script.sh
      
  • chown 命令作用: chown 用于修改文件或目录的所有者和所属组。就像是更改房子的主人和所属的家庭。
  • chown 命令详细参数与解释:

    • -R--recursive: 递归修改目录及其所有内容的所有者和所属组。

      sudo chown -R newuser:newgroup my_folder
      

      这条命令会递归地将 my_folder 目录及其所有子目录和文件的所有者改为 newuser,所属组改为 newgroup

    • --from=CURRENT_OWNER:CURRENT_GROUP: 仅当文件的当前所有者和所属组匹配时才进行修改。

      sudo chown --from=olduser:oldgroup newuser:newgroup file.txt
      

      只有当 file.txt 的当前所有者是 olduser 且当前所属组是 oldgroup 时,这条命令才会将文件的所有者改为 newuser,所属组改为 newgroup

    • --reference=RFILE: 使用参考文件 RFILE 的所有者和所属组来设置目标文件的所有者和所属组。

      sudo chown --reference=template.txt new_file.txt
      

      这条命令会将 new_file.txt 的所有者和所属组设置得和 template.txt 一样。

    • -v--verbose: 显示详细的修改信息。

      sudo chown -v newuser file.txt
      

      这条命令会显示 file.txt 的所有者修改过程。

  • chown 命令使用示例:

    • 将文件 myfile.txt 的所有者修改为 newuser

      sudo chown newuser myfile.txt
      
    • 将文件 myfile.txt 的所有者修改为 newuser,所属组修改为 newgroup

      sudo chown newuser:newgroup myfile.txt
      
    • 仅修改文件所属组:
    sudo chown :newgroup myfile.txt
    
    • 递归将目录 mydir 及其所有内容的所有者修改为 webadmin,所属组修改为 www-data
      sudo chown -R webadmin:www-data mydir
      
  • 注意事项:

    • 修改文件权限和所有者通常需要管理员权限,因此需要使用 sudo 命令,就像你需要房子的钥匙才能更改房子的主人。
    • 递归修改权限和所有者时要格外小心,确保操作符合预期,不要误操作导致系统出现问题。
    • 理解 Linux 的用户、组和权限模型是正确使用 chmodchown 的基础。每个文件和目录都有所有者、所属组和其他用户的概念,以及读、写、执行三种权限。

7、ACL权限,默认ACL,递归设置

  • 学习重点命令: setfacl, getfacl
  • ACL (Access Control List) 权限作用: ACL 权限是对基本的文件权限 (所有者、所属组、其他用户) 的补充,提供了更细粒度的权限控制。可以为特定用户或组设置特定的权限,而不受限于基本权限的设置。就像是在房间的主锁之外,又加了几把针对特定人员的锁。
  • getfacl 命令作用: 用于查看文件或目录的 ACL 权限。就像是查看门上都装了哪些锁。
  • getfacl 命令使用示例:

    • 查看文件 myfile.txt 的 ACL 权限:

      getfacl myfile.txt
      

      输出可能类似于:

      # file: myfile.txt
      # owner: user1
      # group: group1
      user::rw-
      group::r--
      other::r--
      
    • 如果设置了acl, 则会输出类似如下信息:

      # file: myfile.txt
      # owner: user1
      # group: group1
      user::rw-
      user:user2:r--
      group::r--
      mask::r--
      other::r--
      
  • setfacl 命令作用: 用于设置文件或目录的 ACL 权限。就像是给门加装新的锁。
  • setfacl 命令常用参数:

    • -m--modify: 修改文件或目录的 ACL 条目。这是最常用的选项。

      sudo setfacl -m u:alice:rw myfile.txt
      

      这条命令会给用户 alice 添加对 myfile.txt 文件的读写权限。

    • -x--remove: 删除文件或目录的 ACL 条目。

      sudo setfacl -x u:alice myfile.txt
      

      这条命令会删除用户 alicemyfile.txt 文件的 ACL 权限。

    • -b--remove-all: 删除文件或目录的所有 ACL 条目。

      sudo setfacl -b myfile.txt
      

      这条命令会删除 myfile.txt 文件的所有 ACL 条目,恢复到只有基本权限的状态。

    • -d--default: 设置目录的默认 ACL。默认 ACL 只对目录有效,表示以后在该目录下新创建的文件或子目录将继承这些 ACL。

      sudo setfacl -d -m u:bob:rx myfolder
      

      这条命令会设置 myfolder 目录的默认 ACL,使得以后在 myfolder 中创建的文件,用户 bob 都会有读和执行权限。

    • -R--recursive: 递归设置目录及其所有内容的 ACL。

      sudo setfacl -R -m u:datauser:r datadir
      

      这条命令会递归地给 datadir 目录及其所有子目录和文件设置 ACL,使得用户 datauser 对它们都有读权限。

  • setfacl 命令 ACL 条目格式:

    • u:username:permissions: 为指定用户设置权限。
    • g:groupname:permissions: 为指定组设置权限。
    • m:permissions: 设置有效权限掩码 (mask)。掩码用于限制授予的权限。例如,如果掩码是 r--,即使你给某个用户设置了 rw 权限,该用户实际上也只有读权限。
  • setfacl 命令使用示例:

    • 为用户 alice 设置文件 myfile.txt 的读写权限:

      sudo setfacl -m u:alice:rw myfile.txt
      
    • 为组 developers 设置文件 myfile.txt 的读权限:

      sudo setfacl -m g:developers:r myfile.txt
      
    • 删除用户 alice 对文件 myfile.txt 的 ACL 权限:

      sudo setfacl -x u:alice myfile.txt
      
    • 设置目录 myfolder 的默认 ACL,使得新创建的文件对用户 bob 拥有读写权限:

      sudo setfacl -d -m u:bob:rw myfolder
      
    • 递归设置目录 datadir 及其所有内容的 ACL,为用户 datauser 设置读权限:

      sudo setfacl -R -m u:datauser:r datadir
      
    • 为组developers设置目录/project的默认访问权限为rwx:

      sudo setfacl -d -m g:developers:rwx /project
      
  • 注意事项:

    • 操作 ACL 权限通常需要管理员权限,因此需要使用 sudo 命令。
    • 默认 ACL 只对目录有效,对目录中已经存在的文件或子目录无效。
    • ACL 权限会覆盖基本的文件权限。例如,如果你通过 ACL 给某个用户设置了对文件的读权限,即使该文件对其他用户的权限是 --- (没有任何权限),该用户仍然可以读取文件。
    • 可以使用 getfacl 命令来验证 ACL 设置是否生效。
    • 设置了acl的文件或目录,使用ls -l查看权限的时候,最后会多一个+号。

8、逻辑卷设置;pvcreate, vgcreate, lvcreate

  • 学习重点命令: pvcreate, vgcreate, lvcreate, pvs, vgs, lvs, lvextend, resize2fs, lvreduce
  • 逻辑卷管理 (LVM) 作用: LVM 是一种更高级的磁盘管理方式,它允许你将多个物理磁盘或分区组合成一个逻辑卷组 (VG),然后在 VG 中创建逻辑卷 (LV)。LV 可以像普通分区一样被格式化和挂载,但 LVM 的优势在于它可以动态调整 LV 的大小,创建快照等,而不需要重新分区。就像是把几块积木 (物理磁盘) 拼成一个大盒子 (卷组),然后你可以在盒子里自由分隔出不同大小的隔间 (逻辑卷)。
  • pvcreate 命令作用: 用于将物理磁盘分区或整个磁盘初始化为物理卷 (PV)。这是 LVM 的第一步,就像是把积木块标记为可以用来搭建盒子的积木。
  • pvcreate 命令使用示例:

    • /dev/sdb1/dev/sdc1 这两个分区初始化为 PV:
      sudo pvcreate /dev/sdb1 /dev/sdc1
      
    • 将一整块磁盘/dev/sdd初始化为物理卷:
      sudo pvcreate /dev/sdd
      
  • vgcreate 命令作用: 用于创建一个卷组 (VG),将多个 PV 组合在一起。就像是用标记好的积木搭建一个大盒子。
  • vgcreate 命令使用示例:

    • 使用 /dev/sdb1/dev/sdc1 这两个 PV 创建一个名为 myvg 的 VG:
      sudo vgcreate myvg /dev/sdb1 /dev/sdc1
      
    • 创建一个名为datavg, 使用物理卷/dev/sdd的卷组:
      sudo vgcreate datavg /dev/sdd
      
  • lvcreate 命令作用: 用于在 VG 中创建逻辑卷 (LV)。就像是在盒子里分隔出一个个隔间。
  • lvcreate 命令常用参数:

    • -L size: 指定 LV 的大小。可以使用 K, M, G, T 等单位。
    • -n name: 指定 LV 的名称。
    • -l num: 按PE数量进行分配, 通常pe大小为4MB。
  • lvcreate 命令使用示例:

    • myvg 这个 VG 中创建一个名为 mylv,大小为 5GB 的 LV:
      sudo lvcreate -L 5G -n mylv myvg
      
    • myvg 这个 VG 中创建一个名为 homelv,大小为 500MB 的 LV:
      sudo lvcreate -L 500M -n homelv myvg
      
    • 从卷组datavg创建大小为150个PE的逻辑卷datalv
      sudo lvcreate -l 150 -n datalv datavg
      
  • pvs, vgs, lvs 命令作用: 分别用于显示 PV、VG 和 LV 的信息。就像是查看积木、盒子和隔间的状态。
  • pvs, vgs, lvs 命令使用示例:

    • 显示所有 PV 的信息:
      pvs
      
    • 显示所有 VG 的信息:
      vgs
      
    • 显示所有 LV 的信息:
      lvs
      
  • lvextend 命令作用: 用于扩展 LV 的大小。就像是把隔间的空间扩大。
  • resize2fs 命令作用: 用于调整文件系统的大小以匹配 LV 的大小。注意:resize2fs 只适用于 ext2/3/4 文件系统。对于 XFS 文件系统,需要使用 xfs_growfs 命令。 就像是把隔间里的东西重新摆放,以适应更大的空间。
  • lvextendresize2fs 命令使用示例:

    • mylv 这个 LV 的大小增加 2GB:
      sudo lvextend -L +2G /dev/myvg/mylv
      
    • 然后,调整文件系统的大小以适应新的 LV 大小(假设 mylv 上使用的是 ext4 文件系统):
      sudo resize2fs /dev/myvg/mylv
      
    • 使用xfs文件系统将homelv增加500M并同步文件系统:
      sudo lvextend -L +500M /dev/myvg/homelv
      sudo xfs_growfs /dev/myvg/homelv
      
  • lvreduce 命令作用: 用于缩小 LV 的大小。注意:缩小 LV 之前,需要先卸载文件系统,并确保文件系统上有足够的空闲空间。缩小 LV 是一个有风险的操作,可能会导致数据丢失,务必小心! 就像是把隔间的空间缩小,需要先把里面的东西移走一部分。
  • lvreduce命令使用示例:

    1. 缩小前需要先卸载逻辑卷:
      sudo umount /dev/myvg/datalv
      
    2. 检查文件系统:
      sudo e2fsck -f /dev/myvg/datalv
      
    3. 调整文件系统大小:
      sudo resize2fs /dev/myvg/datalv 100M
      
    4. 缩小逻辑卷:
      sudo lvreduce -L 100M /dev/myvg/datalv
      
    5. 再次挂载文件系统:
      sudo mount /dev/myvg/datalv /mnt
      
  • 注意事项:

    • LVM 操作通常需要管理员权限,因此需要使用 sudo 命令。
    • 在创建 LV 之后,需要使用 mkfs 命令格式化文件系统,然后才能挂载使用。例如:
      sudo mkfs.ext4 /dev/myvg/mylv # 格式化为 ext4 文件系统
      sudo mount /dev/myvg/mylv /mnt # 挂载到 /mnt 目录
      
    • 扩展 LV 后,需要使用 resize2fs (ext 文件系统) 或 xfs_growfs (XFS 文件系统) 命令来同步文件系统的大小,否则文件系统无法使用新增加的空间。
    • 缩小 LV 之前,一定要确保文件系统有足够的空闲空间,并且已经卸载。建议先备份数据,以防万一。

9、磁盘与分区的设备文件名。

  • 磁盘设备文件名: 在 Linux 中,每个磁盘都被表示为一个设备文件,就像是给每个磁盘起了一个名字。这些设备文件通常位于 /dev 目录下。

    • SATA/SCSI 硬盘: 通常以 /dev/sd 开头,后面跟着一个字母表示磁盘的顺序 (a, b, c…)。例如:

      • /dev/sda:第一块 SATA 或 SCSI 硬盘。
      • /dev/sdb:第二块 SATA 或 SCSI 硬盘。
      • /dev/sdc:第三块 SATA 或 SCSI 硬盘。
    • NVMe 固态硬盘: 通常以 /dev/nvme 开头,后面跟着数字表示控制器序号,再跟着 n 和一个数字表示命名空间,最后是 p 和数字表示分区号。例如:

      • /dev/nvme0n1:第一块 NVMe 硬盘的第一个命名空间。
      • /dev/nvme1n1:第二块 NVMe 硬盘的第一个命名空间。
    • 较旧的 IDE 硬盘: 较旧的 IDE 硬盘通常以 /dev/hd 开头,例如 /dev/hda/dev/hdb 等。现在已经很少见了。
  • 分区设备文件名: 分区是在磁盘上划分出来的逻辑区域,每个分区也有一个设备文件名。分区设备文件名是在磁盘设备文件名后面加上数字表示分区号。

    • 主分区和扩展分区: 分区号从 1 开始。例如:

      • /dev/sda1/dev/sda 硬盘的第一个分区。
      • /dev/sdb2/dev/sdb 硬盘的第二个分区。
    • 逻辑分区: 分区号通常从 5 开始。例如:

      • /dev/sda5/dev/sda 硬盘的第一个逻辑分区。
      • /dev/sdb6/dev/sdb 硬盘的第二个逻辑分区。
    • NVMe 硬盘分区示例:

      • /dev/nvme0n1p1/dev/nvme0n1 硬盘的第一个分区。
      • /dev/nvme0n1p2/dev/nvme0n1 硬盘的第二个分区。
  • 如何查看磁盘与分区信息:

    • lsblk 命令: 以树状结构显示块设备(磁盘和分区)的信息,非常直观易用。

      lsblk
      

      输出示例:

      NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
      sda         8:0    0   20G  0 disk
      ├─sda1      8:1    0    2G  0 part /boot
      ├─sda2      8:2    0    5G  0 part
      │ └─myvg-mylv 253:0    0    3G  0 lvm  /mnt
      └─sda3      8:3    0   10G  0 part /home
      sdb         8:16   0   10G  0 disk
      └─sdb1      8:17   0   10G  0 part
        └─myvg-mylv 253:0    0    3G  0 lvm  /mnt
      nvme0n1     259:0    0   50G  0 disk
      └─nvme0n1p1 259:1    0   50G  0 part /data
      
    • fdisk -l 命令: 列出所有磁盘和分区的信息。需要 sudo 权限。

      sudo fdisk -l
      
    • parted -l 命令: 显示磁盘分区表的详细信息。需要 sudo 权限。

      sudo parted -l
      
    • df -h 命令: 显示文件系统的磁盘空间使用情况,可以间接看到已挂载的分区。

      df -h
      
  • 注意事项:

    • 设备文件名是操作系统识别和访问磁盘与分区的基础,就像是磁盘和分区的身份证号码。
    • 操作磁盘和分区(例如格式化、分区、挂载)时,必须正确指定设备文件名,否则可能导致数据丢失或其他严重问题,就像是填错身份证号码会导致很多麻烦。
    • 新型 NVMe 硬盘的命名方式与传统的 SATA/SCSI 硬盘有所不同,需要注意区分。

10、sudo授权规则

  • 学习重点文件: /etc/sudoers
  • sudo 命令作用: sudo 允许普通用户以另一个用户的身份(通常是 root 用户,即超级管理员)执行命令。就像是获得了一张临时的通行证,可以去做一些平时没有权限做的事情。
  • /etc/sudoers 文件作用: /etc/sudoers 文件定义了哪些用户或组可以执行哪些命令,以及是否需要输入密码。它是 sudo 命令的规则手册。强烈建议不要直接编辑此文件,而是使用 visudo 命令。
  • visudo 命令作用: visudo 是一个专门用来编辑 /etc/sudoers 文件的编辑器,它会在保存时进行语法检查,防止因为配置错误导致系统无法正常使用 sudo。就像是一个专业的安全编辑工具,可以避免你犯错。
  • sudoers 文件语法:

    • 基本格式: 用户名 主机名= (运行身份) 命令

      • 用户名:允许使用 sudo 的用户名,或者 %组名 表示用户组。
      • 主机名:允许在该主机上使用 sudo。通常使用 ALL 表示所有主机。
      • 运行身份:以哪个用户的身份运行命令。通常使用 ALL 表示任意用户,或 root 表示超级管理员。
      • 命令:允许执行的命令。可以使用绝对路径,例如 /usr/bin/ls,或使用 ALL 表示所有命令。
    • 免密码授权: 在命令部分添加 NOPASSWD: 前缀可以免除输入密码。
  • visudo 命令使用示例:

    sudo visudo
    

执行后,会打开 /etc/sudoers 文件(通常使用 vinano 编辑器)。

常见配置示例:

  • 允许用户 alice 在所有主机上以任意用户身份执行所有命令(非常危险,不推荐!):

    alice   ALL=(ALL)   ALL
    
  • 允许用户 bob 在当前主机上以 root 身份运行 /sbin/reboot 命令,无需输入密码:

    bob   localhost=(root)   NOPASSWD: /sbin/reboot
    
  • 允许属于 admin 组的用户在所有主机上以 root 身份运行 /usr/bin/apt update/usr/bin/apt upgrade 命令:

    %admin   ALL=(root)   /usr/bin/apt update, /usr/bin/apt upgrade
    
  • 允许用户tom在所有主机上以root身份执行/usr/bin/vim命令:

    tom ALL=(root) /usr/bin/vim
    
  • 注意事项:

    • /etc/sudoers 文件的配置非常重要,错误的配置可能导致安全风险,甚至导致系统无法使用 sudo
    • 强烈建议使用 visudo 命令来编辑 /etc/sudoers 文件,而不是直接用其他编辑器编辑。
    • 应该尽可能限制用户可以执行的 sudo 命令,避免授予过多的权限,就像是通行证上的权限要写清楚,不能什么地方都能去。
    • 免密码授权需要谨慎使用,特别是对于具有高危操作的命令

11、shell编程,批量解压缩

  • Shell 编程基础: Shell 既是一个命令解释器(解释你输入的命令),也是一种编程语言。你可以编写 Shell 脚本来自动化执行一系列命令,就像是写一个剧本,让计算机按照剧本的步骤去执行任务。
  • 批量解压缩的常用命令:

    • tar 命令: tar 命令是一个强大的归档工具,它可以将多个文件或目录打包成一个文件(归档),也可以将归档文件解包。tar 还可以调用压缩工具 (如 gzip, bzip2, xz) 来压缩或解压缩归档文件。

      • 解压 .tar 文件: 不使用任何压缩。

        tar -xf archive.tar
        

        x 表示解包 (extract),f 表示指定文件名 (file)。

      • 解压 .tar.gz.tgz 文件: 使用 gzip 压缩。

        tar -xzf archive.tar.gz
        

        z 表示使用 gzip 解压。

      • 解压 .tar.bz2 文件: 使用 bzip2 压缩。

        tar -xjvf archive.tar.bz2
        

        j 表示使用 bzip2 解压。v参数显示详细信息。

      • 解压 .tar.xz 文件: 使用 xz 压缩。

        tar -xJvf archive.tar.xz
        

        J 表示使用 xz 解压。

      • 参数解释:

        • -x:解包 (extract)。
        • -z:使用 gzip 解压。
        • -j:使用 bzip2 解压。
        • -J:使用 xz 解压。
        • -v:显示详细过程 (verbose)。如果不加-v,则不会显示解压的文件列表。
        • -f 文件名:指定要操作的归档文件名。
        • -C 目录:指定解压到的目录。如果不指定,则解压到当前目录。

          tar -xzf archive.tar.gz -C /tmp/extracted_files
          

          这条命令会将 archive.tar.gz 解压到 /tmp/extracted_files 目录。

      • 创建压缩包

        • 创建.tar格式的包:

          tar -cvf archive.tar file1 file2 dir1
          

          -c表示创建。

        • 创建.tar.gz格式的包:

          tar -czvf archive.tar.gz file1 file2 dir1
          
        • 创建.tar.bz2格式的包:

          tar -cjvf archive.tar.bz2 file1 file2 dir1
          
    • unzip 命令: unzip 命令用于解压 .zip 文件。

      • 解压 .zip 文件:

        unzip archive.zip
        
      • 参数解释:

        • -d 目录:指定解压到的目录。

          unzip archive.zip -d /tmp/extracted_files
          

          这条命令会将 archive.zip 解压到 /tmp/extracted_files 目录。

        • -l: 只查看压缩包中文件列表,不解压。

          unzip -l archive.zip
          
  • Shell 脚本实现批量解压缩:

    #!/bin/bash
    
    # 指定要解压的文件类型
    file_extensions=("tar.gz" "tar.bz2" "tar.xz" "zip")
    
    # 遍历当前目录下的所有文件
    for file in *; do
      # 获取文件名
      filename=$(basename "$file")
    
      # 遍历文件类型
      for ext in "${file_extensions[@]}"; do
        # 判断文件是否以指定扩展名结尾
        if [[ "$filename" == *."$ext" ]]; then
          echo "正在解压: $filename"
          case "$ext" in
            "tar.gz")
              tar -xzf "$file"
              ;;
            "tar.bz2")
              tar -xjvf "$file"
              ;;
            "tar.xz")
              tar -xJvf "$file"
              ;;
            "zip")
              unzip "$file"
              ;;
            *)
              echo "不支持的文件类型: $ext"
              ;;
          esac
        fi
      done
    done
    
    echo "批量解压完成。"
    
  • 脚本解释:

    1. #!/bin/bash:指定脚本解释器为 bash。这是 Shell 脚本的 shebang 行,告诉系统用哪个程序来执行这个脚本。
    2. file_extensions=("tar.gz" "tar.bz2" "tar.xz" "zip"):定义一个数组,包含要处理的压缩文件类型。数组是一种数据结构,可以存储多个值。
    3. for file in *; do:遍历当前目录下的所有文件。* 是通配符,表示所有文件。for 循环用于遍历一组值。
    4. filename=$(basename "$file"):获取当前文件名。basename 命令用于从路径中提取文件名。$() 用于执行命令并将结果赋值给变量。
    5. for ext in "${file_extensions[@]}"; do:遍历文件类型数组。${file_extensions[@]} 表示数组的所有元素。
    6. if [[ "$filename" == *."$ext" ]]; then:判断文件名是否以当前文件类型结尾。[[ ]] 是条件测试语句,== 是字符串比较运算符,* 是通配符。
    7. case "$ext" in ... esac:根据文件类型执行相应的解压命令。case 语句用于多分支判断。
      • "tar.gz") tar -xzf "$file" ;;:如果文件类型是 tar.gz,则执行 tar -xzf "$file" 命令。
      • "tar.bz2") tar -xjvf "$file" ;;:如果文件类型是 tar.bz2,则执行 tar -xjvf "$file" 命令。
      • "tar.xz") tar -xJvf "$file" ;;:如果文件类型是 tar.xz,则执行 tar -xJvf "$file" 命令。
      • "zip") unzip "$file" ;;:如果文件类型是 zip,则执行 unzip "$file" 命令。
      • *) echo "不支持的文件类型: $ext" ;;:如果文件类型不在列表中,则输出错误信息。
    8. echo "批量解压完成。":输出完成信息。
  • 如何运行脚本:

    1. 将脚本保存为 .sh 文件,例如 unpack_all.sh
    2. 赋予脚本执行权限:
      chmod +x unpack_all.sh
      
    3. 在包含要解压文件的目录下运行脚本:
      ./unpack_all.sh
      
  • 注意事项:

    • Shell 脚本需要以 #!/bin/bash 开头指定解释器。
    • 可以使用 for 循环遍历文件。
    • 可以使用条件语句 ifcase 判断文件类型。
    • 要赋予脚本执行权限才能运行 (使用 chmod +x 命令)。
    • 批量解压缩时,需要考虑目标目录是否存在同名文件,避免覆盖。可以在脚本中添加相应的判断和处理逻辑,例如先将文件解压到一个临时目录,然后再移动到目标目录。
    • 脚本中没有对错误情况做全面的错误处理, 比如文件不存在,不是一个有效的压缩包等,这些可以根据实际需求进行完善。

评论