# Linux 基礎訓練 - 期中考練習
###### tags: `家教`
作業硬碟一般操作說明:
- 開啟雲端虛擬機器前,請務必確認你開啟的硬碟是『practice1』,否則就會做錯題目
- 若要使用圖形界面,請務必使用 student 身份登入,若需要切換身份,再啟用終端機處理。
- 若有簡答題需要使用中文,請自行以第一堂課的動作自行處理輸入法安裝。
- 每部虛擬機器均有獨特的網卡位址,請勿使用他人硬碟上傳,否則計分為 0 分。
- 每位同學均有自己的 IP 尾數,請先向老師詢問您的 IP 尾數,才可以進行作業上傳。
- 最終上傳作業結果,請務必使用 root 身份上傳。
- 進入作業硬碟後,先用 root 身份執行 vbird_book_setup_ip , 執行流程請參考:vbird_book_setup_ip
作業當中,某些部份可能為簡答題~若為簡答題時,請將答案寫入 /home/student/ans.txt 當中,並寫好正確題號,方便老師訂正答案。 請注意,檔名寫錯將無法上傳!
重要注意事項:
- 請以 student 登入系統後,切換身份為 root 以進行底下的所有動作喔。
- 若無法開機進入正常模式,則此次考試為 0 分
- 若無法傳送成績,此次考試亦為 0 分
開始考試的練習:
## 1.系統救援
### A
因為某些緣故,目前這個作業系統應該是無法順利開機的。根據猜測,可能的原因與管理員曾經動過 chsh 這個指令有關,同時,管理員似乎也更動過 fstab 這個設定檔。請依據這些之前的可能舉動,來恢復系統的可登入狀態。 (hint: 千萬不要忘記 .autorelabel 的動作!)
### B
救援完畢之後,請先使用 vbird_book_setup_ip 指令設定好你的學號與 IP 之後,再開始底下的題目練習。 (這一題可能會無法實做,應該要等到下一題的 2.A 做完,才能夠回到這裡來繼續工作的。)
## 2.管理員的操作環境整理
### A
當你用 student 轉成 root 之後,會發現很奇怪的現象,就是很多指令都不能執行了。 這應該與上次登入管理員的用戶處理到錯誤的 bash 環境設定檔有關。請查詢 root 可能的設定檔後,將這個問題解決。 底下為此題的提示:
a. 思考一下,應該是與那一個變數有關?
b. 若要執行其他指令,可能需要使用絕對路徑才能夠執行,例如你不能直接執行 usermod,可能需要透過 /usr/sbin/usermod 來處理。
c. 『個人』的環境設定檔有很多個喔!請仔細檢查。另外,請不要修改到統一的系統設定
d. 這題處理完畢,請記得要回去處理前一題 1.B 的 vbird_book_setup_ip
#### Ans
到 `/root/.bash_profile` 註解 `# PATH='/bin:${path}:/root/scripts/'`
### B
增加 histroy 的輸出,讓 root 自己最大可達 10000 筆紀錄,且 (1)其他用戶保留預設值 (2)紀錄檔內也要紀錄 10000 筆。
#### Ans
到 `/root/.bashrc` 加入
```
HISTSIZE=10000
HISTFILESIZE=10000
```
### C
建立一個命令別名 myerr 這個指令,這個指令會運作『 echo "I am error message" 』這個指令串。
#### Ans
```
alias myerr='echo "I am error message"'
```
### D
當 root 執行『 cd ${mywork} 』時,工作目錄會跑去 /usr/local/libexec/ 當中
#### Ans
將 `mywork="/usr/local/libexec"`加入 /root/.bashrc 中
## 3.檔案系統的整理
### A
系統內有個名為 /dev/vda4 的分割槽,這個分割槽是做錯的,因此,請將這個分割槽卸載,然後刪除分割,將磁碟容量釋放出來。
#### ANS
執行 `lsblk` 會看到 `/dev/vda4` 後輸入 `umount /dev/vda4` 將其卸載
```
gdisk /dev/vda
p (印出分割表)
d (刪除分割)
4 (vda4)
w (寫入)
partprobe -s (更新分割資訊到系統)
lsblk (查看目前分割表,已經釋放vda4)
```
### B
完成上面的題目之後,請依據底下的說明建立好所需要的檔案系統(所有的新掛載,應該使用 UUID 來掛載較佳。)

上述四個新增的資料都能夠開機後自動的掛載或啟用。
#### ANS
```
gdisk /dev/vda
n -> enter -> enter -> +1G -> enter
n -> enter -> enter -> +2G -> 0700
n -> enter -> enter -> +1G -> enter
n -> enter -> enter -> +1G -> 8200
p (查看)
w (寫入)
# 建立掛載點
mkdir /mydata
mkdir /mydata/xfs
mkdir /mydata/vfat
mkdir /mydata/ext4
# 格式化檔案系統
mkfs.xfs -f /dev/vda4
mkfs.vfat /dev/vda5
mkfs.ext4 /dev/vda6
mkswap /dev/vda7
swapon /dev/vda7
# 確認每個 uuid
blkid /dev/vda4
blkid /dev/vda5
blkid /dev/vda6
blkid /dev/vda7
# 設定開機自動掛載
vim /etc/fstab
將原本 /dev/vda4 /data xfs defaults 0 0 註解 or 刪掉
加入
UUID={} /mydata/xfs xfs defaults,nosuid 0 0
UUID={} /mydata/vfat vfat defaults,uid=student,gid=student 0 0
UUID={} /mydata/ext4 ext4 defaults,noatime 0 0
UUID={} swap swap defaults 0 0
:wq (儲存並退出)
mount -a (掛載剛剛的設定)
# 查看掛載
lsblk
mount
free
```
### C
有個光碟映像檔 /mycdrom.iso 的檔案,請將他掛載到 /mydata/cdrom 裡面,而且每次開機都能自動掛載上來。 (請自行查詢光碟檔案掛載時所需要的檔案系統類型)
#### ANS
```
mkdir cdrom
blkid /mycdrom.iso (查看檔案類型 ex:iso9660)
vim /etc/fstab
加入
/mycdrom.iso /mydata/cdrom iso9660 defaults,loop,ro 0 0
mount -a # 掛載
# 查看
lsblk
mount
```
### D
建立一個名為 /mydata.img 的 200MB 大檔案,這個檔案格式化為 xfs ,且開機會主動的掛載於 /mydata/xfs2/ 目錄中
#### ANS
```
dd if=/dev/zero of=/mydata.img bs=1M count=200
mkfs.xfs -f /mydata.img
mkdir /mydata/xfs2
vim /etc/fstab
加入
/mydata.img /mydata/xfs2 xfs defaults 0 0
mount -a
lsblk (查看結果)
```
## 4.基礎帳號管理,請依據底下的說明,建立或恢復許多帳號
### A
請刪除系統中的 baduser 這個帳號,同時將這個帳號的家目錄與郵件檔案同步刪除。
#### ANS
```
userdel -r baduser
# 檢查是否已經刪掉 baduser 資料夾
cd /home
cd /var/spool/mail
```
### B
有個帳號 gooduser 不小心被管理員刪除了,但是這個帳號的家目錄與相關郵件都還存在。請參考這個帳號可能的家目錄所保留的 UID 與 GID, 並嘗試以該帳號原有的 UID/GID 資訊來重建該帳號。而這個帳號的密碼請給予 MyPassWord 的樣式。
#### ANS
```
ll -d /home/gooduser # 查看 uid , gid
useradd -u 1100 -d /home/gooduser gooduser
passwd gooduser
MyPassWord
MyPassWord
```
### C
群組名稱為: mygroup, nogroup
#### ANS
```
groupadd mygroup
groupadd nogroup
```
### D
帳號名稱為: myuser1, myuser2, myuser3 ,通通加入 mygroup,且密碼為 MyPassWord
#### ANS
```
useradd -g mygroup myuser1
useradd -g mygroup myuser2
useradd -g mygroup myuser3
passwd myuser1
MyPassWord
MyPassWord
passwd myuser2
MyPassWord
MyPassWord
passwd myuser3
MyPassWord
MyPassWord
```
### E
帳號名稱為: nouser1, nouser2, nouser3 ,通通加入 nogroup,且密碼為 MyPassWord
#### ANS
```
useradd -g nogroup nouser1
useradd -g npgroup nouser2
useradd -g npgroup nouser3
passwd nouser1
MyPassWord
MyPassWord
passwd nouser2
MyPassWord
MyPassWord
passwd nouser3
MyPassWord
MyPassWord
```
### F
帳號名稱為: ftpuser1, ftpuser2, ftpuser3,無須加入次要群組,密碼為 MyPassWord,且這三個帳號主要用來作為 FTP 傳輸用的帳號, 因此需要不能互動的 shell。
#### ANS
```
useradd -s /sbin/nologin ftpuser1
useradd -s /sbin/nologin ftpuser2
useradd -s /sbin/nologin ftpuser3
passwd ftpuser1
MyPassWord
MyPassWord
passwd ftpuser2
MyPassWord
MyPassWord
passwd ftpuser3
MyPassWord
MyPassWord
```
## 5.管理群組共用資料的權限設計
### A
建立一個名為 /srv/myproject 的目錄,這個目錄可以讓 mygroup 群組內的使用者完整使用,且【新建的檔案擁有群組】為 mygroup 。不過其他人不能有任何權限
#### ANS
```
mkdir /srv/myproject
chgrp mygroup /srv/myproject
chmod 2770 /srv/myproject
ls -l /srv/myproject (查看)
```
### B
雖然 nogroup 群組內的用戶對於 /srv/myproject 應該沒有任何權限,但當 nogroup 內的用戶執行 /usr/local/bin/myls 時,可以產生與 ls 相同的資訊,且暫時擁有 mygroup 群組的權限,因此可以查詢到 /srv/myproject 目錄內的檔名資訊。 也就是說,當你使用 nouser1 的身分執行【myls /srv/myproject】時,應該是能夠查閱到該目錄內的檔名資訊。
#### ANS
找不到 /usr/local/bin/myls 先跳過
### C
建立一個名為 /srv/change.txt 的空檔案,這個檔案的擁有者為 myuser1,擁有群組為 nogroup,myuser1 可讀可寫, nouser1 可讀,其他人無權限。 這個檔案所有人都不能執行。此外,這個檔案的最後修改時間請調整成 2020 年 02 月 5 日的 13 點 0 分。
#### ANS
```
chown myuser1 /srv/change.txt
chgrp nogroup /srv/change.txt
chmod 640 /srv/change.txt
touch -t 202002051300 /srv/change.txt
# 察看結果
ll --full-time /srv/change.txt
```
## 6.檔案的搜尋與管理
### A
將 /usr/sbin 與 /usr/bin 裡面,只要是具有 SUID 與/或 SGID 的權限檔案,就將該檔案連同權限,全部複製到 /root/findperm 目錄中。
#### ANS
```
mkdir /root/finperm
cd /usr/sbin
find ./ -type f \( -perm -4000 -o -perm -2000 \) -exec cp -p {} /root/findperm/{} \;
cd /usr/bin
find ./ -type f \( -perm -4000 -o -perm -2000 \) -exec cp -p {} /root/findperm/{} \;
# 察看結果
ls -l /root/findperm
```
### B
找出系統中檔案擁有者為 examuserya 的檔名,並將這些找到的檔名(含權限)複製到 /root/finduser/ 目錄內
#### ANS
```
mkdir /root/finduser
find / -user examuserya -type f -exec echo {} \;
```

```
# 察看結果
ls -l /root/findperm
```
### C
有個名為 /srv/mylink.txt 檔案,這個檔案似乎有許多的實體連結檔。請將這個檔案的所有實體連結檔的檔名,通通複製到 /root/findlink 目錄下。
#### ANS
```
mkdir /root/findlink
find / -samefile /srv/mylink.txt
```

### D
想辦法建立一個檔名 /srv/mail ,當使用者進入 (cd) 這個檔名時,就會被導向 /var/spool/mail 去。(考慮是 symbolic link 還是 hard linke 呢?)
#### ANS
```
ln -s /var/spool/mail /srv/mail
```
### E
在 root 家目錄下,建立一個名為 -hidden 的目錄(開頭為減號),並將 root 家目錄底下的隱藏檔中,以 .b 為開頭的檔案, 通通複製到 -hidden 目錄內。
#### ANS
```
cd /root
find ./ -type f -name ".b*" -exec cp -p {} ./-hidden/{} \;
```
### F
在 root 家目錄下,建立一個名為 mydir 的目錄,在該目錄底下建立 userid01, userid02... 到 userid50 的 50 個空目錄
#### ANS
```
cd /root
mkdir mydir
cd mydir
```
### G
在 root 家目錄下,建立一個名為 myfile 的目錄,在該目錄底下,建立『 file_XXX_YYY_ZZZ.txt 』的檔案,其中 XXX 代表 mar, apr, may 三個字串, YYY 代表 first,second,third 三個字串, ZZZ 代表 paper, photo, chart 三個字串。
#### ANS
```
mkdir /root/myfile
vim test.sh
```
將下列程式碼複製到 test.sh 中
```
a1=("mar" "apr" "may")
a2=("first" "second" "third")
a3=("paper" "photo" "chart")
for i in ${a1[*]}; do
for j in ${a2[*]}; do
for k in ${a3[*]};
do
touch file_${i}_${j}_${k}.txt;
done
done
done
```
```
# 更改權限為可執行
chmod 777 test.sh
./test.sh
# 察看結果
ls
```

### H
在 root 家目錄下有個名為 ~myuser1 的目錄,請刪除該目錄。
#### ANS
```
rm -rf ./~myuser1
```
## 7.檔案內容的處理
### A
透過 date 的功能,將目前的時間以『 YYYY-MM-DD HH:MM 』的格式,使用覆蓋的方法記載進 /root/mytext.txt 檔案中。
#### ANS
```
cd /root
touch mytext.txt
date +'%Y-%m-%d %H:%M' > mytext.txt
```
### B
將 /etc/services, /etc/fstab, /etc/passwd, /etc/group 這四個檔案的最後 4 行擷取下來後 (所以應該會有 4*4=16 行,同時會有該檔名記載),『累加』轉存到 /root/mytext.txt 當中。
#### ANS
```
cd /root
tail -n 4 /etc/services >> mytext.txt
tail -n 4 /etc/fstab >> mytext.txt
tail -n 4 /etc/passwd >> mytext.txt
tail -n 4 /etc/group >> mytext.txt
```
### C
使用 ll 的方式,將 /etc/selinux/ 的所有檔案列出(不含子目錄內容),但是時間需要使用完整格式 (類似『2020-04-20 23:17:46.363000000 +0800』的格式),並將輸出結果『累加』轉存到 /root/mytext.txt 當中。
#### ANS
```
ll --full-time /etc/selinux >> mytext.txt
```
## 8.問答題:請將底下的問題的答案寫入 /root/practice1.txt 檔案中
### A
當你登入系統,系統會給予一個名為 mykernel 的變數,請將這個變數的內容寫下來。
#### ANS
`echo $mykernel`
### B
格式化ext4檔案系統後,主要有superblock, inode與block區塊,請問這些區塊主要放置哪些東西?
#### ANS
- superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等;
- inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼;
- block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。
### C
使用任何你知道的程序觀察指令,找到名為 sleep 的程序,找出他的 NI 值是多少?
#### ANS
`ps ax -o pid,ni,cmd | grep "sleep"`
### D
在 /srv/ 底下有個隱藏檔的目錄存在,請列出該『目錄』的完整檔名。
#### ANS
`ls -a /srv`
### E
有一個檔案名稱為:/mydir/myfile(假設檔案是存在的,直接思考題),若 student 用戶想要修改myfile的內容,那麼 student 『至少』需要具有什麼權限才能夠修改該檔案?
#### ANS
可讀 可寫 (rw)
### F
有一個檔案檔名為 /usr/local/etc/myhosts,請問 student 對這個檔案具有什麼權限?
#### ANS
可讀 可執行
### G
目前你的系統上,哪兩個重要的目錄是(i)記憶體內資訊與(ii)硬體資訊,因此這兩個目錄不佔硬碟空間?
#### ANS
/proc
/sys