特殊權限
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/#: 僞終端