Linux 基礎學習訓練教材 - CentOS 8.x

課程問題參考解答

單純提供一個相對的解答,並不是標準答案!

最近更新時間: 2020/06/11

單純就是個解答的參考,寫完之後再來這邊查查看答案跟你想的一樣不一樣!?

第 05 堂課

  • 5.1.2 課程上的那個表格填空結果
    操作動作/dir1/dir1/file1/dir2重點
    讀取 file1 內容 xr- 目錄:因為你已經知道檔案的檔名是 file1,所以不需要使用 ls 去查詢檔名,因此目錄只要具備 x 即可。若不知道檔名,才需要有目錄的 r。
    檔案:需要知道內容才能讀取,所以需要 r 的權限
    修改 file1 內容 xrw- 目錄:目錄的權限如同上面。
    檔案:由於我們需要『修改』該檔案內容,因此,file1 最好具備 r 的權限,否則會看不到之前的資料喔!
    執行 file1 內容 xrx (x)- 目錄:你需要進入該目錄才能夠去執行在該目錄內的檔案啊!所以需要 x 即可。
    檔案:若要執行該檔案至少需要有 x 權限。但是,如果該檔案是腳本檔 (shell script),那得要看到內容後才有辦法執行。 因此答案可能是 x 也可能是 rx。
    刪除 file1 檔案 wx-- 目錄:因為你需要刪除該檔名,因此至少得要能夠進入以及更動檔名的權限,所以至少需要 wx 才行。不需要 r 的原因如第一點所示。
    檔案:如同前一小節最後一個練習,要刪除檔名與該檔案無關,與該檔案所在的目錄有關喔!
    將 file1 複製到 /dir2 xrwx 來源目錄與檔案:就跟第一點一樣,要能夠讀到該檔案的權限
    目標目錄:建立檔案跟刪除檔案意義差不多,要能進入且修改檔名,所以需要 wx 。
    將 file1 移動到 /dir2 wx-(r)wx 同一檔案系統中:假設這兩個目錄在同一個檔案系統上面,那麼移動檔名就跟檔案本身無關,因此只需要兩者目錄均有更改檔名的權限 (wx) 即可。
    不同檔案系統中:但是如果這兩個目錄是在不同的檔案系統當中,那麼檔案就是『被複製後刪除』,此時檔案要加上 r 的權限才行!
  • 例題 5.1.2-1:
    1. 直接使用 root 的身份進行底下的任務即可:
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# cd /dev/shm
      [root@station10-101 shm]# mkdir unit05
      [root@station10-101 shm]# chmod 775 unit05
      [root@station10-101 shm]# cd unit05
      [root@station10-101 unit05]# mkdir dir1
      [root@station10-101 unit05]# chmod 754 dir1
      [root@station10-101 unit05]# cp /etc/hosts dir1/file1
      [root@station10-101 unit05]# chmod 644 dir1/file1
      [root@station10-101 unit05]# mkdir dir2
      [root@station10-101 unit05]# chmod 751 dir2
      [root@station10-101 unit05]# cp /etc/hosts dir2/file2
      [root@station10-101 unit05]# chmod 644 dir2/file2
      [root@station10-101 unit05]# mkdir dir3
      [root@station10-101 unit05]# chmod 755 dir3
      [root@station10-101 unit05]# cp /etc/hosts dir3/file3
      [root@station10-101 unit05]# chmod 666 dir3/file3
      [root@station10-101 unit05]# mkdir dir4
      [root@station10-101 unit05]# chmod 777 dir4
      [root@station10-101 unit05]# cp /etc/hosts dir4/file4
      [root@station10-101 unit05]# chmod 600 dir4/file4
      [root@station10-101 unit05]# ll -d . dir* dir*/*
      drwxrwxr-x. 6 root root 120 Mar 21 21:53 .
      drwxr-xr--. 2 root root  60 Mar 21 21:52 dir1
      -rw-r--r--. 1 root root 158 Mar 21 21:52 dir1/file1
      drwxr-x--x. 2 root root  60 Mar 21 21:53 dir2
      -rw-r--r--. 1 root root 158 Mar 21 21:53 dir2/file2
      drwxr-xr-x. 2 root root  60 Mar 21 21:53 dir3
      -rw-rw-rw-. 1 root root 158 Mar 21 21:53 dir3/file3
      drwxrwxrwx. 2 root root  60 Mar 21 21:54 dir4
      -rw-------. 1 root root 158 Mar 21 21:54 dir4/file4
      
    2. 使用 student 的身份進行底下的動作,並說明原因為何
      a. 的部份
      [student@station10-101 ~]$ cd /dev/shm/unit05/
      [student@station10-101 unit05]$ ll dir1
      ls: 無法存取 'dir1/file1': 拒絕不符權限的操作
      總計 0
      -????????? ? ? ? ?             ? file1
      # 因為有 dir1 的 r 權限,因此可以看到『檔名列表』沒問題。
      # 但是,因為沒有 x 的權限,因此無法針對 file1 的詳細屬性進行查閱
      # 所以,就像上面這樣,權限與屬性的部份會沒權限!檔名是可以看到的!
      
      [student@station10-101 unit05]$ ll dir2
      ls: cannot open directory 'dir2': 拒絕不符權限的操作
      # 不用講,因為沒有 dir2 的 r 權限,所以看不到任何東西!
      
      [student@station10-101 unit05]$ ll dir3
      總計 4
      -rw-rw-rw-. 1 root root 158  3月 21 21:53 file3
      [student@station10-101 unit05]$ ll dir4
      總計 4
      -rw-------. 1 root root 158  3月 21 21:54 file4
      # 因為有 dir3, dir4 的 r 與 x 權限,所以可以看到『檔名列表』與權限!
      
      b. 的部份 [student@station10-101 unit05]$ ll dir1/file1 ls: 無法存取 'dir1/file1': 拒絕不符權限的操作 # 查看檔名資料與目錄的權限有關。因為 student 僅有 dir1 的 r 沒有 x 的權限, # 所以不能將 file1 拿出來看,因此只能看到檔名,無法知道檔案屬性。 [student@station10-101 unit05]$ ll dir2/file2 -rw-r--r--. 1 root root 158 3月 21 21:53 dir2/file2 # 與上面不同,student 具有 dir2 的 x 權限,而且已經知道 file2 的檔名, # 所以不需要 dir2 的 r 也能得到 file2 的檔名資料,也能直接看到 file2 的權限屬性! [student@station10-101 unit05]$ ll dir3/file3 -rw-rw-rw-. 1 root root 158 3月 21 21:53 dir3/file3 [student@station10-101 unit05]$ ll dir4/file4 -rw-------. 1 root root 158 3月 21 21:54 dir4/file4 # 因為具有 dir3, dir4 的 rx 權限,所以可以直接查看到 file3, file4 的檔名與權限
      至於 c 的部份,請自行使用 vim 去編輯檔案,然後進行強制儲存 (:w!) ,會得到底下的結果:
      • vim dir1/file1:(1)不能讀取 file1 內容,是因為沒有 dir1 的 x 權限; (2)不能強制儲存,原因與第 1 點相同。
      • vim dir2/file2:(1)可以看到檔案內容,因為有 dir2 的 x 權限,也有 file2 的 r 權限; (2)不能強制儲存,因為沒有 file2 的 w 權限, 同時也沒有 dir2 的 w 權限之故。
      • vim dir3/file3:(1)可以看到檔案內容,因為有 dir3 的 x 權限,也有 file3 的 r 權限; (2)可以寫入,因為有 file3 的 w 權限。
      • vim dir4/file4:(1)不能讀取 file4 內容,因為沒有 file4 的 r 權限; (2)可以強迫寫入,是因為 student 具有 dir4 的 wx 權限, 因此,該檔案『可以被刪除後重新建立一個相同檔名的檔案』。所以,當你強制寫入之後,回去 ls -l dir4/file4 , 就可以很明顯的發現,dir4/file4 檔案擁有者變成 student 了!這個地方最重要!
  • 例題 5.2.2-1:
    1. 找出 PID 為 1 的,因為需要找尋系統的資料,所以,只能用 pstree -p 或 ps aux 去找尋
      a. 部份
      [student@station10-101 ~]$ pstree -p | grep '(1)'
      systemd(1)-+-ModemManager(973)-+-{ModemManager}(991)
      # 所以得到答案為 systemd 囉!
      
      [student@station10-101 ~]$ ps aux | grep ' 1 '
      root         1  0.0  0.5 244840 10084 ?        Ss    3月16   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
      student  16374  0.0  0.0  12108  1068 pts/0    S+   15:58   0:00 grep --color=auto  1
      
      不論是 pstree 還是 ps aux ,要找 PID 為 1,可以透過找到 (1) 及 1 單獨存在 (1 的兩邊有個空白),就可以找到了。所以答案就是 systemd 這個指令。 至於 b 要找到 crond 的 PID,同樣可以透過這個方式來找到:
      [student@station10-101 ~]$ pstree -p | grep crond
                 |-crond(1523)
      [student@station10-101 ~]$ ps aux | grep crond
      root      1523  0.0  0.1  36088  3220 ?        Ss    3月16   0:00 /usr/sbin/crond -n
      student  16406  0.0  0.0  12108   972 pts/0    S+   16:01   0:00 grep --color=auto crond
      
      都可以找到 PID 為 1523。另外要注意,每個系統的 PID 都不一樣,所以,在你的系統上面看到的數值不同,也是合理的!
    2. 先來使用 student 登入系統,並且重複切換帳號:
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# su - student
      [student@station10-101 ~]$ su -
      Password:
      [root@station10-101 ~]# ps -l
      F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
      4 S     0 16424 14132  0  80   0 - 47473 -      pts/0    00:00:00 su <==這裡變成 root
      4 S     0 16430 16424  0  80   0 -  6639 -      pts/0    00:00:00 bash
      4 S     0 16460 16430  0  80   0 - 47467 -      pts/0    00:00:00 su <==這裡變成 student
      4 S     0 16487 16461  0  80   0 - 47470 -      pts/0    00:00:00 su <==這裡又變成 root
      4 S     0 16491 16487  0  80   0 -  6639 -      pts/0    00:00:00 bash
      0 R     0 16515 16491  0  80   0 - 11191 -      pts/0    00:00:00 ps
      
      你可以很輕鬆的查閱到,下一行的 PPID 就是前一行的 PID (幾乎啦!),其實整筆輸出應該還少了一個項目, 那就是 bash 這個程序!畢竟每執行一次 su 後,系統就會給予一個新的權限的 bash,但是上面只輸出 2 個而已啊! 此外,也只有 root 權限才能往前追蹤~也因為已經使用了 3 次 su 啊,所以當然要輸入 3 次 exit 後, 才能回到原本的 bash 喔!
    3. 需要找到 ps 的應用,才能夠『只輸出我需要的部份』這樣的結果。如果使用 man ps 去查詢,那可以找到很前面的 example 的部份, 它有這些東西的介紹,相當有趣:
      [root@station10-101 ~]# man ps
      ......
      EXAMPLES
             To see every process on the system using standard syntax:
                ps -e
                ps -ef
                ps -eF
                ps -ely
      
             To see every process on the system using BSD syntax:
                ps ax
                ps axu
      
             To print a process tree:
                ps -ejH
                ps axjf
      
             To get info about threads:
                ps -eLf
                ps axms
      
             To get security info:
                ps -eo euser,ruser,suser,fuser,f,comm,label
                ps axZ
                ps -eM
      
             To see every process running as root (real & effective ID) in user format:
                ps -U root -u root u
      
             To see every process with a user-defined format:
                ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
                ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
                ps -Ao pid,tt,user,fname,tmout,f,wchan
      ......
      
      題目說,我們只需要 pid, pri, ni 與指令 (可用 comm 或 args),因此,可以這樣處理:
      [root@station10-101 ~]# ps -eo pid,pri,ni,args
        PID PRI  NI COMMAND
          1  19   0 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
          2  19   0 [kthreadd]
          3  39 -20 [rcu_gp]
          4  39 -20 [rcu_par_gp]
          6  39 -20 [kworker/0:0H-kblockd]
      ......
      16922  19   0 ps -eo pid,pri,ni,args
      26698  19   0 [kworker/7:3-cgroup_destroy]
      
      至於排序部份,當你 man ps ,並且搜尋 --sort 之後,可以找到這一段:
      [root@station10-101 ~]# man ps
             --sort spec
                    Specify sorting order.  Sorting syntax is [+|-]key[,[+|-]key[,...]].  Choose a multi-letter key from
                    the STANDARD FORMAT SPECIFIERS section.  The "+" is optional since default direction is increasing
                    numerical or lexicographic order.  Identical to k.  For example: ps jax --sort=uid,-ppid,+pid
      
      因此,要使用指令名稱來排序,基本上可以這樣做:
      [student@station10-101 ~]$ ps -eo pid,pri,ni,comm --sort=comm
        PID PRI  NI COMMAND
       2041  19   0 (sd-pam)
       2425  19   0 (sd-pam)
      14117  19   0 (sd-pam)
        973  19   0 ModemManager
       1104  19   0 NetworkManager
      ......
       1002  19   0 avahi-daemon
       2432  19   0 bash
      14132  19   0 bash
      15381  19   0 bash
      15316  19   0 boltd
       2304  19   0 colord
      ......
      
    4. 當 man top 之後,出現的語法如下:
      [student@station10-101 ~]$ man top
      TOP(1)                        User Commands                        TOP(1)
      
      NAME
             top - display Linux processes
      
      SYNOPSIS
             top -hv|-bcEHiOSs1 -d secs -n max -u|U user -p pid -o fld -w [cols]
      
             The traditional switches `-' and whitespace are optional.
      ......
      
      因此,只要『 top -d 2 』即可每兩秒更新一次畫面了。另外,如果需要查詢 top 裡面資料的排序,可以使用 man top 之後, 搜尋 sorting 這個關鍵字,就能得到底下的畫面:
      [student@station10-101 ~]$ man top
      ......
             SORTING of task window
      
                For compatibility, this top supports most of the former top sort keys.  Since this is primarily  a  service
                to former top users, these commands do not appear on any help screen.
                      command   sorted-field                  supported
                      A         start time (non-display)      No
                      M         %MEM                          Yes
                      N         PID                           Yes
                      P         %CPU                          Yes
                      T         TIME+                         Yes
      ......
      
      所以,你只要輸入『 top -d 2 』之後,在活動的視窗中,直接輸入大寫字元的『 M 』以及『 P 』以及『 T 』, 就可以知道排序的差異了!預設是使用 P 這個 CPU 使用率排序的!
  • 例題 5.2.3-1:
    1. 使用 ps 的方式來搞定 PRI 與 NI 等資訊:
      a. 使用 man ps 找到 exapmle 之後,知道如下的動作可以查詢 ps 的輸出:
      [roott@station10-101 ~]# ps -eo pid,pri,ni,comm
        PID PRI  NI COMMAND
          1  19   0 systemd
          2  19   0 kthreadd
      ......
      
      b. 搭配 grep 來抓關鍵字:
      [root@station10-101 ~]# ps -eo pid,pri,ni,comm | grep crond
       1523  19   0 crond
      
      c. 將上面的 1523 PID 的 ni 值改掉:
      [root@station10-101 ~]# renice -n -15 -p 1523
      1523 (process ID) old priority 0, new priority -15
      
      [root@station10-101 ~]# ps -eo pid,pri,ni,comm | grep crond
       1523  34 -15 crond
      
      最終的 NI 從 0 變成了 -15 了,至於 PRI 則從原本的 19 變成了 34 了!(19 - (-15) = 19+15 = 34)
    2. 再來則是切換身份成為 student,但是在成為 student 之前,使用 nice 這個指令,將 su 的優先序降低看看:
      [root@station10-101 ~]# man nice
      NICE(1)                                 User Commands                                NICE(1)
      
      NAME
             nice - run a program with modified scheduling priority
      
      SYNOPSIS
             nice [OPTION] [COMMAND [ARG]...]
      
      DESCRIPTION
             Run  COMMAND  with  an  adjusted niceness, which affects process scheduling.  With no
             COMMAND, print the current niceness.  Niceness values range from -20 (most  favorable
             to the process) to 19 (least favorable to the process).
      
             Mandatory arguments to long options are mandatory for short options too.
      
             -n, --adjustment=N
                    add integer N to the niceness (default 10)
      
      知道指令下達的方式之後,就可以開始處理了:
      [root@station10-101 ~]# nice -n 10 su - student
      [student@station10-101 ~]$ ps -l
      F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
      0 S  1000 20131 20124  0  80   0 -  6859 -      pts/0    00:00:00 bash
      4 S  1000 20200 20199  0  90  10 -  6108 -      pts/0    00:00:00 bash
      0 R  1000 20226 20200  0  90  10 - 11191 -      pts/0    00:00:00 ps
      
      可以很清楚的看到, nice 值是會向後繼承的,因此,在上面的 20200 這個 PID 之後衍生出來的程序, 他的 Nice 都會預設是 10 喔!這個部份也得注意!
    3. 如之前的實際練習當中的方式,man top 時,可以發現到 M, P, T 等按鈕可以處理排序,而 -p PID 則可以只查閱某支程序。 剛剛的 PID 是 20200 這一個,現在,我們用 top 只查詢這個程序:
      [student@station10-101 ~]$ top -d 2 -p 20200
      top - 22:11:30 up 6 days,  7:24,  3 users,  load average: 0.00, 0.00, 0.00
      Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
      %Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
      MiB Mem :   1828.4 total,    152.5 free,   1139.6 used,    536.3 buff/cache
      MiB Swap:   2048.0 total,   1999.7 free,     48.2 used.    507.9 avail Mem
      
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      20200 student   30  10   24432   5116   3268 S   0.0   0.3   0:00.02 bash
      
      現在,當你 man top 然後搜尋 renice 時,就會看到有個 r 的指令可以應用~此時,請在 top 的視窗內, 按下『 r 』,然後將 ni 值改為 0 與 15 看看。你會發現 0 不能改, 15 則可以更改成功!
      [student@station10-101 ~]$ top -d 2 -p 20200
      PID to renice [default pid = 20200] 20200
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      20200 student   30  10   24432   5116   3268 S   0.0   0.3   0:00.02 bash
      
      Renice PID 20200 to value 0
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      20200 student   30  10   24432   5116   3268 S   0.0   0.3   0:00.02 bash
      
       Failed renice of PID 20200 to 0: Permission denied
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      20200 student   30  10   24432   5116   3268 S   0.0   0.3   0:00.02 bash
      # 上面依序輸入 r, 20200, 0 的結果會是這樣~如果依序輸入 r, 20200, 15 的結果,會變這樣:
      
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      20200 student   35  15   24432   5116   3268 S   0.0   0.3   0:00.02 bash
      
  • 例題 5.2.4-1:
    1. 快速的將工作丟到背景去:
      [student@station10-101 ~]$ find /
      /
      /boot
      /boot/initramfs-4.18.0-147.el8.x86_64kdump.img
      ......
      /proc/37/task/37/oom_score
      /proc/37/task/37/oom_adj
      /proc/37/task/37/oom_score_adj^Z  <==按下 [ctrl]+z 喔!
      [1]+  Stopped                 find /
      
      如上所示,系統會告訴你,有一個編號 [1] 號的工作在系統內暫停 (stopped),指令內容為 find / 這樣!相當清楚!
    2. 不過,要仔細查看背景工作,就用 jobs 吧!
      [student@station10-101 ~]$ jobs
      [1]+  Stopped                 find /
      [student@station10-101 ~]$ jobs -l
      [1]+ 20380 Stopped                 find /
      
      jobs -l 可以多出一個數字,那個數字就是 PID 囉!這樣觀察比較清楚!
    3. 讓該工作在背景底下執行的話,就用『 bg %1 』即可!不過,畫面很亂喔! 此時你按下『 [ctrl]+z 或 [ctrl]+c 』該程式都不會理你!這是因為那是背景工作~前景指令管不到! 如果想要短時間處理該程序,就得要很快速的『 fg %1 』然後再『 [ctrl]+z 』才行!
      [student@station10-101 ~]$ bg %1
      ......
      
    4. 執行『 find / & 』之後,該指令就會被丟到系統背景去執行,因此按下『 [crtl]+z 』就沒有任何作用了!
    5. 連續指令的執行可以使用分號 (;) 來連結執行,但是因為前一個指令使用了 & 的結尾符號,在 & 之後不能再加其他指令。 因此只好使用兩次指令執行!但記得速度要快!
      [student@station10-101 ~]$ find / &> /tmp/findroot.txt &
      [1] 20850
      [student@station10-101 ~]$ jobs -l
      [1]+ 20850 退出 1                find / &> /tmp/findroot.txt
      
      確實是可以看到 jobs 喔!不過因為執行過一次以後,Linux 會將搜尋到的資料快取在記憶體,因此再次使用 find 時, 速度會快的跟在飛一樣!所以,如果第二個指令執行不夠快速,你就看不到執行過程了。另外,使用資料流重導向,可以讓輸出訊息導向到檔案, 所以螢幕就不會被檔名搞亂了!
    6. sleep 是個挺有趣的指令,它會讓系統暫停,然後倒數一段時間,等到時間經過之後,才會繼續往下工作。 因此,直接輸入 sleep 60s 時,你的 bash 會暫停 60 秒,這時只要按下 [ctrl]+z ,這個倒數就會被暫停~ 前景操作會還給你。
      [student@station10-101 ~]$ sleep 60s
      ^Z  <==其實這裡是按下 [ctrl]+z 喔!
      [1]+  已停止               sleep 60s
      [student@station10-101 ~]$ jobs -l
      [1]+ 20886 停止                  sleep 60s
      
      所以,確認結果後, sleep 60s 現在正在『暫停』中沒錯!沒有持續倒數喔!
    7. 直接輸入『 bg %1 』即可!
      [student@station10-101 ~]$ bg %1
      [1]+ sleep 60s &
      [1]+ 20886 已完成               sleep 60s
      
      靜待一段時間後,bash 畫面會丟出 sleep 已經完成的訊息給妳看喔!
    8. 直接輸入 vim 之後,在 vim 的畫面中按下『 [ctrl]+z 』看看:
      [student@station10-101 ~]$ vim
         <==在 vim 當中按下 [ctrl]+z 的結果!
      [1]+  已停止               vim
      [student@station10-101 ~]$ jobs -l
      [1]+ 20959 停止                  vim
      
      確定 vim 在背景中暫停喔!
    9. 跟 find 還有 sleep 一樣,輸入 bg %1 看看即可!
      [student@station10-101 ~]$ bg %1
      [1]+ vim &
      
      [1]+  已停止               vim
      [student@station10-101 ~]$ jobs -l
      [1]+ 20959 停止 (tty 輸出)     vim
      
      vim 依舊是暫停的狀態,這是因為 vim 一定要與人互動 (輸入) 才能執行,不能自己亂動。因此,vim 在背景底下無法變成 run 的模式! 所以在背景下, vim 將永遠是暫停的嚕!
    10. 輸入 fg %1 然後按下『 :q! 』即可!
  • 例題 5.3.1-1:
    1. 先用 student 帳號改自己的密碼!
      [student@station10-101 ~]$ passwd
      更改使用者 student 的密碼。
      Current password: <==這裡先輸入原本的密碼,就是 mystdgo
      新 密碼:         <==這裡輸入 123456
      不良的密碼:密碼短於 8 個字元
      passwd: 驗證記號處理錯誤
      
      因為密碼短之外,又太爛,所以無法通過系統的密碼強度驗證,就直接給妳丟出來,因此密碼沒有更改喔!
    2. openssl 是個很常用於密碼相關的指令,其中 rand 功能就是用來猜測密碼的
      [student@station10-101 ~]$ openssl rand -base64 8
      nGGpkK4Kjkk=
      [student@station10-101 ~]$ openssl rand -base64 8
      4Rmi5usNDJg=
      
      相同的指令,但是每次都會產生不同的密碼!我們將第二個密碼拿出來,並且不要輸入 = 號,亦即以『 4Rmi5usNDJg 』 作為我們的新密碼看看。
    3. 開始修改密碼:
      [student@station10-101 ~]$ passwd
      更改使用者 student 的密碼。
      Current password:   <==這裡先輸入原本的密碼,就是 mystdgo
      新 密碼:           <==輸入新密碼 4Rmi5usNDJg
      再次輸入新的 密碼: <==再輸入一次!
      passwd:所有核對代符都已成功更新。
      
    4. 查看密碼檔最後一次被更新的時間:
      [student@station10-101 ~]$ date
      日  3月 22 23:19:16 CST 2020
      [student@station10-101 ~]$ ll /etc/shadow
      ----------. 1 root root 1996  3月 22 23:17 /etc/shadow
      
      檔案確實在幾分鐘前被更新過!所以,使用者確實可以更改自己的密碼喔!
    5. 注意 /etc/shadow 是密碼檔,很可愛的是, student 可以更改 /etc/shadow 喔!很不可思議吧! 但是 /etc/shadow 卻是 000 的分數,事實上,傳統的 rwx 權限中, student 根本不可能更改這個檔案啊!
    6. 請使用 root 的權限,將 student 密碼改回來!
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# echo mystdgo | passwd --stdin student
      Changing password for user student.
      passwd: all authentication tokens updated successfully.
      [root@station10-101 ~]# exit
      logout
      
  • 例題 5.3.1-2:
    1. 先執行 passwd 看看:
      [student@station10-101 ~]$ passwd
      更改使用者 student 的密碼。
      Current password:
      
    2. 在上述的輸入密碼的階段,按下『 [ctrl]+z 』然後按下『 [enter] 』之後,在輸入 jobs 看看。
      Current password:
      
      [1]+  已停止               passwd
      [student@station10-101 ~]$ jobs -l
      [1]+ 21350 停止                  passwd
      
    3. 開始執行 pstree 看看
      [student@station10-101 ~]$ pstree -pu | grep -A1 -B1 passwd
         |-gnome-terminal-(15372)-+-bash(15381)-+-grep(21446)
         |                        |             |-passwd(21423,root)
         |                        |             `-pstree(21445)
      
      所以 passwd 執行期間,確實就是 root 的身份啊!
    4. 按下『 fg %1 』然後『 [ctrl]+c 』結束即可。
  • 例題 5.3.1-3:
    1. 使用 student 的身份下達指令
      [student@station10-101 ~]$ locate passwd
      locate: 無法執行 stat()「/var/lib/mlocate/mlocate.db」: 沒有此一檔案或目錄
      
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# updatedb
      [root@station10-101 ~]# exit
      logout
      
      [student@station10-101 ~]$ locate passwd
      /etc/passwd
      /etc/passwd-
      /etc/pam.d/passwd
      ......
      
      這個指令可以透過資料庫環境,直接找到檔名列表!速度很快喔!
    2. 觀察一下剛剛建立的資料庫在哪裡:
      [student@station10-101 ~]$ ll -d /var/lib/mlocate/
      drwxr-x---. 2 root slocate 24  3月 23 08:57 /var/lib/mlocate/
      
    3. 承上,看來權限是 750,而 student 屬於 others 的權限,因此使用者並沒有權限可以進入該目錄,也就無法取用該目錄下的任何資料。 因此,讀者們應該要思考,那為何 student 可以執行 locate 這個指令呢?
    4. 查詢一下 locate 這個指令在何方:
      [student@station10-101 ~]$ which locate
      /usr/bin/locate
      [student@station10-101 ~]$ type -a locate
      locate 是 /usr/bin/locate
      
      基本上有兩個指令可以查詢『指令的絕對路徑檔名』,那就是 which 以及 type -a 這兩個!
    5. 接下來,查詢一下 locate 的權限:
      [student@station10-101 ~]$ ll /usr/bin/locate
      -rwx--s--x. 1 root slocate 48552  5月 11  2019 /usr/bin/locate
      
      搭配前幾點來看, locate 具有 SGID,亦即 student 執行 locate 時,其所屬的『有效群組』將會暫時切換成為 locate 這個指令的群組, 亦即 student 的有效群組將會轉成 slocate 這個群組名稱。然後, /var/lib/mlocate 是屬於 slocate 群組的, 而群組具有 r-x 的群線,因此,就在 student 操作 locate 時,就能夠取得 r-x 的權限來讀取 /var/lib/mlocate 的資料了!
  • 例題 5.3.1-4:
    1. 看檔案權限,直接用 ll 最快
      [root@station10-101 ~]# ll -d /run/log/journal/
      drwxr-sr-x. 3 root systemd-journal 60  3月 16 14:46 /run/log/journal/
      
      屬於 systemd-journal 這個群組之外,權限設定為 SGID 喔!
    2. 建立個檔案看看
      [root@station10-101 ~]# touch /tmp/fromroot
      [root@station10-101 ~]# ll /tmp/fromroot
      -rw-r--r--. 1 root root 0 Mar 23 13:31 /tmp/fromroot
      
      既然是 root 處理的,當然帳號與群組都是屬於 root 的!大致上就是這樣!
    3. 但是在 SGID 的目錄裡面新建的資料會變這樣:
      [root@station10-101 ~]# touch /run/log/journal/fromroot
      [root@station10-101 ~]# ll /run/log/journal/fromroot
      -rw-r--r--. 1 root systemd-journal 0 Mar 23 13:33 /run/log/journal/fromroot
      
      群組會變這樣!這就是 SGID 的能力!
  • 例題 5.3.1-5:
    1. 觀察 /tmp 權限先:
      [student@station10-101 ~]$ ll -d /tmp
      drwxrwxrwt. 12 root root 4096  3月 23 13:31 /tmp
      
      可以看到其他人 (others) 在 x 權限的位置上,變成了 t 這個旗標了!
    2. 用 root 身份進入 /tmp 看看
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# cd /tmp
      
    3. 複製資料並修改權限
      [root@station10-101 tmp]# cp /etc/hosts myhosts
      [root@station10-101 tmp]# chmod 777 myhosts
      [root@station10-101 tmp]# ll myhosts
      -rwxrwxrwx. 1 root root 158 Mar 23 13:51 myhosts
      
      所以變成任何人都可以對這個檔案進行變更的情況喔!
    4. 用 student 來到 /tmp 看看
      [student@station10-101 ~]$ cd /tmp
      [student@station10-101 tmp]$ ll myhosts
      -rwxrwxrwx. 1 root root 158  3月 23 13:51 myhosts
      
    5. 用 student 去編輯 myhosts
      [student@station10-101 tmp]$ vim myhosts
      
      編輯完可以按下 :w 儲存沒問題!
    6. 嘗試刪除
      [student@station10-101 tmp]$ rm myhosts
      rm: 無法移除 'myhosts': 此項操作並不被允許
      
      因為雖然 /tmp 權限有包含 777 在內,但是因為有 SBIT 的功能,因此 myhost 僅有 root 及檔案擁有者 (也恰巧是 root) 才能刪除。 所以 student 是沒有權限可以刪除的喔!
  • 例題 5.3.2-1:
    1. 一般使用者執行指令會產生與 root 相同的權限,那就是 SUID 的功能!因此可以這麼做:
      [student@station10-101 tmp]$ su -
      密碼:
      [root@station10-101 ~]# cd /usr/local/bin
      [root@station10-101 bin]# cp /usr/bin/cat mycat2
      [root@station10-101 bin]# chmod u+s mycat2
      [root@station10-101 bin]# ll mycat2
      -rwsr-xr-x. 1 root root 51856 Mar 23 14:22 mycat2
      
      [root@station10-101 bin]# exit
      logout
      [student@station10-101 tmp]$ cat /etc/shadow
      cat: /etc/shadow: 拒絕不符權限的操作
      
      [student@station10-101 tmp]$ mycat2 /etc/shadow
      root:$6$1sR2WQzGzLtoqnKA$gJXeZEYh5tOwZyhhzQgWPbhXvtCQhibDdlUbEo8nQEdaf5CZJ1b44OZpVPE1b7ZVTuynIT303BxNKi.XcEinW.::0:99999:7:::
      ......
      
      所以,一般帳號執行兩個相同功能的指令, cat 與 mycat2 時,其產生的效果就有顯著的不一樣啊!
    2. 再來測試 SGID 目錄的功能
      [student@station10-101 ~]$ su -
      密碼:
      [root@station10-101 ~]# cd /srv
      [root@station10-101 srv]# ll -d project1/
      drwxrwx---. 2 root progroup 6 Mar 16 00:38 project1
      
      [root@station10-101 srv]# chmod g+s project1/
      [root@station10-101 srv]# ll -d project1/
      drwxrws---. 2 root progroup 6 Mar 16 00:38 project1/
      
      [root@station10-101 srv]# su - prouser1
      [prouser1@station10-101 ~]$ cd /srv/project1/
      [prouser1@station10-101 project1]$ touch fromme
      [prouser1@station10-101 project1]$ ll fromme
      -rw-rw-r--. 1 prouser1 progroup 0 Mar 23 14:27 fromme
      
      [prouser1@station10-101 project1]$ exit
      logout
      
      這樣,任何『新建』的資料,其群組會與該目錄的群組相同!
  • 例題 5.4 課後練習
    1. 至少要讓其他人可以進入 prouser1 的家目錄,所以其他人需要具備 x 權限在 prouser1 的家目錄上。接下來就能簡單的設計好 student 的權限了。
      [root@station10-101 ~]# cd ~prouser1
      [root@station10-101 prouser1]# mkdir for_student
      [root@station10-101 prouser1]# chown prouser1:student for_student/
      [root@station10-101 prouser1]# chmod 770 for_student/
      [root@station10-101 prouser1]# chmod o+x ~prouser1
      [root@station10-101 prouser1]# ll -d ~prouser1 ~prouser1/for_student/
      drwx-----x. 4 prouser1 prouser1 118 Mar 23 14:48 /home/prouser1
      drwxrwx---. 2 prouser1 student    6 Mar 23 14:48 /home/prouser1/for_student/
      
      [student@station10-101 ~]$ ll /home/prouser1
      ls: cannot open directory '/home/prouser1': 拒絕不符權限的操作  <==只有 x 權限,不能瀏覽也是正常的
      
      [student@station10-101 ~]$ cd /home/prouser1/for_student  <==沒有 r ,所以不能用 [tab] 補齊!
      [student@station10-101 for_student]$ pwd
      /home/prouser1/for_student
      [student@station10-101 for_student]$ touch abcd
      [student@station10-101 for_student]$ ll
      總計 0
      -rw-rw-r--. 1 student student 0  3月 23 14:52 abcd
      
    2. 接下來也是在 prouser1 的家目錄,因為同樣也要讓其他人進來本目錄,所以上一題設定的 x 就很重要了!
      [root@station10-101 ~]# cd ~prouser1
      [root@station10-101 prouser1]# mkdir for_read
      [root@station10-101 prouser1]# chown prouser1 for_read
      [root@station10-101 prouser1]# chmod 755 for_read/
      [root@station10-101 prouser1]# ll -d ~prouser1 ~prouser1/for_read/
      drwx-----x. 5 prouser1 prouser1 134 Mar 23 14:55 /home/prouser1
      drwxr-xr-x. 2 prouser1 root       6 Mar 23 14:55 /home/prouser1/for_read/
      
    3. 很簡單!就用 nice 即可
      [student@station10-101 ~]$ nice -n 15 sh -c "sleep 60s; head -n 1 /etc/passwd"
      
    4. 最佳化 ni 值就是 -20 了!所以這樣做即可:
      [root@station10-101 ~]# ps -eo pid,pri,ni,comm | grep gdm
       1520  19   0 gdm
       2032  19   0 gdm-session-wor
       2048  19   0 gdm-x-session
      14712  19   0 gdm-session-wor
      14743  19   0 gdm-x-session
      [root@station10-101 ~]# renice -n -20 -p 1520
      1520 (process ID) old priority 0, new priority -20
      [root@station10-101 ~]# ps -eo pid,pri,ni,comm | grep gdm
       1520  39 -20 gdm
       2032  19   0 gdm-session-wor
       2048  19   0 gdm-x-session
      14712  19   0 gdm-session-wor
      14743  19   0 gdm-x-session
      
修改歷史:
  • 2020/02/25:嘗試直接在課程中加入解答,讓大家有個參考依據。不過,沒事不要來看啊!
  • 2020/03/10:加入了第三章的後課練習部份。
2020/03/02 以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計