第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 ~]# 
    • 文件管理相關命令已在第一題中解答,此處不再重複
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章