跳到主要內容

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 ,跳轉登入層級模式  */

     第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操作不求人 - 伍章之伍 - make 巨集式編譯器

make是Linux下安裝軟體與程式一個相當重要的工具,如前章節所提的安裝軟體三劍客。 configure, make , make install。當我們完成自己所撰寫的C 或 fortran程式,通常會使用編譯器指令 gcc -cgfortran -c 來編譯成連結檔或物件檔函式庫(Library),如 .a (https://en.wikipedia.org/wiki/Static_library) .o .so等附檔名,而此函式庫又可以讓其他程式利用其中的函式與類別。何時要用到動態或靜態函式庫,stackoverflow有專業的回答(https://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries)。

假設我們要寫一個簡單的 C 程式,檔名為 hellomake.c,用 make 來編譯我們的程式,程式如下:
#include<stdio.h>
void main ( void )
{
   print ("This is my first c file."\n);
}

---------------------------------------------------
儲存離開後,利用autoscan 指令,便會產生如圖5-70的兩個檔 autoscan.log 與 configure.scan,而 configure.scan 便是需要產生標準的 GNU makefile 的關鍵檔。我們可以把他改成 configure.in 或 configure.ac,並利用 vim configure 來修改參數,如圖5-71,改為圖5-71右邊的參數











(圖5-70)





(圖5-71)


修改完 configure.in 內的參數後,再執行 aclocal 與 autoconf ,就會產生 autom4te.cache 的資料夾與 configure 的執行檔,此執行檔就是先前章節所要編譯原始碼前,會執行的 ./configure ,並會產生適合您的機器環境之 GNU Makefile,如圖5-72


(圖5-72)
接著編輯 Makefile.am 檔的內容,加入如下內容
AUTOMAKE_OPTION=foreign b…

Linux操作不求人 - 肆章之貳 - 伺服器架設(II) - 郵件伺服器 - postfix 與 dovecot

CentOS6_x64 在預設狀態下,通常已經有開啟發 email 的伺服器軟體 postfix,但僅限制在本機(localhost / 127.0.0.1 ) 使用,且僅是讓系統可以傳送錯誤訊息給 root。故我們要經由設定,讓電腦主機內的使用者帳號,皆可以收發 email,而我們用的送信軟體為 postfix,負責 smtp 的部分( https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol ) ,收信軟體則為 dovecot,負責 pop 或 imap ( https://en.wikipedia.org/wiki/Post_Office_Protocol,https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol )的部分,收發信機制的運作機制,可參考wikipedia,https://en.wikipedia.org/wiki/Email,筆者不再贅述,直接說明架設伺服器軟體的操作。先利用 rpm -qa | grep postfix 與 rpm -qa | grep dovecot 來查詢是否已經有安裝,若無,則利用 yum install postfix 與 yum install dovecot 來安裝。除此之外,再利用 chkconfig | grep postfix 與  chkconfig | grep dovecot 來確認是否有在開機時啟動,若想自動化開機啟動,再請設定 chkconfig --level 235 postfix on 與  chkconfig  --level 235 dovecot on 來載入。 如圖4-10與圖4-11:
































(圖4-10)
















(圖4-11)

     接著我們利用 vim 來修改 postfix 設定檔  /etc/postfix/main.cf 。相同地,我們先閱讀設定檔內容前面的說明,postfix 的作者相當細心,每個設定前的說明很詳細,故設定檔很長,請讀者要有耐心閱讀,如圖4-12-1 至 圖4-12-7。往後篇章若設定檔內容太長,筆者便不再列出,會直接說明新增與修改處,在此先說明。




























































































(圖4-12-1)




























































































(圖4-12-2)





























































































(圖4-12-3)





























































































(圖4-12-4…

Linux 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

本章開始進入Shell Scripts的程式設計,因為Linux Shell的種類相當多,故筆者僅挑選預設的Bash Shell 及 學術界常會使用的 C Shell (/bin/tcsh )來說明與對照,在此先說明。至於 Scripts 的概念,在前章就已經說明過,可視為前壹章的各項指令之組合,在令其在執行檔案裡,依序執行,如前章所看到的 /etc/profile 檔案,在其他軟體上,有點類似巨集(macro)的執行檔,或是MS Windows的批次檔(Batch)。先建立此概念後,我們可以先在Terminal的命令提示字元,使用 for 指令,如圖2-1,在 shell scripts 內為了重複做一件事,而僅修改某些變數值,我們會利用所謂的迴圈(loop)方式來完成,而 bash shell 內常用的是 for 或是 tcsh/csh shell 內的 foreach



























(圖2-1)


     圖 2-1第一個指令輸入 for 的宣告,後面接著 seq 為變數名稱,為了逐次接收 in 後面之陣列值(http://www.gnu.org/software/bash/manual/html_node/Arrays.html)(註:若加了 ; 則 do 便可寫在同一行),接著 > 的提示字元的等待輸入,便是還沒遇到 done 指令來結束 do 的動作,控制此提示字元的環境變數為 PS2。,此例的 seq 值,依序為第一次讀入 first 字串並存入變數 seq 當其值,接著second、third,從 echo $seq 可以看出,接著設定一個變數 file 其值為 my開頭字串,緊接變數值 $seq(first、second、third),再接固定的 script.sh 字串,接著利用echo指令,印出變數值$file,檢查是不是我們預期的字串值(註:如果想要暫停,讓使用者可以看清楚再繼續,可以加上指令sleep 3,表示畫面停止三秒鐘),接著利用 touch 指令產生 $file 字串值的檔案,再將其利用 chmod 指令,u+x 參數為令僅創立此檔的使用者帳號可執行(若要改為同群組可執行,參數需改為 g+x)。故可看到第二個指令輸入 ls,便列出自動批次產生的shell執行檔了。
     以上其實就是 Shell Script 的程式設計之…