let i=$[$i+1] let i+=1 let i++
let sum=$[$sum+$i] let sum+=$i
-= i--
++i --i
*=
/=
%=
[root@localhost ~]# i=14
[root@localhost ~]# let i%=3
[root@localhost ~]# echo $i
2
計算100以內所有能被3整除的正整數的和(就是 number%3=0)
計算100以內所有奇數的和,以及所有偶數的和,分別顯示之;
#!/bin/bash
#
declare -i evensum=0
declare -i oddsum=0
for i in {1..100}; do
if [ $[$i%2] -eq 0 ]; then
let evensum+=$i
else
let oddsum+=$i
fi
done
echo "Odd sum is: $oddsum."
echo "Even sum is: $evensum."
檔案查詢:
常用命令:
locate
非實時,模糊匹配查詢 ,速度快,查詢是根據全系統檔案資料庫進行的;
任務計劃--晚上自動將本機系統上的所有檔案的相關資訊收集起來--儲存至資料庫中
手動更新 updatedb 手動生成檔案資料庫
find:
實時查詢,精確
通過遍歷指定目錄中的所有檔案完成查詢,速度慢
支援眾多查詢標準
find [查詢路徑] 查詢標準 查詢到後的處理動作
[查詢路徑] : 可省略,預設表示當前目錄
查詢標準(匹配標準) : 預設為指定路徑下的所有檔案(及其子目錄的)
查詢到後的處理動作 : action,預設為顯示到螢幕上
查詢標準(匹配標準):
-name 'filename' : 對檔名做精確匹配
檔名通配:
* 任意長度,任意字元
? 任意單個字元
[] 範圍內的單個字元
[root@localhost tmp]# find /etc -name 'passwd'
/etc/pam.d/passwd
/etc/passwd
/etc下以passwd開頭的所有檔案
[root@localhost tmp]# find /etc -name "passwd*"
/etc/pam.d/passwd
/etc/passwd.OLD
/etc/passwd-
/etc/passwd
/etc下以passwd結尾的所有檔案
[root@localhost tmp]# find /etc -name "*passwd"
/etc/pam.d/passwd
/etc/security/opasswd
/etc/passwd
/etc下包含passwd的所有檔案
[root@localhost tmp]# find /etc -name "*passwd*"
/etc/pam.d/passwd
/etc/passwd.OLD
/etc/security/opasswd
/etc/passwd-
/etc/passwd
注意:
-name 'filename' : 是嚴格區分大小寫的
-iname 'filename':檔名匹配時不區分大小寫
-regex pattern : 基於正則,進行檔名匹配
-user username :根據檔案屬主查詢
find /tmp -user hadoop
find /tmp -user student
-group groupname : 根據檔案屬組查詢
-uid UID :根據uid查詢
-gid GID : 根據gid查詢
注意:一個使用者被刪除後,假如還有之前他建立的檔案存在,則該檔案的屬主,同名稱的屬組,都變為數字的uid,gid了;
所以可以通過上面的-uid,-gid查詢;
find /tmp -uid 2003
-nouser : 查詢沒有屬主的檔案
find /tmp -nouser
-nogroup : 查詢沒有屬組的檔案
-type f(common file)/d(directory)/c(character)/b(block)/l(link)/p(pipe)/s(socket):根據檔案型別查詢
find /tmp -type d
find /tmp -type s
-size [+|-]#k/M/G : 按大小查詢,預設單位為位元組;
+10k : 大於10k
10k : 9k~10k的
-10k :所有小於10k的
find /etc -size 10k -ls
組合條件查詢:
-a : and ;預設
-o :or
-not :!
預設就是與條件
find /tmp -nouser -a -type d -ls
find /tmp -nouser -o -type d -ls
非目錄的檔案:
find /tmp -not -type d
不是目錄並且也不是套接字?
find /tmp -not -type d -a -not -type s
/tmp/test目錄下,屬主不是user1,也不是user2的檔案?
find /tmp/test -not -user user1 -a -not -user user2
find /tmp/test -not \( -user user1 -o -user user2 \)
/tmp/test目錄下,屬主不是user1,或者型別不是目錄的檔案?
find /tmp/test -not -user user1 -o -not -type d
find /tmp/test -not \( -user user1 -a -type d \)
根據時間查詢:
-mtime [+|-]# 修改的 單位是天
-ctime [+|-]# 改變的
-atime [+|-]# 訪問的
-atime 5 :離現在為止,剛好5天
-atime -5 :5天內訪問過
-atime +5 :5天前訪問過
-mmin [+|-]# 分鐘
-cmin [+|-]#
-amin [+|-]#
find ./ -amin -5 5分鐘之內
find ./ -admin 5 剛好過去5分鐘
find ./ -admin +5 5分鐘之前
find /tmp -atime +7
find /tmp -atime +30
find /usr -atime +30
根據檔案許可權查詢:
-perm mode 精確匹配
find ./ -perm 644
-perm /mode 只要有一位匹配即可
find ./ -perm /644
任意一位匹配即滿足條件
-perm -mode 每一位都必須匹配才行;包含關係;檔案的許可權能完全包含此mode
如:755---644(755包含644即可匹配到)
對應的位必須完全包含
find ./ -perm -001 查詢其它人有x許可權的
find ./ -perm -022 組和其他人有w許可權的
find ./ -perm /022 組或其他人有w許可權的
find ./ -perm -007
動作:匹配查詢到後的執行動作
-print 顯示 ; 預設
-ls 類似ls -l 顯示每一個檔案的詳細資訊
-ok command {} \; 每一次操作都需要使用者確認
-exec command {} \; 不需要確認
xargs
{} : 引用查詢匹配到的檔案
find ./ -perm -006 -exec chmod o-w {} \;
找到型別是目錄的,把屬主,屬組,其它人都加上x許可權?
find ./ -type d -ok chmod +x {} \;
查詢屬組有w許可權的,改名為 "原名稱.new"
find ./ -perm -020 -exec mv {} {}.new \;
查詢/tmp目錄下,.sh結尾的檔案,且所有使用者都有x許可權的,然後去掉其他人的x許可權?
find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \;
1、查詢/var目錄下屬主為root並且屬組為mail的所有檔案;
find /var -user root -group mail
find /var -user root -a -group mail
2、查詢/usr目錄下不屬於root,bin,或student的檔案;
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not \( -user root -o -user bin -o -user student \)
3、查詢/etc目錄下最近一週內內容修改過且不屬於root及student使用者的檔案;
find /etc -mtime -7 -not \ ( -user root -o -user student \)
find /etc -mtime -7 -not -user root -a -not -user student
4、查詢當前系統上沒有屬主或屬組且最近1天內曾被訪問過的檔案,並將其屬主屬組均修改為root;
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
5、查詢/etc目錄下大於1M的檔案,並將其檔名寫入/tmp/etc.largefiles檔案中;
find /etc -size +1M >> /tmp/etc.largefiles
find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles xargs不需要佔位符{}, \;結尾了
6、查詢/etc目錄下所有使用者都沒有寫許可權的檔案,顯示出其詳細資訊;
find /etc -not -perm /222 -ls
特殊許可權:
SUID
SGID
Sticky
程式的安全上下文
1. 使用者啟動程式,先看是否有許可權執行程式的二進位制程式檔案;
2. 程式啟動後,屬主,屬組是啟動該程式的使用者,及其基本組
3. 假如程式想要訪問系統資源,如訪問某個目錄的內容,則要看該程式的屬主,屬組許可權是否能訪問了;
SUID :啟動程式的屬主不再是當前啟動該程式的使用者了,而是該程式檔案本身的屬主;
[root@localhost ~]# ll /bin/cat
-rwxr-xr-x 1 root root 25216 2011-07-22 /bin/cat
[root@localhost ~]# ll /etc/shadow
-r-------- 1 root root 1347 04-04 00:58 /etc/shadow
如果其他使用者cat /etc/shadow是沒有許可權檢視的,假如給 -rwsr-xr-x /bin/cat,其它使用者能否檢視?
chmod u+s file
chmod u-s file
如果file本身原來就有執行許可權,則SUID顯示為s,否則顯示S;
SGID :啟動程式的屬組不再是當前啟動該程式的使用者的基本組了,而是該程式檔案本身的屬組;
chmod g+s file
chmod g-s file
特殊場景:開發團隊。有使用者 hadoop, hbase , hive;
開發目錄:/tmp/project/
希望三個使用者在/tmp/project/下都能建立檔案;三個使用者能彼此編輯檢視對方的檔案;
甚至管理員在這裡建立檔案,這三個使用者也都能編輯;
但是不能刪除別人的檔案?---Sticky
Sticky :在一個公共目錄,每個使用者都可以建立檔案,刪除自己的檔案,但不能刪除別人的檔案;
通常是對目錄而言;
chmod o+t Dir
chmod o-t Dir
如果原檔案有x許可權---t,否則T
000 0
001 1 t
010 2 SGID
011 3 SGID,t
100 4 SUID
101 5 SUID,t
110 6 SUID,SGID
111 7 SUID,SGID,t
4:SUID
2:SGID
1:t
chmod 1755 /backup/test
1:Sticky
755
chmod 2755 /backup/test
2: SGID
chmod 3755 /backup/test
3: SGID , Sticky
chmod 5755 /backup/test
5: SUID, Sticky
umask 0022 第一位就是指特殊許可權位
SUID:執行某程式時,相應程式的屬主是程式檔案自身的屬主,而不是啟動者;
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
練習:寫一個指令碼
寫一個指令碼,顯示當前系統上shell為-s指定型別的使用者,並統計其使用者總數。-s選項後面跟的引數必須是/etc/shells檔案中存在的shell型別,否則不執行此指令碼。另外,此指令碼還可以接受--help選項,以顯示幫助資訊。指令碼執行形如:
./showshells.sh -s bash
顯示結果形如:
BASH,3users,they are:
root,redhat,gentoo
#!/bin/bash
#
if [ $1 == '-s' ]; then
! grep "${2}$" /etc/shells &> /dev/null && echo "Invalid shell." && exit 7
elif [ $1 == '--help' ];then
echo "Usage: showshells.sh -s SHELL | --help"
exit 0
else
echo "Unknown Options."
exit 8
fi
NUMOFUSER=`grep "${2}$" /etc/passwd | wc -l`
SHELLUSERS=`grep "${2}$" /etc/passwd | cut -d: -f1`
SHELLUSERS=`echo $SHELLUSERS | sed 's@[[:space:]]@,@g'`
echo -e "$2, $NUMOFUSER users, they are: \n$SHELLUSERS"
${變數名}
本作品採用《CC 協議》,轉載必須註明作者和本文連結