跳到主要內容

Linux 操作不求人系列 - 參章之壹 - 系統管理(I) - 使用者帳號與工作管理

    本章開始,會利用 Linux 環境下,權限最大的帳號 root ,去做對系統內的使用者與其運行的工作做簡單的管理。要轉換到 root 身分,我們要在提示字元輸入 su - (substitute user) 或 
su -l su -l root (皆可,端看您懶惰的程度)。如此,才能轉換到 root 預設的環境 (bash / tcsh)下,並完全使用到 /sbin/ 內的指令,且直接是轉換到 /root,若只是使用 su,則僅使用輸入此指令的使用者帳號之環境,並路徑維持原狀,路徑環境變數亦無改變,如圖3-1。若要從 root 轉換至其他一般使用者帳號,則直接用指令 su -l newuser ,newuser 為要轉換的帳號,利用 root 帳號轉換其他使用者帳號,無須欲轉換的使用者輸入密碼,但若一般使用者要轉換其他使用者帳號,一樣要用 su -l 指令後面接欲轉換的帳號,且接著要輸入欲轉換帳號的使用者密碼。若是要登出 su 登入的帳號,則使用 鍵盤 Ctrl + d 鍵,便可登出現在帳號,若因為使用 su -l 轉換至太多帳號,而忘記現在是使用和帳號名稱,則可以使用指令 whoami ( Who am I ),印出結果為現在帳號名稱。






























(圖3-1)
   
     我們若只是要暫時使用 root 管理者權限,來執行 root 才可以使用的指令呢?那就使用指令 sudo ,就如同在 Ubuntu Linux 環境下,會讓第一個一般使用者,擁有 sudo 來執行 root 才能執行的指令,MS Windows下,則是利用滑鼠右鍵,點選以系統管理員身分執行。而在CentOS_x64 下,亦可以利用 vim 編輯 /etc/sudoers,或利用指令 visudo( visudo指令是在存檔時會檢查是否有設定錯誤,適合較不熟悉的操作者,/etc/sudoers 說明內容也建議此方法 ),就會開啟 /etc/sudoers檔案,但因筆者較喜歡彩色的( visudo 也可以用參數變更編輯器,如指令visudo後在內容加入 Defaults  editor=/usr/bin/vim,儲存後離開,下次再執行 visudo 就可改變,如圖3-2),故 su - 轉換 root 後,直接使用 vim /etc/sudeors 來講解( 圖3-3-1,圖3-3-2),之後的命令,因跟系統管理相關,故皆使用 root 權限來執行,而 root 權限又十分的大,故操作時,請小心再小心。本章請讀者要記得保持 root 權限,往後不再贅述。




























(圖3-2)







































(圖3-3-1)





























(圖3-3-2)

     圖3-3-1與圖3-3-2結合後,為完整的 /etc/sudoers 檔內容,在CentOS的設定檔內容,一般上面的說明行,是很重要的設定資訊,可能會包含解決參數名稱、SELinux 安全特性( https://en.wikipedia.org/wiki/Security-Enhanced_Linux ),所造成的設定問題,通常會寫在頭幾行說明(如架設SAMBA的設定檔內說明),而有些設定,則是刪去 # 符號,就可以設定完成。圖3-2-1的與圖3-2-2的 Defaults ,為設定 sudo 後的環境變數值,詳細請參閱 sudo 套件的操作說明(https://www.sudo.ws/man/1.8.15/sudoers.man.html ),筆者僅說明常用到的設定。如第11個指令,可知道 root 在 sudo 內設定,可以從任何的來源主機轉換(第一個 ALL),與轉換成任何使用者身分( )內的 ALL,為第二個 ALL,以及可使用所有指令,為第三個 ALL。此時,我們可以此類推,當我們要設定某使用者帳號,如 newuser,需要依靠 sudo,來暫時變成 root 的權限時,僅加上以下設定即可:
newuser    ALL=(ALL)      ALL      #  亦可參閱第11個參數設定上方的說明

     第12個指令為,若要讓整個 group 有 root 權限,則僅去除第12個指令的 # 符號就可以執行令群組 wheel,底下的各使用者,皆可以用 sudo 暫時取得 root 權限。而第13個指令為可進階調整成不需輸入自己的密碼,亦可以直接執行,這端看讀者的人性是不是需要設定。
     第14個指令為讓 users 群組內的使用者,皆可以使用掛載 ( mount ) 與卸載 ( umount )光碟機,在 Linux 下,舉凡IDE、SATA、SATA等內部傳輸介面的硬碟、光碟皆需經由掛載方式,才能使用。外接裝置SCSI,Fiber,USB,Thunderbolt,Ethernet,InfiniBand(https://en.wikipedia.org/wiki/InfiniBand) 等外部傳輸的外接裝置,亦需經由掛載後才能使用。掛載時,則使用 mount 指令,可選擇掛載可讀或寫及其他參數。退出時,一定要在使用 umount 指令,來卸載後才算安全移除。此 2 指令之後會在詳加說明。
     第15個指令為允許 users 群組內的使用者,亦可以使用 shutdown 關機命令,且僅允許在本機( localhost )才能使用,並使用的指令僅為 shutdown -h now ( -h 參數代表 halt 或 power off,若改成參數 -r 則代表 reboot,重開機,-c 則是 cancel,停止執行關機程序,-k 則僅送警告訊息與踢出已登入的使用者。而 now,則代表時間為現在,讀者亦可自行試試改成數字,單位為秒數。其他詳細說明可自行 man shutdown )。
以上修改完後,請如 vim 下操作,儲存後離開。這時候,利用帳號 newuser 來試試  root 才能做的新增使用者吧!(圖3-4)






















(圖3-4)
    圖3-4第1個指令,可以看出我們要用一般使用者 newuser 身分執行指令 adduser 來建立一個使用者帳號 secuser,結果就顯示如以下:
bash:   /usr/sbin/adduser:  Permission denied      /*  bash shell 下的訊息,提到要執行 /usr/sbin/adduser 這需要 root 權限的指令,出現權限不足而錯誤。 */
故,第2個指令就利用 sudo 來臨時轉換,如以下:
$ sudo adduser -d /home/secuser -g users secuser     /* adduser 已連結至指令 useradd, -d 為指定家目錄的路徑,-g (group)為指定群組名稱,若要加入很多群組,請改用 -G users, wheel,群組以 , 分隔,群組參數若無指定,則預設群組為與帳號名稱同 。若要用設初始密碼,可用參數 -p (password)後面接密碼,但因為直接輸入明碼是不安全的,故非常不建議,若要指定 shell ,可加上 -s 參數,通常都不需要,屆時讓使用者自己更動。最後加上要建立的使用者帳號名稱。若要刪除使用者帳號,可使用root權限,使用指令 userdel -rf secuser,其中 -r 參數代表 remove,-f 參數代表 force,但刪除前,請確認再確認。  */

為了安全性,在第3個指令便利用指令 passwd 來為帳號 secuser 變更或產生一組密碼,當然無 root 權限來執行亦出現錯誤,故當第4個指令輸入後,系統會要求要給一組新密碼,如之前我們產生 newuser 帳號一樣,密碼請自行斟酌難度,太簡單或是字典字,系統會警告您有安全性問題,它還是LP掐著,會讓您繼續執行變更成功的。
接下來,我們就直接利用 su - 將身分換成 root,以便繼續進行管理使用者與使用者工作。然後利用指令 who 來看看有誰登入到機器(圖3-5),也可以使用指令 w,先獲得登入使用者資訊。若要修改使用者的預設家目錄、群組或預設shell,可用root權限來使用以下指令:
$  usermod -g  newgroup -d /var/www/html/myweb  -s /bin/tcsh  newuser
/*  利用參數 -g 把 newuser 改成 預設 newgroup 群組,參數 -d 登入家目錄改為 /var/www/html/myweb 的路徑,參數 -s 預設 shell 改為 tcsh  */
若要更改帳號名稱,則使用指令 usermod -l
$ usermod  -l  mynewuser  newuser    # 將 newuser 帳號名稱改為 mynewuser
其他更改使用者預設值的方法,可以使用指令 man usermod 來查詢。





























(圖3-5)

     圖3-5第1個指令為 who -aH,其中參數 -a (all),為顯示所有資訊,參數-H (Headline),為顯示每個欄位的標題。因為 -a 可以列印出系統開機時間,與執行層級(run-level),常用之層級為,層級1為單人登入模式(Single User Mode)之文字介面,層級3為可多人登入模式( Full Multi User Mode )之文字介面,層級5為可多人登入模式之圖形化介面。其他層級的作用,詳細可參考https://en.wikipedia.org/wiki/Runlevel。而調整初始登入層級設定,可用vim編輯/etc/inittab,如圖3-6。僅把圖3-6最後一行 id:5:initdefault: 的 5 改成 3 或 或如圖內的檔案內容說明之數字,儲存後離開,就可再下次重開機時,換成該登入層級。若要臨時換層級,可利用指令
$ telinit  [0-6]    /*  [0-6]表示可 telinit 0 關機,或是可到 telinit 6 重啟動,亦可 telinit s telinit 1 進入單人登入的修復模式,亦可使用指令 init ,跳轉登入層級模式  */,除此之外,您亦可以使用指令

$ runlevel 來顯示現在所在的 run level

     第2指令 tty 為列出現在所在的 Terminal 視窗號碼為 pts/4,以防止下一個指令 pkill 將自己的 Terminal 視窗刪除。從 who -aH 顯示的內容之 LINE 欄位與 PID 欄位來看,tty1,代表著Ctrl+Alt+F[1-6] ( LINE為 tty,前章有說明 )的其中以GUI登入的視窗,之登入帳號為 newuser,其他每個等待登入的 tty,若無帳號登入,則顯示NAME欄位顯示 LOGIN。登入GNOME後,再開啟的 Terminal視窗,其LINE名稱為 pts,依開啟的順序為 0,1,2,...。故踢除使用者 newuser 第5個Termianl視窗指令如下:
$ pkill -kill -t pts/5   # 指令 pkill 傳遞 -kill 方法,至 - t  (terminal) 5 號視窗

再利用 who -luH , -l (login process)與 -u 參數,為列出每一位使用者的登入LINE、停工時間(idle time)與工作的序號(process id),就可以看到登入 pts/5 的使用者已經不見了。
























(圖3-6)

     除了暫踢除使用者登入的方法,我們亦可以使用前章所講解過,可以使用指令 kill,去強制停止在系統內正進行的工作,或是殭屍程序( zombie ),亦可以利用指令 top 。如圖3-7






































(圖3-7)
     圖3-7上方第1行為系統時間與已開機時間(up),幾位登入的 user (含所有 Terminal視窗),與系統平均負載(Load average),分別為每1、5、15分鐘的平均附載。第2行為系統工作狀態,有156個程序,1個在執行,155個在待命,0個被停止,0個殭屍程序。第3行為中央處理器(以下簡稱 CPU)的使用情形,us 為使用者使用的百分比,sy 為系統核心使用的百分比,ni 為提高優先執行所占用的百分比,id 為閒置的的百分比,wa 為I/O(Input/Output)等待時間所占用的百分比,hi si為硬體與軟體中斷(請參閱 https://en.wikipedia.org/wiki/Interrupt )所占用的百分比。stcpu steal time 的百分比(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-KVM_guest_timing_management-Steal_time_accounting.html)。
第4行與第5行,分別為實體記憶體 ( 以下簡稱 Memory) 與虛擬記憶體 (SWAP,安裝系統時設定過),的使用率。再來便是 top 的命列列,可在黑色游標處輸入鍵盤指令,如輸入 1,可將所有 CPU 的核心 (cores) 列出,輸入 h ,可以查詢鍵盤指令。輸入 k,為用來刪除,圖3-7下方所列出的所有工作之一的 PID。輸入 q,便可以跳出 top 的監控介面。其他 top 的參數應用,有興趣的讀者,可參考http://man7.org/linux/man-pages/man1/top.1.html,更多top的操作方式,亦可參考 http://linoxide.com/linux-command/linux-top-command-examples-screenshots/。
     除此之外,我們亦可應用之前說明過的指令 ps,加上 grep 找出所要刪除的程序之PID,如下例 (圖3-8右):
$ ps -ef | grep 'top'   # 用 ps 將擁有 top 字串的行,皆列出來。第二欄位為 PID

$ kill -9 11764           /* 用 kill 強制剔除一個 PID,此例為剔除 top 的PID,送出的訊號參數亦可先使用 -15,不成功再使用 -9 。 若要一次刪除很多相關的程序,可使用如 killall -9 top  */

或亦可利用指令 pstree -ph 來列出工作程序名稱的樹狀關係與PID,並將現在帳號正使用的 terminal 內操作的工作,作顯著顯示 。


















(圖3-8)

     最後,我們要考慮一些使用者的例外錯誤問題。例如,若使用者的家目錄內資料太大,而把機器的總硬碟容量塞爆,造成系統不穩,因而影響其他使用者,便可利用指令 edquota (限定 ext 檔案系統下),來編輯每位使用者可使用的最大容量。首先,必須要修改掛載的裝置設定檔 /etc/fstab,將 /home 掛載選項改為 defaults, usrquota, grpquota (圖3-9),開啟使用者與群組可以設定磁碟配額的能力,並儲存後離開,令檔案系統使用 disk quota 的管理程式。


























(圖3-9)

     接著如圖3-10第1個指令,cat /etc/mtab,將所有本機掛載的磁碟項目列出,可以看到 /home 掛載  /dev/sda3 目錄的權限是 rw (可讀寫),此時我們利用第2個指令 mount -o remount /dev/sda3  /home ,使 /home 不須經重開機,便可重新掛載相同磁碟分割處。再來利用第3個指令使用 quotacheck -m /home  /* 亦可加上參數 -ug,代表同時產生 user 與 group 的 quota 檔  */,來強制在 /home 目錄下產生 aquota.user 的磁碟配額設定檔。如第4指令,可以看見在 /home 內,出現 quota.user 檔案,此時可以利用指令 edquota -u  newuser 來對使用者 newuser 建立個別的磁碟配額額度了。(圖3-13)
























(圖3-12)












(圖3-13)

     圖3-13之編輯介面為 vi ,故操作方式同 vim。我們在內容上,只需更改 soft 跟 hard 的值,如黃框處,預設值 0 為無限制,inodes 後的 soft 與 hard 表示可存的最大檔案數,在此不設限。soft 與 hard 值的單位為 KB,通常 soft 的配額限制可以超過,但會警告並給予緩衝,若是 hard 的配額限制,則無法讓使用者有緩衝的空間,額度若用完,則禁止存取,故我們可以將 hard 設為磁碟分割總容量的 95%,以保持磁碟的健康狀況。而 soft ,可設為磁碟分割總容量的 90% 。故筆者的分割總容量為 2G,故 soft 設為 1800000 而 hard 便設為 1900000 ,設定完後在儲存後離開即可。接著我們利用指令 quota -u newuser,就會列出使用者帳號 newuser,所使用的磁碟額度值為何。若要暫關閉 quota 功能,可利用指令 quotaoff -a (參數a代表/etc/mtab檔案內全部磁碟 ),若要再開啟,則利用指令 quotaon -a,一樣開啟 /etc/mtab 檔案內,掛載參數有設定 usrquota, grpquota 的磁碟之配額功能。
     最後再補充說明,Linux內的使用者的屬性與加密過的密碼、參數分別放於 /etc/passwd 與 /etc/shadow (詳情可見網頁http://www.tldp.org/LDP/lame/LAME/linux-admin-made-easy/shadow-file-formats.html),而群組的屬性與參數,分別放於 /etc/group 與 /etc/gshadow,內容皆為以 : 分隔的欄位式資料。故一般使用者可使用如下 cut 指令:
$ sudo cat /etc/passwd | cut -d : -f 1,3,4,6,7   /* 僅印出第1、3、4、6、7欄,分別表示所有的使用者名稱、 UID 、GID、使用者家目錄、使用者 Shell 種類。除此之外,利用 useradd 產生新使用者的預設參數值,為來自設定檔案 /etc/default/useradd/etc/skel  的設定*/
-----------------------------------------

    下一節,筆者要介紹新增硬體的部分,例如隨身碟,外接硬碟,網路卡,顯示卡,不斷電系統(UPS)等硬體設備。當然,有些卡與隨身碟,在 X Window 圖形介面( GNOME or KDE )下,是可直接隨插即用(Plug and Play,PnP,https://en.wikipedia.org/wiki/Plug_and_play )。但是,如果是新顯示卡沒有驅動好,又怎麼會有 X Winodw 可用呢?故筆者建議,還是需要學習直接利用文字介面操作 Linux 系統,以確保 X window manager 突然出現問題,而無法將我們的視窗操作,下達正確指令給系統,造成的執行結果的不確定性錯誤。



If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re