2007年12月23日 星期日

檔案權限

存取控制 文章可知,stat 指令可知道檔案的相關資訊,在存取的部分,你可以看到一行如 Access: (0644/-rw-r--r--) 的資訊,其中 -rw-r--r-- 在 存取控制 中就說明了,而 0644 呢?就是本篇的主角之一。

位元模式

在 Linux 中以 chmod 工具來修改檔案權限。但是使用 chmod 時需要一套簡單的表示法來描述檔案權限,而能表示檔案權限的表示法有兩種,分別為位元模式與存取模式。
-rw-r--r-- 用後九個符號來表示檔案存取,而事實上位元模式的位元有 12 個(其中 3個為特殊權限),若直接用二進位來表達過於冗長且容易搞錯。最理想的方式為八進位,因為每三個八位元的數字剛好能表示 12-bits 位元模式分成 4 組不同意義的組合,而下表即各個進位轉換的對照表:

符號 二進位 八進位
--- 000 0
--x 001 1
-w- 010 2
-wx
011
3
r--
100
4
r-x
101
5
rw-
110
6
rwx
111
7
範例:
rw-r--r--
110100100
644

rwxrwxr-x
111111101
775
字串模式

以八進位表示雖然簡潔,但不容易解讀。因此許多工具會以字串模式來表事檔案權限,如之前常提的 ls -l 的輸出訊息,但 ls -l 只顯示 r、w、x 、特殊權限等符號,不包括身分 (u、g、o) 與操作 (-、+,=) 符號,下表即說明字串模式的各個符號:


符號 說明
身分 u
擁有者 (user)

g 群組

o 其他人

a
所有人
操作
-
移除
r-x
+
添加
rw-
=
設定
權限
r
讀取

w
寫入

x
執行

s
SUID 或 SGID (s 代表同擁有 x 權限,S 則無)

t
Sticky 權限 (t 代表同擁有 x 權限,T 則無)

範例
u+x 讓使用者有執行權限
go-w 移除群組與其他人的寫入權限
o+t 將其他人設定 Sticky 權限
a=rw 所有人都為讀取與寫入權限
我們會用 chmod 來調整檔案或目錄的存取模式,就會大量的用到字串模式的表示法,以下為範例:
範例一:用字串模式將檔案存取權限設定為 rw-r--r--,並顯示操作結果。
bang@linuxdiary:~$ chmod -v u=rw,go=r chmod_test1
mode of `chmod_test1' retained as 0644 (rw-r--r--)
範例二:讓其它使用者無法存取整個 Desktop 目錄,並顯示操作結果。
bang@linuxdiary:~$ chmod -vR o-rwx Desktop
mode of `Desktop' retained as 0750 (rwxr-x---)
mode of `Desktop/abc.txt' changed to 0640 (rw-r-----)
範例三:將 Desktop 目錄設定 SGID,並顯示操作結果。
bang@linuxdiary:~$ chmod -v g+s Desktop
mode of `Desktop' changed to 2750 (rwxr-s---)
範例四:將 Desktop 目錄設定 Stickey 權限,並顯示操作結果。
bang@linuxdiary:~$ chmod -v +t Desktop
mode of `Desktop' changed to 3750 (rwxr-s--T)

預設存取模式

當使用者新增一個檔案或目錄時,系統會根據 umask 設定值,來決定這個檔案或目錄的存取權限,而甚麼是 umask 設定值呢?這是一個設定預設存取權限的命令 umask ,以下為範例

查詢目前的
bang@linuxdiary:~$ umask
0022
新增一個檔案,並檢查預設存取權限
bang@linuxdiary:~$ touch umask_test1
bang@linuxdiary:~$ ls -l umask_test1
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
更改目前的預設權限
bang@linuxdiary:~$ umask 002
bang@linuxdiary:~$ touch umask_test2
bang@linuxdiary:~$ ls -l umask_test
-rw-r--r-- 1 bang bang 0 Dec 24 00:18 umask_test1
-rw-rw-r-- 1 bang bang 0 Dec 24 23:46 umask_test2
我們可以發現 umask 前後,新增檔案的存取權限是相異的。
注意
  • 通常系統預設的 umask 設定,會在 /etc 目錄下的 profile (debian)或 bashrc (red hat)中。這點好像不太重要,因為可以放的地方還蠻多的,FHS 也沒硬性規定一定要放哪,只是喚起對這兩個 shell 設定檔的記憶。
  • 在 red hat 中,一般用戶的 umask 為 0002,而 root 為 0022;debian 皆為 0022,故這邊的範例是以 debian 為例喔,我是用一般用戶 touch 一個檔案。

2007年12月17日 星期一

GRUB 的安裝與設定

GRUB (Grand Unified Bootloader) 是一個多段式開機管理程式,由它的名稱 GR,就可猜想,它支援多種檔案系統和作業系統,幾乎可以啟動任何核心。

GRUB 的裝置命名方式

之前曾經提過 Linux 裝置的命名方式 文章,而本文主要是在探討 GRUB 在用的命名方式。

GRUB 的命名方式: ( xdn[,m] )

其中 xd 代表磁碟類型,n 是『BIOS 的磁碟編號順序』從 0 開始,m 是第幾個分割區,從 0 開始。
範例:
(fd0) :第一台軟碟機。
(hd0):第一顆硬碟。
(hd0,1):第一顆硬碟上的第二個分割區。
注意:
  • 在 GRUB 之中,hd 即代表各種硬碟,無規格區分,IDE ,SATA,SCSI 硬碟都以 hd 表示。
  • GRUB 的分割區編號由 0 開始,而一般裝命名由 1 開始,如第二顆硬碟的第二個分割區 GRUB 為 (hd1,1),一般為 hdb2
GRUB 裝置檔的設定

裝置檔位置
redhat:/etc/grub.conf,/boot/grub/menu.lst,/boot/grub/grub.conf (真實檔案位置)
debian: /boot/grub/menu.lst

舉以下例子 (fedora 3) 說明:

default=1 #預設以哪一個選項開機,起始為 0
timeout=5 #暫停時間 (單位:秒)
splashimage=(hd0,0)/grub/splash.xpm.gz #背景圖片
hiddenmenu #是否隱藏選單
#以下為開機選項
title Fedora Core (2.6.12-1.1381_FC3) #標題
root (hd0,0) #開機目錄所在位置
kernel /vmlinuz-2.6.12-1.1381_FC3 ro root=/dev/VolGroup00/LogVol00 rhgb quiet #核心映像檔
initrd /initrd-2.6.12-1.1381_FC3.img #initrd 映像檔
title Fedora Core (2.6.12-1.1381_FC3smp)
root (hd0,0)
kernel /vmlinuz-2.6.12-1.1381_FC3smp ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.12-1.1381_FC3smp.img

2007年12月12日 星期三

存取控制

「存取控制」的作用就是,讓適當身分的人獲得適當的存取權。
何謂身分?在 Linux/Unix 系統中,定義以下三種關係。
  • Owner 擁有者:檔案的擁有者,通常是產生檔案的那個人。
  • Group 群組:檔案所屬的群組。通常是擁有者所屬的群組。
  • Other 其他人:既非擁有者,也不是群組成員的其他人。
所謂的「存取權」,是指使用者可以對檔案進行何種動作。在 Linux/Unix 系統中,定義以下
三種動作:讀 (read),寫 (write),執行 (execute)。對於目錄,同樣也有三種動作:列出檔案,新增檔案,進入目錄。以下為權限列表:

權限 符號 檔案權限說明 目錄權限說明
讀取 (Read)
r 檢視檔案內容 列出目錄內容
寫入 (Write) w 寫入(或變更)檔案 建立,移除目錄下的檔案
執行 (Execute) x 將檔案當成程式執行 進入 (cd ) 到目錄

我們可以用 ls -l 或 stat FileName | Directory 來顯示目錄或檔案的權限資訊,以下為例子
bang@linuxdiary:~$ ls -l
drwxr-xr-x 2 bang bang 4096 2007-05-20 13:51 Desktop
bang@linuxdiary:~$ stat Desktop/
File: `Desktop/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 301h/769d Inode: 10666042 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 1000/ bang) Gid: ( 1000/ bang)
Access: 2007-12-23 07:35:21.000000000 +0800
Modify: 2007-05-20 13:51:01.000000000 +0800
Change: 2007-05-20 13:51:01.000000000 +0800

目錄內容 文章中,即簡介了 rwxr-xr-x 的意義,但在這邊要注意的是 Desktop 在此為目錄,以身分為其他人為例 r-x 的意義為,其他使用者 對於 Desktop 可用 ls 列出目錄,不能新增刪除檔案,可以 cd 進入目錄。

2007年12月10日 星期一

Cron Job 排程工作

設定系統的工作排程,主要是修改 /etc/crontab,當我們檢視 /etc/crontab 時,我們可以看到以下程式碼
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 1 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
由這段程式碼我們可窺見程式碼中每個數字的意義
crontab 檔案的格式為一行中有5個數字,以空白鍵或tab鍵分開。這五個數字指定命令執行的時間:

01 * * * * root run-parts /etc/cron.hourly
角色 排程工作

代表意義 分鐘 小時 日期 月份
數字範圍 0-59 0-23 1-31 1-12 0-7
0,7皆可代表週日

範例:
  • 01 * * * * => 每個鐘頭的 01 分
  • 02 4 * * * => 每天的 4 點 02 分
  • 22 1 * * 0 => 每個週日的 1 點 22 分
  • 42 4 1 * * => 每月 1 號的 4 點 42 分
進階寫法
  • 0 3,6 * * * => 每天 3 點與 6 點
  • 20 8-12 * * * => 每天 8 點到 12 點之間的每個小時的 20 分
  • */5 * * * * =>每五分鐘進行一次,用 * 與 /n 來搭配代表每隔 n 單位間隔
排程工作的指令
crontab 可讓使用者建立自己的排程工作,而 root 也可利用 crontab 管理修改其他用戶的排程。
crontab -e:建立,編輯使用者的工作排程。
crontab -l:列出使用者的工作排程。
crontab -r:清空使用者的工作排程。
注意事項:
  • crontab -e 命令會在/var/spool/cron/crontabs目錄下建立一個與您的使用者名稱同名的檔案。
    此檔案中的命令會在特定時間間隔於用戶的起始目錄中執行。
  • 當crontab 命令錯誤時,會發一封郵件給管理者,可藉由編輯 /etc/crontab 中的 MAILTO,來指定寄件信箱。

2007年12月1日 星期六

忘記 root 密碼怎麼辦

root 密碼若忘記,該台主機幾乎無法再做任何重大變動,這種情形容易發生在 MIS 交接的時候,如果真的發生怎麼辦呢?在系統啟動文章有提到 GRUB 在啟動顯示開機選單時,可修改核心命令,那時我們可以將系統啟動為 runlevel 1 的狀態,即單用戶模式,此時 root 的登入是不需要密碼的,再用 passwd 修改 root 密碼。

以下用 Fedora 8 為例示範整個流程:
1.首先開機後進入 GRUB 選單,在你欲開機的核心上點擊按鍵 e

2.在核心命令列上點擊按鍵 e


3.在該行命列最後加上 1 或 s 或 S,修改完後按 Enter


4.點擊按鍵 b,立即開機。

5.以下即為 runlevel 1 時的畫面,可用 passwd 修改 root 密碼。