2010年5月28日 星期五

檔案基本權限管理-自我筆記

檔案基本權限管理
指的權限一般我們是指針對檔案內容的存取能力,不是僅就檔案本身!
例如:使用者 a可以讀取/etc/passwd檔案內容,因此他便具備檔案內容的存取權限。

檔案基本權限檢視
linux ox中每個檔案都會擁有一個基本權限的記錄(指令ls –l):如圖
-rw-r--r--
1
root
root
4096
126 02:09
passwd
檔案屬性
連結數量
檔案擁有者
檔案擁有群組
檔案大小
時間戳記
檔案名稱
一個檔案的完整資訊中包含了七個欄位的資訊,只有其中的 檔案屬性、檔案擁有者、檔案擁有群組和權限有關聯(其它的不會影響設定與使用)

檔案屬性:是由10個字元共同組成,第一個字元表示檔案的類型,2~10稱為權限模式,9個字元又會每三個字元為一組。
檔案擁有者
通常會用英文字母u來代表檔案擁有者的權限欄位
檔案擁有群組
通常會用英文字母g來代表檔案擁有群組的權限欄位
其他使用者
通常會用英文字母o來代表其它使用者的權美欄位
R
讀取檔案內容的權限
顯示存放目錄內的檔案名稱
W
變更檔案內容的權限
目錄內進行新增、刪除、搬移、更名等檔案操作
X
執行檔案內容的權限
進入目錄內或檢式存放於目錄的檔案完整內容
  檔案類型         檔案擁有群組權限(g)
-  rw-  r--  r--
檔案擁有者權限(u) 其它使用者權限(o)
檔案擁有者:欄位中會顯示檔案的擁有者是誰,通常有二種情況下可以成為檔案的擁有者
            1.建立這檔案的使用者預設會成為檔案擁有者
            2.透過chown指令將使用者設定為檔案的擁有者
檔案擁有群組:欄位中會用來顯示檔案擁有群組帳號是誰,二種情況下
1.      建立這個檔案的使用者所使用的主要群組預設會成為檔案的擁有群組
2.      透過chgrp指偷將群組帳號設定為檔案的擁有群組

變更檔案權限
Chmod變更檔案的存取權限,有二種方法,數字類型改變檔案權限、符號類型改變檔案權限。
數字類型改變檔案權限:r=4 w=2 x=1
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
chmod [-R] xyz 檔案或目錄
選項與參數:
 xyz : 就是剛剛提到的數字類型的權限屬性,為 rwx 屬性數值的相加。
-R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都會變更


符號類型改變檔案權限
chmod
u
g
o
a
+(加入)
-(
除去)
=(
設定)
r
w
x
檔案或目錄
Chmod u=rwx,go=rx passwd

變更檔案擁有者權限:chown變更檔案擁有者、chgrp案有群組
chown [-R] 帳號名稱 檔案或目錄
chown [-R] 帳號名稱:群組名稱 檔案或目錄
選項與參數:
-R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案都變更

chgrp [-R] dirname/filename ...
選項與參數:
-R : 進行遞迴(recursive)的持續變更,亦即連同次目錄下的所有檔案、目錄
     都更新成為這個群組之意。常常用在變更某一目錄內所有的檔案之情況。








檔案特殊權限功能
特殊權限
檔案
目錄
說明
Setuid
1.      檔案擁有者需具備x的執行權限
2.      程式執行以檔案擁者決定

也稱suid,在os中,當使用者存取某檔案時,系統會判斷存取者是否符合流程中的權限需求,如符合便賦予,否則不賦予。
Setgid
1.      檔案擁有群組需具備x的執行權限
2.      程式執行以檔案擁群組決定
1.      目錄的檔案擁有群組需具備wx權限
2.      在目錄內新建立的檔案將會copy目錄的檔案擁有群組作為檔案的擁有群組
唯一支援檔案與目錄的權限設定,針對檔案的運作方式與功能與suid相同。只要將目錄的w權限開啟後便允許符合的使用者,所產生的檔案會以產生檔案的使用者設定權限。
stickybit

1.      目錄的其他使用者需具備wx權限
2.      只有結級使用者與檔案擁有者可在目錄內刪除檔案
針對目錄所存在的,允許所有user在目錄上產生新檔,但僅許檔案擁有者和超級使用者可以刪檔的權限。
特殊權限的開啟與關閉
u
g
o
欄位
{+-}
s
s
t
權限
Setuidchmod u+s vi(vi編輯器程式)
Setuid並非是將使用者切換到檔案擁有者的身分去執行程式檔案,而是讓使用者暫時具備有檔案擁有者的權限去執行程式檔案。

S
x權限欄位出現表該程式檔案沒有具備執行權限
s
x權限欄位出現表該程式檔案有具備執行權限

Setgidchmod g+ws 檔案名稱:在檔案擁有群組權限欄位會變更為rws
Sticky bitchmod o+t 目錄名稱:在其他使用者權限欄位中的x執行權變成t,僅對其他使用者有斷影響。
T
x權限欄位出現表該目錄沒有具備執行權限
t
x權限欄位出現表該目錄有具備執行權限


存取控制清單ALC的使用
權限管理機制(Access Control List,ALC):提供傳統的基本權限外,還開放更細部權限設定功能,可對單一使用者、單一檔案或目錄進行權限規範。
在每個檔案或目錄中如啟用了acl權限規則時,原先的ACL entry ownerother所配置的基本權限都是永久有效的,不受其它規則所影響
User class
指的是使統POSIX標準檔案的權限:例如ugo
Acces ACL
用來決定檔案或是目錄可以由哪個使用者帳號或是群組帳號進行存取。又稱為基本型ACL
Default ACL
針對目錄所進行的權限規範
語法:setfacl –d –m g:newgrp:rw 目錄名稱
ACL entry
組成ACL規則的最小單位,每一個檔案或是目錄的acl權限都是由ACL entry所組成的。
型態
格式
named user
user:lpi_yang:rw-
Named gropu
group:newgrp:r--
mask
mask::rwx
Owner
user::rw-
Onwer group
group::r-x
other
other::rwx
檔案或目錄增加mask ACL entry,則會影響原先檔案上的named usernamed groupowner group的有效權限變化。
ACL規則語法 :
{ugo}:{使用者、群組帳號、其它使用者的名稱}:設定的權限 檔名
getfacl:取得某個檔案/目錄的 ACL 設定項目;
setfacl:設定某個目錄/檔案的 ACL 規範。
setfacl [-bkRd] [{-m|-x} acl參數] 目標檔名
選項與參數:
-m :設定後續的 acl 參數給檔案使用,不可與 -x 合用;
-x :刪除後續的 acl 參數,不可與 -m 合用;
-b :移除所有的 ACL 設定參數;
-k :移除預設的 ACL 參數,關於所謂的『預設』參數於後續範例中介紹;
-R :遞迴設定 acl ,亦即包括次目錄都會被設定起來;
-d :設定『預設 acl 參數』的意思!只對目錄有效,在該目錄新建的資料會引用此預設值
# 1. 針對特定使用者的方式:
# 設定規範:『 u:[使用者帳號列表]:[rwx] 』,例如針對 vbird1 的權限規範 rx
[root@www ~]# touch acl_test1
[root@www ~]# ll acl_test1
-rw-r--r-- 1 root root 0 Feb 27 13:28 acl_test1
[root@www ~]# setfacl -m u:vbird1:rx acl_test1
[root@www ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 權限部分多了個 + ,且與原本的權限 (644) 看起來差異很大!但要如何查閱呢?

[root@www ~]# setfacl -m u::rwx acl_test1
[root@www ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Feb 27 13:28 acl_test1
# 無使用者列表,代表設定該檔案擁有者,所以上面顯示 root 的權限成為 rwx 了!
上述動作為最簡單的 ACL 設定,利用『 u:使用者:權限 』的方式來設定的啦!設定前請加上 -m 這個選項。 如果一個檔案設定了 ACL 參數後,他的權限部分就會多出一個 + 號了!但是此時你看到的權限與實際權限可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!
Getfacl:當你讀取檔案中所存放的acl設定則要透過getfacl來完成。
[root@www ~]# getfacl filename
選項與參數:
getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這裡就免去了選項的說明啊!
 
# 請列出剛剛我們設定的 acl_test1 的權限內容:
[root@www ~]# getfacl acl_test1
# file: acl_test1   <==說明檔名而已!
# owner: root       <==說明此檔案的擁有者,亦即 ll 看到的第三使用者欄位
# group: root       <==此檔案的所屬群組,亦即 ll 看到的第四群組欄位
user::rwx           <==使用者列表欄是空的,代表檔案擁有者的權限
user:vbird1:r-x     <==針對 vbird1 的權限設定為 rx ,與擁有者並不同!
group::r--          <==針對檔案群組的權限設定僅有 r 
mask::r-x           <==此檔案預設的有效權限 (mask)
other::r--          <==其他人擁有的權限囉!

# 2. 針對特定群組的方式:
# 設定規範:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權限規範 rx 
[root@www ~]# setfacl -m g:mygroup1:rx acl_test1
[root@www ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x  <==這裡就是新增的部分!多了這個群組的權限設定!
mask::r-x
other::r--
 
# 3. 針對有效權限(使用者或群組所設定的權限必須要存在於 mask 的權限設定範圍內才會生效,此即『有效權限 (effective permission))
mask 的設定方式:
# 設定規範:『 m:[rwx] 』,例如針對剛剛的檔案規範為僅有 r 
[root@www ~]# setfacl -m m:r acl_test1
[root@www ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x        #effective:r-- <==vbird1+mask均存在者,僅有 r 而已!
group::r--
group:mygroup1:r-x     #effective:r--
mask::r--
other::r--
 

檢視與設定檔案的隱藏屬性
------------- 13個隱藏屬性資訊未啟動
Lsattr
檢視隱藏屬性lsattr 檔案
Chattr
啟用對應的隱藏屬性 chattr 參數 檔案



2010年5月12日 星期三

linux homework3

1.設計一個名為mycal的script,使其可以接收三個數字參數,第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)
配合case命令,計算數字運算的結果,並將其結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,
提示出正確的執行方式。如果中間的運算子是/,而第三個參數是0,則顯示除數不可為0
將各個運算功能分別寫成函數。

$ ./mycal 12 + 3
result = 15
$

$ ./mycal 12 - 3
result = 9
$


$ ./mycal 12 \* 3   # 注意:*為特殊符號,需加一倒斜線輸入
result = 36
$

$ ./mycal 12 / 3
result = 4
$


#!/bin/sh


zmr()
{
  # x=` expr $1 $2 $3 `
  x=$(($1$2$3))
  echo result=$x
}


if [ $# -eq 3 ]
then
 case "$2" in
"+")
zmr $1 $2 $3
;;
"-")
zmr $1 $2 $3
;;
"*")
# zmr $1 $2 $3
c=` expr $1 \* $3 ` ; echo "result =$c"    
;;
"/")
if [ $3 -eq 0 ]
then 
echo "無法計算:除數不可為0 "
else
zmr $1 $2 $3
fi
;;
 esac
else
    echo "第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)"
fi


exit 0



2.設計一個名為manymaxmin的script,使其可以接收不固定的多個數字參數,顯示數字中最大的及最小的,如果都一樣大,則顯示都一樣大。

$ ./maxmin 12 18 9 32 24 13
max = 32
min = 9
$

$ ./maxmin 15 15 15 15 15 15
All Equal = 15
$



#!/bin/sh

aa=$1
qq=$1
for vv in $@
do
    # if [ $vv -gt $aa ]
    if ((vv>aa))
    then
 aa=$vv
    elif [ $vv -lt $qq ]
 then
qq=$vv        
     fi
done
if [ $aa -eq $qq ]
then
echo "All Equal = $aa"
else
echo "max=$aa"
echo "min=$qq"
fi
exit 0



3.設計一個名為createmyfiles的script,以迴圈配合touch指令,產生十個檔案,檔名分別為myprog1.c,myprog2.c,...,myprog10.c。


#!/bin/sh


for ((x=1;x<=10;x++))
do
   touch "myprog$x.c"
done


exit 0



4.設計一個名為lastfiles的script,顯示目前目錄中最近被修改的n個檔案檔名。

$ ./lastfiles 5
a1.txt
a3.txt
...共5個


#!/bin/sh


ls -t | head -5 | nl
# echo ".....共5個"


exit 0



5.設計一個名為mvfiles的script,可以將所有副檔名為.c檔案,
副檔名更名為.cpp,更名前後的副檔名均自命令列輸入。
並將更名的結果顯示出來。

$ ./mvfiles .c .cpp
renamed myprog1.c to myprog1.cpp
....
....
$

#!/bin/sh

for file in *$1
do
mv $file `basename $file $1`$2
echo "renamed $file to `basename $file $1`$2"
done

exit 0

linux homework2

1.設計一個名為addtwo的script,使其可以接收兩個數字參數,並將其相加後的結果顯示出來,如果參數個數不夠或太多,就不執行運算,而顯示一段訊息,提示出正確的執行方式必須給兩個參數。

$ ./addtwo 12 6
sum = 18
$

$ ./addtwo 12
Usage: ./addtwo number1 number2
$


#!/bin/sh
if [ -n "$3" ]
then
echo "Usage: ./addtwo number1 number2"
elif [ -z "$2" ]
then
echo "Usage: ./addtwo number1 number2"
else
echo "sum = `expr $1 + $2 `"
fi
exit 0



----
2.設計一個名為mycal的script,
使其可以接收三個數字參數,
第一、三個參數為數字,
第二個參數為運算子(+-*/其中之一)
以多層的if計算其結果,並將其結果顯示出來,
如果參數個數不夠或太多,就不執行運算,
而顯示一段訊息,
提示出正確的執行方式。
如果中間的運算子是/,而第三個參數是0,則顯示除數不可為0

$ ./mycal 12 + 3
result = 15
$

$ ./mycal 12 - 3
result = 9
$

$ ./mycal 12 \* 3   # 注意:*為特殊符號,需加一倒斜線輸入
result = 36
$

$ ./mycal 12 / 3
result = 4
$

$ ./mycal 12 / 0
無法計算:除數不可為0
$


#!/bin/sh


if [ $# -eq 3 ]
then
 case "$2" in
"+")
a=` expr $1 + $3 ` ; echo "result = $a"
;;
"-")
b=` expr $1 - $3 ` ; echo "result = $b"
;;
"*")
c=` expr $1 \* $3 ` ; echo "result =$c"  
;;
"/")
if [ $3 -eq 0 ]
then 
echo "無法計算:除數不可為0 "
else
d=` expr $1 / $3 ` ; echo "result = $d"
fi
;;
 esac
else
    echo "第一、三個參數為數字,第二個參數為運算子(+-*/其中之一)"
fi


exit 0



----
3.設計一個名為getmax的script,使其可以接收兩個數字參數,將較大的數顯示出來,如果都一樣大,則顯示都一樣大。

$ ./maxmin 18 15
max = 18
$

$ ./maxmin 15 15
Equals
$

#!/bin/sh

x=$1
y=$2


if [ $x -gt $y ]
then 
echo " max = $x "
else
if [ $x -lt $y ]
then
echo " max = $y "
else
echo "Equals"
fi
fi


exit 0


----
4.設計一個名為checkfile的script,使其可以接收一個檔案名稱作為參數,
若此名稱不是目前工作目錄的檔案或目錄,則顯示此名稱不存在,
如果是檔案,則顯示其檔案內容,如果是一目錄則顯示此目錄內的清單。

$ ./checkfile 名稱


#!/bin/sh


df=$1


if [ -e "$df" ]
then
if [ -f "$df" ]
then
cat $df
else
if [ -d "$df" ]
then
ls -l $df
else
echo "名稱不存在"
fi
fi
else
echo "名稱不存在"
fi


exit 0



----
5.設計一個名為newerfile的script,使其可以接收兩個檔案名稱作為參數,並將日期較新的檔案名稱顯示出來。

$ ./newerfile file1.txt file2.txt
file2.txt 較新


#!/bin/sh


if [ $1 -nt $2 ]
then
echo "$1 較新 "
else
echo "$2 較新"
fi


exit 0


----
6.設計一個名為avglen的script,
使其可以接收一個檔案名稱(文字檔)作為參數,
計算此檔平均每一列有多少bytes。
提示:使用wc -l < 檔名; 用man查一下wc的用法

$ ./avglen yang.txt
平均每列: 348 bytes


#1/bin/sh


avg=`expr $(wc -c < $1 ) / $(wc -l < $1)`
echo "平均每列: $avg bytes"




exit 0



----
7.設計一個名為createtodayfile的script,以touch指令產生一個檔案,檔名中含有今天的日期,例如myfile20090706.txt。
  date +%Y...., 其餘date的日期格式, 請以man指令查詢


#!/bin/sh


echo -n "輸入檔案名稱:"
read fname


touch ${fname}$(date +%Y%m%d)\.txt


exit 0



----
8.設計一個名為addfiles的script,
可自命令列讀取參數產生檔案allfile,
如下,每加入一個檔案,隔2秒,如果重覆執行,則覆蓋原檔案。

原始檔案:
$ cat filea.txt
aaaaa
$ cat fileb.txt
bbbbb
$ cat filec.txt
ccccc

執行程式:
$ ./addfiles allfile.txt filea.txt fileb.txt filec.txt

結果:
$ cat allfile.txt
--2009-09-08 16:25:33
aaaaa
--2009-09-08 16:25:35
bbbbb
--2009-09-08 16:25:37
ccccc


#!/bin/sh


af=$1
rm -f $af
touch $af
shift
for y in $@
do
date +--%F\ %T >> $af
cat $y >> $af
sleep 2
done
cat $af
exit 0

linux homework1

1.設計一個名為showme的script,藉由環境變數及一些Linux指令,使其可以顯示資訊如下:

$ showme
我是  <- login name
我的家在 <- home directory
我的家有下列這些東西:
<- ls home directory

我的殼是 <- shell name
這台電腦是 <- host name
我目前的工作目錄是 <- present woring directory
目前的工作目錄有下列這些東西:"
<- ls present woring directory
#!/bin/sh

echo 我是"$LOGNAME"
echo 我的家在"$HOME"
echo 我的家有下列這些東西
echo "$(ls $HOME)"
echo 我的殼是"$SHELL"
echo 這台電腦是"$HOSTNAME"
echo 我目前的工作目錄是`pwd`
echo 目前的工作目錄有下列這些東西
echo "$(ls)"
exit 0


----
2.設計一個名為verbvar的script,利用read輸入一個簡單的英文動詞,在其前加入一個to印出原形,字尾加ing印出作為進行式
,字尾加ed印出作為過去式。

$ ./verbvar
請輸一個動詞: work
原  形: to work
進行式: working
過去式: worked
#!/bin/sh
echo -n 請輸一個動詞:
read word
echo 原形:to $word
echo 進行式: ${word}ing
echo  ${word}ed
exit 0

2010年4月12日 星期一

緊張到手發斗MSLAB

這幾天為了準備上台報告
沒想到練習了二次 
還是一直都是忘記上台的台詞
但今天自已覺得有比較好了
感覺多上台幾次
就不會緊張了


到最後講完
一下台
心都快跳出來
手還不停的斗
超緊張的
加上自已真的是準備不夠
看來還有很大進步的空間
看來是信心還不夠多
要好好的加油

第一階段結束!
第二階段也要開始!

各位伙伴 大家一起努力加油!!爆肝.....................