特殊權限及文件系統訪問控制列表筆記及習題答案

特殊權限

passwd:s


SUID  : 運行某程序時,相應進程的屬主是程序文件自身的屬主,而不是啓動者

chmod u+s FILE

chmod u-s FILE

如果FILE本身原有執行權限,則SUID顯示爲s;否則顯示S

SGID  : 運行某程序時,相應進程的屬組是程序文件自身的屬主,而不是啓動者所屬的基本組

chmod g+s FILE

chmod g-s FILE

Sticky:  在一個公共目錄,每個人都可以創建文件,刪除自己的文件, 但不能刪除別人的文件

chmod o+t DIR

chmod o-t DIR  通常是對目錄而言

分別代表: SUID SGID Sticky

000   0  0        0

001         0     0        1 

010         0     1        0

011

100

101

110

111



chmod 1755 /backup/test 代表 有sticky位

chmod 2755 /backup/test 代表 SUID  & Sticky


練習:

創建一個目錄/tmp/project,保證 三個用戶 hadoop, hive, richie 能同是編輯該目錄上的所有文檔,但是隻能刪除自己的文檔

1. 創建公共組developteam

2. 創建用戶,將用戶的附加組加入developteam

3. 把/tmp/project目錄的屬組改成公共組developteam : chown -R /tmp/project /tmp/project

4. 把/tmp/project目錄賦予sticky權限: chmod o+t /tmp/project

文件訪問控制列表(facl)


FACL: Filesystem Access Control List


利用文件擴展屬性保存額外的訪問控制權限


setfacl 

-m 設定       # -u: -g 則是爲某目錄創建默認的特殊文件訪問控制列表

u:UID:perm

eg: setfacl -m:mygroup:rw FILENAME(GROUPNAME)

g:GID:perm

-x 取消


getfacl


練習:

每個五秒鐘,就來查看hadoop用戶是否已經登陸,如登陸,顯示其已經登陸,並推出

sleep


幾個命令:

w 比who的信息更詳細

who

last: 顯示/var/log/wtmp文件, 顯示用戶登陸歷史及系統重啓信息

-n # 顯示最近#n的相關信息

lastb: 顯示用戶錯誤的登陸嘗試,是 /var/log/btmp文件的信息

-n # 顯示最近#n的相關信息

lastlog:  顯示每一個用戶最近一次的成功登陸信息

-u USERNAME 顯示特定用戶的最近一次成功登陸信息

basename

$0: 執行腳本時的腳本路徑及名稱

mail  收發郵件

eg: mail -s "how are you " root < etc/fstab

hostname 顯示主機名

如果當前主機的主機名不是www.richie.com,就該其爲www.richie.com

如果當前主機的主機名是localhost,就將其改爲www.richie.com

如果當前主機的主機名爲空, 或者爲(none),或者爲localhost,就將其改爲www.richie.com

答案: [ -z `hostname` ]|| [ `hostname` == '(none)' -o `hostname` == 'localhost' ] &&  hostname www.richie.com


生成隨機數

RANDOM: 0-32768


隨機數生成器: 熵池取值

/dev/random    熵池空後,會用戶阻塞進程,等待用戶輸入更多隨機數

/dev/urandom  熵池空後,會模擬生成隨機數填滿熵池

寫一個腳本: 利用RANDOM生成10個隨機數,並找出其中的最大值和最小值

#!/bin/bash

#

declare -i max=0

declare -i min=0

declare -i current=0

for I in {1..10};do

  current=$RANDOM

  if [ $I -lt 10 ];then

    echo -n "$current,"

  else

    echo -n $current

  fi 

 [ $I = 1 ] && min=$current

  if [ $max -lt $current ];then

    max=$current

  fi 

  if [ $min -gt $current ];then

    min=$current

  fi

done

echo -e " \nMAX: $max"

echo "MIN: $min"

面向過程

控制結構

順序結構

選擇結構

循環結構

選擇結構:

if: 單分支、雙分支、多分支

if CONDITION;then

statement

fi


if CONDITION;then

statment

...

else

statement

...

fi


if CONDITION1;then

statment

...

elif CONDITION2

statement

...

else 



case語句: 選擇結構


case SWITCH(要引用變量的值) in

value1)

statement

...

;;

value2)

statement

...

;;

*)

statement

...

;;

esac



只接受參數start,stop,restart,status其中之一


寫一個腳本, 可以接受選項及參數,而後能獲取每一個選項,及選項的參數: 並能根據選項及參數做出特定的操作,比如:

adminusers.sh --add tom,jerry --del tom,biair -v|--verbose


#!/bin/bash

#

DEBUG=0

ADD=0

DEL=0


for I in `seq 0 $#`; do

  if [ $# -gt 0 ]; then

 case $1 in

 -v|--verbose)

DEBUG=1

shift ;;

 -h|--help)

echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"

exit 0

;;

 --add)

ADD=1

ADDUSERS=$2

shift 2

;;

 --del)

DEL=1

DELUSERS=$2

shift 2

;;

 *)

echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"

exit 7

;;

    esac

  fi

done


if [ $ADD -eq 1 ]; then

  for USER in `echo $ADDUSERS | sed 's@,@ @g'`; do

    if id $USER &> /dev/null; then

      [ $DEBUG -eq 1 ] && echo "$USER exists."

    else

      useradd $USER

      [ $DEBUG -eq 1 ] && echo "Add user $USER finished."

    fi

  done

fi


if [ $DEL -eq 1 ]; then

  for USER in `echo $DELUSERS | sed 's@,@ @g'`; do

    if id $USER &> /dev/null; then

      userdel -r $USER

      [ $DEBUG -eq 1 ] && echo "Delete $USER finished."

    else

      [ $DEBUG -eq 1 ] && echo "$USER not exist."

    fi

  done

fi



練習:

寫一個腳本showlogged.sh,其用法格式爲:

show

logged.sh -v -c -h |--help

其中,-h選項只能單獨使用,用於顯示幫助信息:-c選項時,顯示當前系統上登陸的所有用戶:如果同時使用了-v選項,則即顯示同時登陸額用戶數,又顯示登陸的用戶的相關信息:如

Logged users:4


They are:

root tty2 Feb 18.02:41

root pts/1 Mar 8 08:36 (172.16.100.177) 

#!/bin/bash

#

declare -i SHOWNUM=0

declare -i SHOWUSERS=0


for I in `seq 1 $#`; do

  if [ $# -gt 0 ]; then

    case $1 in

    -h|--help)

      echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"

      exit 0 ;;

    -v|--verbose)

      let SHOWUSERS=1

      shift ;;

    -c|--count)

      let SHOWNUM=1

      shift ;;

    *)

      echo "Usage: `basename $0` -h|--help -c|--count -v|--verbose"

      exit 8 ;;

    esac

  fi

done


if [ $SHOWNUM -eq 1 ]; then

  echo "Logged users: `who | wc -l`."

  if [ $SHOWUSERS -eq 1 ]; then

    echo "They are:"

    who

  fi

fi

Linux終端


終端類型:

console: 控制檯

pty: 物理終端(VGA)

tty: 虛擬終端(VGA)

ttyS: 串行終端

pts/#: 僞終端


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章