第02周作业

第02周作业

  1. Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。

    • 答:常见的文件管理类命令有cp、mv、rm、install、mktemp等,其中:
    • cp:用于复制文件或目录,有单源复制、多源复制两种工作方式:
      • 单源复制
        • 命令语法:
          [root@localhost ~]# cp [OPTION]... [-T] SOURCE DEST
        • 工作机制:
          1. 如果DEST不存在,则先创建此文件并复制SOURCE的内容到DEST中。
          2. 如果DEST存在:
            1. DEST是非目录文件,则覆盖DEST(非管理员状态下默认是不提示是否覆盖的)
            2. DEST是目录文件,则先在DEST目录下创建一个与SOURCE同名的文件,并复制其内容。如果DEST目录下已有与SOURCE同名的文件,则覆盖(非管理员状态下默认不提示是否覆盖)
          3. 默认状态下,如果SOURCE为目录,则略过
        • 使用示例:
          ## 示例 1:目标为文件,且不存在,直接复制
          [root@localhost ~]# cat /etc/centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          [root@localhost ~]# ls
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/centos-release ./centos-release
          [root@localhost ~]# 
          [root@localhost ~]# ls
          centos-release
          [root@localhost ~]# cat centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          ## 示例 2:目录为文件,且存在,覆盖
          [root@localhost ~]# cat /etc/hostname
          localhost
          [root@localhost ~]# ls
          centos-release
          [root@localhost ~]# cat centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/hostname ./centos-release
          cp: overwrite ‘./centos-release’? y
          [root@localhost ~]# 
          [root@localhost ~]# ls
          centos-release
          [root@localhost ~]# cat centos-release
          localhost
          [root@localhost ~]# 
          ## 示例 3:目标为目录,则将源文件复制到目标目录下(如存在则覆盖)
          [root@localhost ~]# mkdir test
          [root@localhost ~]# ls
          test
          [root@localhost ~]# cat /etc/centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/centos-release ./test
          [root@localhost ~]# 
          [root@localhost ~]# ls
          test
          [root@localhost ~]# ls ./test
          centos-release
          [root@localhost ~]# cat ./test/centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          ## 示例 4:如果源文件为目录,则默认情况下不复制
          [root@localhost ~]# ll -d /etc/yum
          drwxr-xr-x. 6 root root 100 Dec 19 18:40 /etc/yum
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/yum ./
          cp: omitting directory ‘/etc/yum’
          [root@localhost ~]# 
          [root@localhost ~]# ls
          [root@localhost ~]# 
      • 多源复制
        • 命令语法:
          [root@localhost ~]# cp [OPTION]... SOURCE... DEST_DIRECTORY
          [root@localhost ~]# cp [OPTION]... -t DEST_DIRECTORY SOURCE...
        • 工作机制:
          1. 如果DEST_DIRECTORY不存在,则报错
          2. 如果DEST_DIRECTORY存在且不是目录,则报错
          3. 如果DEST_DIRECTORY存在且为目录,则分别复制每个SOURCE至DEST_DIRECTORY中,并保持原名
        • 使用示例:
          ## 示例 1:DEST_DIRECTORY不存在,报错
          [root@localhost ~]# ls
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/hostname /etc/centos-release ./test
          cp: target ‘./test’ is not a directory
          [root@localhost ~]# 
          ## 示例 2:DEST_DIRECTORY存在,但不是目录,报错
          [root@localhost ~]# ll
          total 0
          -rw-r--r--. 1 root root 0 Jun  3 16:06 test
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/centos-release /etc/hostname ./test
          cp: target ‘./test’ is not a directory
          [root@localhost ~]# 
          ## 示例 3:DEST_DIRECTORY存在,但是目录,则将源文件分别复制到目标目录,并保持原文件名
          [root@localhost ~]# cat /etc/centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# 
          [root@localhost ~]# cat /etc/hostname
          localhost
          [root@localhost ~]# 
          [root@localhost ~]# ll
          total 0
          drwxr-xr-x. 2 root root 6 Jun  3 16:09 test
          [root@localhost ~]# 
          [root@localhost ~]# ls ./test
          [root@localhost ~]# 
          [root@localhost ~]# cp /etc/centos-release /etc/hostname ./test
          [root@localhost ~]# 
          [root@localhost ~]# ls ./test
          centos-release  hostname
          [root@localhost ~]# 
          [root@localhost ~]# cat ./test/centos-release
          CentOS Linux release 7.6.1810 (Core) 
          [root@localhost ~]# cat ./test/hostname
          localhost
          [root@localhost ~]# 
    • mv:移动(重命名)文件或目录,有单源移动和多源移动两种工作方式:

      • 单源移动:

        • 命令语法:
          [root@localhost ~]# mv [OPTION]... [-T] SOURCE DEST
        • 工作机制:

          1. 如果DEST不存在,则将源文件(目录)移动(重命名)为目标文件(目录)
            ## 示例 1:源文件为普通文件
            [root@localhost ~]# ls
            hostname
            [root@localhost ~]# 
            [root@localhost ~]# mv hostname hostname1
            [root@localhost ~]# 
            [root@localhost ~]# ls
            hostname1
            [root@localhost ~]# 
            ## 示例 2:源文件为目录
            [root@localhost ~]# ll
            total 0
            drwxr-xr-x. 2 root root 28 Jun  3 16:28 test
            [root@localhost ~]# 
            [root@localhost ~]# mv test test1
            [root@localhost ~]# 
            [root@localhost ~]# ll
            total 0
            drwxr-xr-x. 2 root root 22 Jun  3 16:26 test1
            [root@localhost ~]# 
          2. 如果DEST存在:

            1. 如果DEST为目录,则将源文件(目录)移动到目标目录下并保持原名不变

              示例 1:源文件为普通文件
              [root@localhost ~]# ll
              total 4
              -rw-r--r--. 1 root root 11 Jun  3 16:46 hostname
              drwxr-xr-x. 2 root root 22 Jun  3 16:26 test
              [root@localhost ~]# ls test
              [root@localhost ~]# 
              [root@localhost ~]# mv hostname test
              [root@localhost ~]# 
              [root@localhost ~]# ll
              total 0
              drwxr-xr-x. 2 root root 22 Jun  3 16:48 test
              [root@localhost ~]# ll test
              total 4
              -rw-r--r--. 1 root root 11 Jun  3 16:46 hostname
              [root@localhost ~]# 
              ## 示例 2:源文件为目录文件
              [root@localhost ~]# tree
              .
              ├── test1
              │   └── hostname
              └── test2
                  └── centos-release
              
              2 directories, 2 files
              [root@localhost ~]# 
              [root@localhost ~]# mv test2 test1
              [root@localhost ~]# 
              [root@localhost ~]# tree
              .
              └── test1
                  ├── hostname
                  └── test2
                      └── centos-release
              
              2 directories, 2 files
              [root@localhost ~]# 
            2. 如果DEST为普通文件:

              1. 如果源文件为普通文件,则将源文件移动并覆盖目标文件
                ## 示例:
                [root@localhost ~]# ll
                total 8
                -rw-r--r--. 1 root root 38 Jun  3 17:12 centos-release
                -rw-r--r--. 1 root root 11 Jun  3 17:12 hostname
                [root@localhost ~]# cat centos-release
                CentOS Linux release 7.6.1810 (Core) 
                [root@localhost ~]# cat hostname
                localhost
                [root@localhost ~]# 
                [root@localhost ~]# mv hostname centos-release
                mv: overwrite ‘centos-release’? y
                [root@localhost ~]# 
                [root@localhost ~]# cat centos-release
                localhost
                [root@localhost ~]# 
              2. 如果源文件为目录文件,则报错

                ## 示例:
                [root@localhost ~]# tree
                .
                ├── centos-release
                └── test
                    └── hostname
                
                1 directory, 2 files
                [root@localhost ~]# 
                [root@localhost ~]# mv test centos-release
                mv: overwrite ‘centos-release’? y
                mv: cannot overwrite non-directory ‘centos-release’ with directory ‘test’
                [root@localhost ~]# 
      • 多源移动:

        • 命令格式:
          [root@localhost ~]# mv [OPTION]... SOURCE... DIRECTORY
          [root@localhost ~]# mv [OPTION]... -t DIRECTORY SOURCE...
        • 工作机制:

          1. 如果DIRECTORY不存在,则报错

            ## 示例
            [root@localhost ~]# tree
            .
            ├── centos-release
            ├── test
            │   ├── centos-release
            │   ├── hostname
            │   └── test2
            │       └── hosts
            ├── test1
            │   └── hostname
            └── test2
                └── hosts
            
            4 directories, 6 files
            [root@localhost ~]# 
            [root@localhost ~]# mv centos-release test test3
            mv: target ‘test3’ is not a directory
            [root@localhost ~]# 
          2. 如果DIRECTORY存在,但不是目录,则报错

            ## 示例
            [root@localhost ~]# tree
            .
            ├── centos-release
            ├── test
            │   ├── centos-release
            │   ├── hostname
            │   └── test2
            │       └── hosts
            ├── test1
            │   └── hostname
            └── test2
                └── hosts
            
            4 directories, 6 files
            [root@localhost ~]# 
            [root@localhost ~]# mv test1 test2 centos-release 
            mv: target ‘centos-release’ is not a directory
            [root@localhost ~]# 
          3. 如果DIRECTORY存在,且为目录,则将源文件(目录)分别移动到DIRECTORY下

            ## 示例
            [root@localhost ~]# tree
            .
            ├── centos-release
            ├── test
            │   └── hostname
            ├── test1
            │   └── hostname
            └── test2
                └── hosts
            
            4 directories, 6 files
            [root@localhost ~]# 
            [root@localhost ~]# mv centos-release test1 test2 test
            [root@localhost ~]# 
            [root@localhost ~]# tree
            .
            └── test
                ├── centos-release
                ├── hostname
                ├── test1
                │   └── hostname
                └── test2
                    └── hosts
            
            3 directories, 4 files
            [root@localhost ~]# 
    • rm:删除文件(目录):

      • 命令格式:
        [root@localhost ~]# rm [OPTION]... FILE...
      • 常见用法:

        1. 删除文件:-i选项用于交互式删除,即针对每一个要删除的文件提示是否确认删除(默认情况下非管理员用户删除文件时无确认提示);-f选项用于强制删除,即删除文件时不再显示删除确认提示(默认情况下管理员用户删除文件时每个要删除的文件都有会确认提示),默认情况下,rm命令不会删除目录及其内的文件及子目录

          ## 示例 1:管理员用户删除文件(默认情况)
          [root@localhost ~]# tree
          .
          ├── centos-release
          ├── hostname
          ├── hosts
          └── test
              └── fstab
          
          1 directory, 4 files
          [root@localhost ~]# 
          [root@localhost ~]# rm *
          rm: remove regular file ‘centos-release’? y
          rm: remove regular file ‘hostname’? y
          rm: remove regular file ‘hosts’? y
          rm: cannot remove ‘test’: Is a directory
          [root@localhost ~]# 
          [root@localhost ~]# tree
          .
          └── test
              └── fstab
          
          1 directory, 1 file
          [root@localhost ~]# 
          ## 示例 2:管理员用户删除文件(使用-f选项)
          [root@localhost ~]# tree
          .
          ├── centos-release
          ├── hostname
          ├── hosts
          └── test
              └── fstab
          
          1 directory, 4 files
          [root@localhost ~]# 
          [root@localhost ~]# rm -f *
          rm: cannot remove ‘test’: Is a directory
          [root@localhost ~]# 
          [root@localhost ~]# tree
          .
          └── test
              └── fstab
          
          1 directory, 1 file
          [root@localhost ~]# 
          ## 示例 3:非管理员用户删除文件(默认情况)
          [myusr@localhost ~]$ tree
          .
          ├── centos-release
          ├── hostname
          ├── hosts
          └── test
              └── fstab
          
          1 directory, 4 files
          [myusr@localhost ~]$ 
          [myusr@localhost ~]$ rm *
          rm: cannot remove ‘test’: Is a directory
          [myusr@localhost ~]$ 
          [myusr@localhost ~]$ tree
          .
          └── test
              └── fstab
          
          1 directory, 1 file
          [myusr@localhost ~]$
          示例 4:非管理员用户删除文件(使用-i选项)
          [myusr@localhost ~]$ tree
          .
          ├── centos-release
          ├── hostname
          ├── hosts
          └── test
              └── fstab
          
          1 directory, 4 files
          [myusr@localhost ~]$ 
          [myusr@localhost ~]$ rm -i *
          rm: remove regular file ‘centos-release’? y
          rm: remove regular file ‘hostname’? y
          rm: remove regular file ‘hosts’? y
          rm: cannot remove ‘test’: Is a directory
          [myusr@localhost ~]$ 
          [myusr@localhost ~]$ tree
          .
          └── test
              └── fstab
          
          1 directory, 1 file
          [myusr@localhost ~]$ 
        2. 删除目录:使用-r选项,递归删除目录及其下的所有文件及子目录,-i、-f的用法及作用同删除文件
          
          ## 示例:
          [root@localhost ~]# tree
          .
          └── test
          ├── centos-release
          ├── hostname
          ├── test1
          │   └── hostname
          └── test2
              └── hosts

        3 directories, 4 files
        [root@localhost ~]#
        [root@localhost ~]# rm -rf test
        [root@localhost ~]#
        [root@localhost ~]# ls
        [root@localhost ~]#

    • install:复制文件并设置其属性,或创建新的目录
      • 单源复制文件:
        • 命令格式:
          [root@localhost ~]# install [OPTION]... [-T] SOURCE DEST
        • 用法示例:
          ## 示例 1:默认状态下,所复制的目标文件权限为:rwxr-xr-x
          [root@localhost ~]# ll /usr/bin/lsfile 
          ls: cannot access /usr/bin/lsfile: No such file or directory
          [root@localhost ~]# ll
          total 4
          -r-xr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          [root@localhost ~]# 
          [root@localhost ~]# install lsfile /bin
          [root@localhost ~]# 
          [root@localhost ~]# ll /usr/bin/lsfile
          -rwxr-xr-x. 1 root root 17 Jun  4 14:49 /usr/bin/lsfile
          [root@localhost ~]# 
          ## 示例 2:可使用-m,--mode=MODE选项设置目标文件的权限
          [root@localhost ~]# ll /usr/bin/lsfile 
          ls: cannot access /usr/bin/lsfile: No such file or directory
          [root@localhost ~]# ll
          total 4
          -rwxr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          [root@localhost ~]# 
          [root@localhost ~]# install -m 555 lsfile /bin
          [root@localhost ~]# 
          [root@localhost ~]# ll /usr/bin/lsfile
          -r-xr-xr-x. 1 root root 17 Jun  4 14:49 /usr/bin/lsfile
          [root@localhost ~]# 
          ## 示例 3:可使用-o,--owner=OWNER选项设置目标文件的属主,可使用-g,--group=GROUP选项设置目标文件的属组,这两个选项仅管理员可用
          [root@localhost ~]# ll /usr/bin/lsfile 
          ls: cannot access /usr/bin/lsfile: No such file or directory
          [root@localhost ~]# ll
          total 4
          -r-xr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          [root@localhost ~]# 
          [root@localhost ~]# install -o myusr -g myusr lsfile /bin
          [root@localhost ~]# 
          [root@localhost ~]# ll /usr/bin/lsfile
          -r-xr-xr-x. 1 myusr myusr 17 Jun  4 14:49 /usr/bin/lsfile
          [root@localhost ~]# 
          示例 4:可使用-D选项自动逐级创建不存在的目标文件所属目录(此种情况下必须给出目标文件名,而不能只给出目标路径)
          [root@localhost ~]# ll -d /usr/bin/mycmd 
          ls: cannot access /usr/bin/mycmd: No such file or directory
          [root@localhost ~]# ll
          total 4
          -r-xr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          [root@localhost ~]# 
          [root@localhost ~]# install -D lsfile /usr/bin/mycmd/lsfile
          [root@localhost ~]# 
          [root@localhost ~]# ll -d /usr/bin/mycmd
          drwxr-xr-x. 2 root root 20 Jun  4 15:10 /usr/bin/mycmd
          [root@localhost ~]# ll /usr/bin/mycmd   
          total 4
          -r-xr-xr-x. 1 root root 17 Jun  4 15:10 lsfile
          [root@localhost ~]# 
      • 多源复制文件:
        • 命令格式:
          ## 格式 1:
          [root@localhost ~]# install [OPTION]... SOURCE... DIRECTORY
          ## 格式 2:
          [root@localhost ~]# install [OPTION]... -t DIRECTORY SOURCE...
        • 用法示例:
          ### 示例 1:格式1的示例,可选项与单源复制类似,不重复演示
          [root@localhost ~]# ll /usr/bin/lsfile /usr/bin/lshome
          ls: cannot access /usr/bin/lsfile: No such file or directory
          ls: cannot access /usr/bin/lshome: No such file or directory
          [root@localhost ~]# ll
          total 8
          -r-xr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          -r-xr-xr-x. 1 root root 23 Jun  4 15:14 lshome
          [root@localhost ~]# 
          [root@localhost ~]# install lsfile lshome /usr/bin
          [root@localhost ~]# 
          [root@localhost ~]# ll /usr/bin/lsfile /usr/bin/lshome
          -rwxr-xr-x. 1 root root 17 Jun  4 15:20 /usr/bin/lsfile
          -rwxr-xr-x. 1 root root 23 Jun  4 15:20 /usr/bin/lshome
          [root@localhost ~]# 
          ### 示例 2:格式2的示例,可选项与单源复制类似,不重复演示
          [root@localhost ~]# ll /usr/bin/lsfile /usr/bin/lshome
          ls: cannot access /usr/bin/lsfile: No such file or directory
          ls: cannot access /usr/bin/lshome: No such file or directory
          [root@localhost ~]# ll
          total 8
          -r-xr-xr-x. 1 root root 17 Jun  4 14:45 lsfile
          -r-xr-xr-x. 1 root root 23 Jun  4 15:14 lshome
          [root@localhost ~]# 
          [root@localhost ~]# install -t /usr/bin lsfile lshome
          [root@localhost ~]# 
          [root@localhost ~]# ll /usr/bin/lsfile /usr/bin/lshome
          -rwxr-xr-x. 1 root root 17 Jun  4 15:20 /usr/bin/lsfile
          -rwxr-xr-x. 1 root root 23 Jun  4 15:20 /usr/bin/lshome
          [root@localhost ~]# 
      • 创建新的目录:
        • 命令格式:
          [root@localhost ~]# install [OPTION]... -d DIRECTORY...
        • 用法示例:
          [root@localhost ~]# ll -d /usr/bin/mycmd 
          ls: cannot access /usr/bin/mycmd: No such file or directory
          [root@localhost ~]# 
          [root@localhost ~]# install -d /usr/bin/mycmd
          [root@localhost ~]# 
          [root@localhost ~]# ll -d /usr/bin/mycmd
          drwxr-xr-x. 2 root root 6 Jun  4 15:25 /usr/bin/mycmd
          [root@localhost ~]# 
    • mktemp:创建临时文件或临时目录

      • 命令格式:
        [root@localhost ~]# mktemp [OPTION]... [TEMPLATE]
      • 用法示例:

        ## 示例 1:使用给定的名称模板(以三个以上连续‘X’做为结尾的字符串)创建临时文件,名称模板最后的连续‘X’将被替换为同等数量的随机字符,创建的临时文件权限为u+rw
        [root@localhost ~]# ll
        total 0
        [root@localhost ~]# 
        [root@localhost ~]# mktemp tempfile.XXXX
        tempfile.EDNF
        [root@localhost ~]# 
        [root@localhost ~]# ll
        total 0
        -rw-------. 1 root root 0 Jun  4 15:40 tempfile.EDNF
        [root@localhost ~]# 
        ## 示例 2:不给定名称模板,且在Shell会话中已经定义了$TMPDIR的情况下,使用tmp.XXXXXXXXXX做为名称模板,在$TMPDIR目录下创建临时文件
        [root@localhost ~]# ll
        total 0
        drwxr-xr-x. 2 root root 70 Jun  4 15:56 test
        [root@localhost ~]# echo $TMPDIR
        /root/test
        [root@localhost ~]# 
        [root@localhost ~]# mktemp
        /root/test/tmp.XgL7SnUDSo
        [root@localhost ~]# 
        [root@localhost ~]# ll test
        total 0
        -rw-------. 1 root root 0 Jun  4 15:56 tmp.XgL7SnUDSo
        [root@localhost ~]# 
        ## 示例 3:不给定名称模板,且在Shell会话中未定义$TMPDIR的情况下,使用tmp.XXXXXXXXXX做为名称模板,在/tmp目录下创建临时文件
        [root@localhost ~]# echo $TMPDIR
        
        [root@localhost ~]# ll /tmp
        total 0
        drwx------. 3 root root 17 Jun  4 14:30 systemd-private-7a49d165f7244d33892b2b1898ae2f9b-chronyd.service-h9OJJM
        drwx------. 2 root root  6 Jun  4 14:30 vmware-root_5835-1950100230
        [root@localhost ~]# 
        [root@localhost ~]# mktemp
        /tmp/tmp.K8ix4KTqRO
        [root@localhost ~]# 
        [root@localhost ~]# [root@MageStudy3 ~]# ll /tmp
        total 0
        drwx------. 3 root root 17 Jun  4 14:30 systemd-private-7a49d165f7244d33892b2b1898ae2f9b-chronyd.service-h9OJJM
        -rw-------. 1 root root  0 Jun  4 16:09 tmp.K8ix4KTqRO
        drwx------. 2 root root  6 Jun  4 14:30 vmware-root_5835-1950100230
        [root@localhost ~]# 
        ## 示例 4:使用-u,--dry-run选项,只返回临时文件的路径和文件名,而不真正创建临时文件(不安全,此操作不会验证文件是否可以创建成功,所以返回的文件名或路径不一定可用),通常用于功能测试
        [root@localhost ~]# 
        [root@localhost ~]# ll
        total 0
        [root@localhost ~]# 
        [root@localhost ~]# mktemp -u temp.XXXX
        temp.dy5z
        [root@localhost ~]# 
        [root@localhost ~]# ll
        total 0
        [root@localhost ~]# 
        ## 示例 5:使用-d,--directory选项创建临时目录,此时名称模板及-u选项的相关使用与创建临时文件类似
        [root@localhost ~]# ll
        total 0
        [root@localhost ~]# 
        [root@localhost ~]# mktemp -d temp.XXXX
        temp.xDkV
        [root@localhost ~]# 
        [root@localhost ~]# ll
        total 0
        drwx------. 2 root root 6 Jun  4 16:26 temp.xDkV
        [root@localhost ~]# 
        ## 示例 6:在脚本中,可将mktemp的返回值保存起来,以便使用
        
        #!/bin/bash
        TMPFILE=$(mktemp)
        echo TMPFILE
        ...
        unset TMPFILE
  2. 使用命令行展开功能,创建/tmp/a1, /tmp/a2, /tmp/a1/a, /tmp/a1/b,在/tmp目录下创建目录:x_y, x_z, q_y, q_z

    • 答:
      
      [root@localhost ~]# mkdir -p /tmp/{a{1/{a,b},2},{x,q}_{y,z}}
      [root@localhost ~]# 
      [root@localhost ~]# tree /tmp
      /tmp
      ├── a1
      │   ├── a
      │   └── b
      ├── a2
      ├── q_y
      ├── q_z
      ├── systemd-private-7a49d165f7244d33892b2b1898ae2f9b-chronyd.service-h9OJJM
      │   └── tmp
      ├── vmware-root_5835-1950100230
      ├── x_y
      └── x_z

    11 directories, 0 files
    [root@localhost ~]#

  3. 文件的元数据信息有哪些,分别表示什么含义,如何查看?如何修改文件的时间戳信息。

    • 答:
    • 可使用stat命令查看文件的元数据信息,以/etc/fstab文件为例,输出信息如下:

      [root@localhost ~]# stat /etc/fstab
        File: ‘/etc/fstab’
        Size: 465             Blocks: 8          IO Block: 4096   regular file
      Device: fd00h/64768d    Inode: 16777282    Links: 1
      Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
      Context: system_u:object_r:etc_t:s0
      Access: 2019-06-04 16:50:48.593186614 +0800
      Modify: 2018-12-19 18:40:07.324107621 +0800
      Change: 2018-12-19 18:43:14.540024710 +0800
       Birth: -

      具体信息含义:

      • File:文件名
      • Size:文件大小
      • Blocks:占用磁盘块数
      • IO Block:磁盘块大小
      • regular file:文件类型,此处为普通文件,还有可能为目录文件、块设备文件、字符设备文件、链接文件、管道文件、套接字文件等。
      • Device:文件所在的设备
      • Inode:Inode节点号
      • Links:链接次数
      • Access(第一个):文件权限标志
      • Uid:UID号/属主
      • Gid:GID号/属组
      • Context:SELinux标志
      • Access(第二个):最近一次访问时间
      • Modify:文件的内容修改时间
      • Change:文件的元数据改变时间
      • Birth:文件的创建时间,因常用文件系统并不保存文件的创建时间,所以此处通常为空
    • 可以使用touch命令修改文件的Access时间和Modify时间信息,不能手动信息文件的Change时间信息,默认状态下同时修改文件的Access和Modify时间戳到系统的当前时间,也可单独指定修改哪一个时间,也可以手动指定要修改到的时间,具体用法为:
      [root@localhost ~]# touch [OPTION...] FILE...
      • 常用选项:
        • -a:只修改文件的Access时间
        • -m:只修改文件的Modify时间
        • -t STAMP:手动指定时间戳而不使用系统的当前时间,时间戳的格式为:[[CC]YY]MMDDhhmm[.ss]
  4. 在/tmp目录下创建以tfile开头,后跟当前日期和时间的文件,文件名形如:tfile-2016-05-27-09-32-22。
    • 答:
      [root@localhost ~]# touch /tmp/tfile-$(date +%Y-%m-%d-%H-%M-%S)
      [root@localhost ~]# 
      [root@localhost ~]# ll /tmp
      total 0
      drwx------. 3 root root 17 Jun  4 14:30 systemd-private-7a49d165f7244d33892b2b1898ae2f9b-chronyd.service-h9OJJM
      -rw-r--r--. 1 root root  0 Jun  4 17:50 tfile-2019-06-04-17-50-46
      drwx------. 2 root root  6 Jun  3 14:57 vmware-root_5934-1002483909
      [root@localhost ~]# 
  5. 复制/etc目录下所有以p开头,以非数字结尾的文件或目录到/tmp/mytest1目录中。
    • 答:
      [root@localhost ~]# mkdir /tmp/mytest1
      [root@localhost ~]# 
      [root@localhost ~]# cp -r /etc/p*[^0-9] /tmp/mytest1 
      [root@localhost ~]# 
  6. 创建用户tom,指定UID为5001,指定家目录为/tmp/tom, 指定shell为/bin/zsh, 指定基本组为tom,附加组为jack
    • 答:
      [root@localhost ~]# groupadd tom
      [root@localhost ~]# groupadd jack
      [root@localhost ~]# useradd -u 5001 -g tom -G jack -d /tmp/tom -s /bin/zsh tom
      [root@localhost ~]# 
  7. 常用的用户以及文件管理命令有哪些,并演示命令以及用法。

    • 答:常用的用户管理命令有useradd、usermod、userdel、passwd、chage、id、su、pwck、grpck、whoami、finger、chfn、chsh等,具体用法如下:
    • useradd:创建一个新用户或更新默认新用户信息
      • 用法一:创建一个新用户:
        ## 命令格式
        [root@localhost ~]# useradd [options] LOGIN
        • 常用选项:
          • -u,--uid UID:在创建用户时指定用户的UID
          • -g,--gid GROUP:指定用户主组的组名或GID,此组需已经存在
          • -G,--groups GROUP1[,GROUP2,...[,GROUPN]]]:指定用户所属的附加组,多个组之间用逗号分隔,所有的组需事先存在
          • -c, --comment COMMENT:指定用户的注释信息,常用于保存用户的全名
          • -d,--home-dir HOME_DIR:指定用户的家目录,如果不指定,用户的家目录则为BASE_DIR/LOGIN模式,此目录可以不存在,如果不存在则会自动创建(通过复制/etc/skel目录并重命名来实现,而非创建一个空目录),如果此目录已存在,则不会为用户复制环境配置文件,所在此目标目录最好不要存在
          • -s,--shell SHELL:指定用户的默认Shell,可用的所有Shell列表存储于/etc/shells文件,如果指定的Shell不在此列表中,创建命令可以正常执行,但是创建的用户将不能正常登录
          • -r,--system:创建系统用户
          • -M,--no-create-home:不创建用户的家目录
          • -f,--inactive INACTIVE:指定用户密码被彻底禁用之前的宽限期天数,0表示立即禁用,-1表示禁用此功能
            ## 示例:
            [root@localhost ~]# useradd -u 5001 -g tom -G jack -d /home/tom -s /bin/bash tom
      • 用法二:显示用户创建时的默认配置属性,只显示很少的一部分配置属性,更多的配置属性见/etc/login.defs配置文件
        [root@localhost ~]# useradd -D
        GROUP=100
        HOME=/home
        INACTIVE=-1
        EXPIRE=
        SHELL=/bin/bash
        SKEL=/etc/skel
        CREATE_MAIL_SPOOL=yes
        [root@localhost ~]# 
        或
        [root@localhost ~]# useradd --defaults
        GROUP=100
        HOME=/home
        INACTIVE=-1
        EXPIRE=
        SHELL=/bin/bash
        SKEL=/etc/skel
        CREATE_MAIL_SPOOL=yes
        [root@localhost ~]# 
        • 字段含义:
          • GROUP:同时创建一个与用户同名的私有组
          • HOME:创建用户时自动创建的用户家目录的起始目录,也就是创建的家目录位于此路径下
          • INACTIVE:创建的用户的密码宽限期天数,-1表示禁用此功能
          • EXPIRE:用户账户的过期期限,为空表示永不过期,表现在/etc/shadow文件中为99999天
          • SHELL:新用户的默认登录Shell
          • SKEL:新用户家目录的骨架信息的来源位置
          • CREATE_MAIL_SPOOL:是否为用户创建邮件缓冲队列
      • 用法三:修改用户创建时的默认配置属性,只可以修改常用的一部分配置属性,更多配置属性见/etc/login.defs配置文件,修改的结果保存于/etc/default/useradd文件中,所以此命令用法所能实现的功能也可以直接修改此文件实现
        [root@localhost ~]# useradd -D [options]
        • 常用选项:
          • -b,--base-dir BASE_DIR:修改默认的新建用户家目录的前缀
          • -e,--expiredate EXPIRE_DATE:修改默认的新建用户的过期时间
          • -f,--inactive INACTIVE:修改默认的新建用户的密码过期宽限时间
          • -g,--gid GROUP:修改默认的新建用户的用户组(只在创建用户时使用了-N/--no-user-group选项或/etc/login.defs文件中USERGROUPS_ENAB选项设定为no时生效),指定的用户组必须存在
          • -s,--shell SHELL:修改默认的新建用户的默认登录Shell
        • 用法示例:
          ## 示例
          [root@localhost ~]# useradd -D -b /tmp/home -s /bin/bash
    • usermod:修改一个用户账户的属性
      [root@localhost ~]# usermod [options] LOGIN
      • 常用选项:
        • -u,--uid UID:修改用户的UID,在不使用-o选项的情况下,新的UID必须为唯一的。用户的邮箱及家目录中所有由此用户持有的文件的用户ID属性会被自动修改,家目录以外的文件需要手动修改。如果用户家目录的属主不是正在修改的用户,其内的文件不会被自动修改其用户ID属性
        • -g,--gid GROUP:修改用户所属的基本组,用户家目录中所有属于用户前一基本组的文件会被自动修改为属于用户的新基本组,用户家目录以外的文件需要手动修改。如果用户家目录的属主不是正在修改的用户,其内的文件不会被自动修改其属组属性
        • -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户的附加组,默认情况下,新指定的附加组列表会覆盖原有的附加组列表,如果要添加新的附加组而保留原附加组列表,则需与-a/--append选项结合使用。
        • -a,--append:与-G/--groups一同使用,用于为用户追加附加组
        • -c,--comment COMMENT:修改用户的注释信息
        • -d,--home HOME_DIR:修改用户的家目录,默认情况下新的家目录如果不存在,则只使用/etc/skel初始化一个新的家目录,用户原有家目录中的文件不会被转移。如果要转移原有家目录中的文件,则需与-m/--move-home选项结合使用
        • -m,--move-home:与-d/--home选项一同使用,用于将原家目录移动(更名)为新的家目录
        • -l,--login NEW_LOGIN:修改用户名
        • -s,--shell SHELL:修改用户的默认Shell
        • -L,--lock:锁定用户密码,即在用户原来的密码字符串前添加“!”
        • -U,--unlock:解锁用户密码,即移除被锁定用户的密码字符串前的“!”
      • 用法示例:
        ## 示例
        [root@localhost ~]# usermod -G mygrp,wheel -d /tmp/home -m -s /bin/zsh myusr
    • userdel:删除用户
      [root@localhost ~]# userdel [options] LOGIN
      • 常用选项:
        • -r,--remove:删除用户时一并删除用户的家目录及邮箱
      • 用法示例:
        ## 示例
        [root@localhost ~]# userdel -r myusr
    • passwd:修改用户的密码
      • 用法一:修改用户自己的密码,需要知道原密码
        [root@localhost ~]# passwd
        • 用法示例:
          ## 示例
          [root@localhost ~]# passwd
          Changing password for user root.
          New password: 
          Retype new password: 
          passwd: all authentication tokens updated successfully.
          [root@localhost ~]# 
      • 用法二:修改指定用户的密码,但默认情况下仅root有此权限,且操作者不需知道此用户的原密码
        [root@localhost ~]# passwd USERNAME
        • 用法示例:
          ## 示例
          [root@localhost ~]# passwd myusr
          Changing password for user myusr.
          New password: 
          Retype new password: 
          passwd: all authentication tokens updated successfully.
          [root@localhost ~]# 
      • 用法三:
        [root@localhost ~]# passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]
        • 常用选项:
          • -l,--lock:锁定用户的密码,即在用户原来的密码字符串前添加“!”,只有root有此权限
          • -u,--unlock:解除对用户密码的锁定,即移除被锁定用户的密码字符串前的“!”,只有root有此权限
          • -d,--delete:删除用户的密码,只有root有此权限
          • -e,--expire:使用户密码处于过期状态,用户下次登录时必须修改密码,只有root有此权限
          • -n,--minimum DAYS:设定用户密码的最小使用期限,单位为天,只有root有此权限
          • -x,--maximum DAYS:设定用户密码的最大使用期限,单位为天,只有root有此权限
          • -w,--warning DAYS:设定用户密码的警告期限,单位为天,只有root有此权限
          • -i,--inactive DAYS:设定用户密码的宽限期(非活动期限),单位为天,只有root有此权限
          • --stdin:在修改密码时从标准输入读入新的密码,以便可以使用管道进行操作或方便脚本操作,如:
        • 用法示例:
          ## 示例 1:解除对用户密码的锁定
          [root@localhost ~]# passwd -u myusr
          ## 示例 2:修改密码时从标准输入读入新的密码
          [root@localhost ~]# echo "magedu" | passwd --stdin docker
          Changing password for user docker.
          passwd: all authentication tokens updated successfully.
    • chage:修改用户密码的过期时间
      [root@localhost ~]# chage [options] LOGIN
      • 常用选项:
        • -d,--lastday LAST_DAY:设置用户的最后密码修改时间为自1970年1月1日开始的天数,或YYYY-MM-DD形式的具体日期,如果设置为0,则用户下次登录时将被强制要求修改密码
        • -E,--expiredate EXPIRE_DATE:设置用户密码的过期时间为自1970年1月1日开始的天数,或YYYY-MM-DD形式的具体日期,如果设置为-1,则会移除用户密码的过期时间
        • -m,--mindays MIN_DAYS:修改用户密码的最小生存时间,如果设置为0,则用户可以随时修改密码
        • -M,--maxdays MAX_DAYS:修改用户密码的最大生存时间,如果MAX_DAYS加上LAST_DAY小于当前日期,则用户会被强制要求修改密码
        • -W,--warndays WARN_DAYS:修改用户密码的过期警告时间
      • 用法示例:
        ## 示例 1:强制要求用户在下次登录时修改密码
        [root@localhost ~]# chage -d 0 myusr
        [root@localhost ~]# 
        ## 示例 2:移除用户的密码过期时间
        [root@localhost ~]# chage -E -1 myusr
        [root@localhost ~]# 
    • id:显示用户和组的真实和有效ID
      [root@localhost ~]# id [OPTION]... [USER]
      • 常用选项:
        • -u,--user:仅显示用户的有效UID
        • -g,--group:仅显示用户的有效GID,即当前基本组的GID
        • -G,--groups:仅显示用户包括基本组和附加组的所有组的GID
        • -n,--name:与u、g、G选项共用时,显示名称而非ID
        • -r,--real:与u、g、G选项共用时,显示真实ID而非有效ID
      • 用法示例:
        ## 示例 1:显示当前用户、组的ID信息
        [root@localhost ~]$ id
        uid=1001(myusr) gid=1001(myusr) groups=1001(myusr),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
        [root@localhost ~]$ 
        ## 示例 2:显示指定用户的用户、组的ID信息
        [root@localhost ~]# id myusr
        uid=1001(myusr) gid=1001(myusr) groups=1001(myusr),10(wheel)
        [root@localhost ~]# 
    • su:切换用户
      • 登录式切换(完全切换):通过读取目标用户配置文件来重新初始化用户环境
        [root@localhost ~]# su - USERNAME

        [root@localhost ~]# su -l/--login USERNAME
        • 用法示例:
          ## 示例:
          [root@localhost ~]# su - myusr
          Last login: Mon Jun 10 15:07:06 CST 2019 on pts/0
          [root@localhost ~]$ 
      • 非登录式切换(部分切换):不会读取目标用户的配置文件进行用户环境初始化
        [root@localhost ~]# su USERNAME
        • 用法示例:
          ## 示例:
          [root@localhost ~]# su myusr
          [root@localhost root]$ 
      • 常用选项:
        • -c command,--command=command:仅以指定用户的身份运行此处指定的命令
        • 用法示例:
          ## 示例 1:仅以指定用户的身份运行指定的命令,登录式切换
          [root@localhost ~]# su -l -c pwd myusr
          /home/myusr
          [root@localhost ~]# 
          ## 示例 2:仅以指定用户的身份运行指定的命令,非登录式切换
          [root@localhost ~]# su -c pwd myusr
          /root
          [root@localhost ~]# 
    • pwck:检查用户数据库是否有问题
      • 用法示例:
        ## 示例:
        [root@localhost ~]# pwck
        user 'ftp': directory '/var/ftp' does not exist
        user 'tom': directory '/tmp/tom' does not exist
        user 'tom': program '/bin/zsh' does not exist
        pwck: no changes
        [root@localhost ~]# 
    • grpck:检查组数据库是否有问题
      • 用法示例:
        ## 示例:
        [root@localhost ~]# grpck
        [root@localhost ~]# 
    • whoami:显示当前用户的登录名
      • 用法示例:
        ## 示例:
        [root@localhost ~]# whoami
        root
        [root@localhost ~]# 
    • finger:查询用户的相关信息
      • 用法示例:
        ## 示例:
        [root@localhost ~]# finger
        Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
        root      root       pts/0       2  Jun 10 14:34                           (192.168.43.192)
        root      root       pts/1          Jun 10 14:42                           (192.168.43.192)
        [root@localhost ~]# 
    • chfn:修改用户的相关信息

      • 用法示例:

        ## 示例:
        [root@localhost ~]# chfn
        Changing finger information for root.
        Name [root]: 
        Office []: 
        Office Phone []: 
        Home Phone []: 
        
        Finger information not changed.
        [root@localhost ~]# 
    • chsh:修改用户的默认登录Shell
      • 用法一:修改当前用户的默认登录Shell,Shell路径手动输入
        [root@localhost ~]# chsh
        Changing shell for root.
        New shell [/bin/bash]:
        [root@localhost ~]# 
      • 用法二:修改指定用户的默认登录Shell,Shell路径手动输入
        [root@localhost ~]# chsh myusr
        Changing shell for myusr.
        New shell [/bin/bash]:
        [root@localhost ~]# 
      • 用法三:列出所有可用的Shell(/etc/shells)并退出
        [root@localhost ~]# chsh -l
        /bin/sh
        /bin/bash
        /usr/bin/sh
        /usr/bin/bash
        [root@localhost ~]# 
      • 用法四:修改当前用户或指定用户的默认登录Shell,Shell路径直接输入
        [root@localhost ~]# chsh -s /bin/sh
        Changing shell for root.
        Shell changed.        
        [root@localhost ~]# 

        [root@localhost ~]# chsh -s /bin/sh myusr
        Changing shell for myusr.
        Shell changed.        
        [root@localhost ~]# 
    • 文件管理相关命令已在第一题中解答,此处不再重复
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章