一、實(shí)驗(yàn)?zāi)康模?/strong>
使學(xué)生熟悉一種簡(jiǎn)單的指定用戶的監(jiān)測(cè)方法,熟悉UNIX的基本SHELL程序設(shè)計(jì)方法和使用技巧,包括:
(1)命令行參數(shù)檢測(cè)
(2)用戶變量
(3)while循環(huán)控制
(4)暫停進(jìn)程(sleep)
二、實(shí)驗(yàn)原理:
(1)SHELL程序的主要用途
在SHELL程序中不僅僅可以使用命令的集合,而且可以安排自動(dòng)化處理過(guò)程,因此可以通過(guò)編寫SHELL程序使大量的任務(wù)執(zhí)行實(shí)現(xiàn)自動(dòng)化。SHELL比較擅長(zhǎng)完成系統(tǒng)管理任務(wù),尤其適合完成那些易用性、可維護(hù)性和便攜性比執(zhí)行效率更優(yōu)先的任務(wù)。我們可以使用任意一種文本編輯器完成SHELL程序的編寫,在SHELL編程中要遵循一定的程序設(shè)計(jì)規(guī)則和變量使用規(guī)則。
(2)SHELL程序的執(zhí)行與調(diào)試
在bash的SHELL程序設(shè)計(jì)中,程序必須以下面的行開始:
#!/bin/bash |
這里符號(hào)#!用來(lái)告訴系統(tǒng),后面給出的參數(shù)是用來(lái)執(zhí)行該文件的程序。
利用vi,gedit等文本編輯器編寫Shell腳本的格式是固定的,如下:
#!/bin/sh #comments Your commands go here |
filename.sh,文件名后綴sh表明這是一個(gè)Bash腳本文件
當(dāng)編輯完一個(gè)SHELL腳本后,要使該腳本能夠執(zhí)行,還必須使該腳本文件具有可執(zhí)行權(quán)。需要執(zhí)行命令:
chmod ?+x ?filename |
在shell程序中,以#開頭到一個(gè)行結(jié)束的句子表示注釋信息。建議大家在編寫shell程序時(shí)養(yǎng)成添加注釋的習(xí)慣,因?yàn)樽⑨尣粌H能給其他需要熟悉該程序的人以幫助,也能給出腳本編寫者設(shè)計(jì)原理的提示。
進(jìn)行shell程序設(shè)計(jì)時(shí),必定會(huì)用到變量。Shell編程中使用的變量有自己的特色,即所有的變量都是由字符串組成的,而且對(duì)變量無(wú)須進(jìn)行聲明,可直接進(jìn)行變量賦值操作。
(3)SHELL程序注意事項(xiàng)
SHELL編程中除了需要遵守一些規(guī)則外,還有一些注意事項(xiàng),如果做得好會(huì)對(duì)編程有促進(jìn),這里列出幾條僅供大家參考,更多的內(nèi)容還需自己通過(guò)編程積累。
因?yàn)長(zhǎng)INUX中命令使用的是小寫字符,因此在SHELL編程中可以使用大寫字符表示變量以示區(qū)別。
在SHELL語(yǔ)句中加入必要的注釋,以便以后閱讀和維護(hù),注釋以”#”開頭。
對(duì)SHELL變量進(jìn)行數(shù)字運(yùn)算時(shí),使用乘法符號(hào)”*”時(shí),要用轉(zhuǎn)義符”\”進(jìn)行轉(zhuǎn)義。例子:multiplication=` expr $j \* $j`
由于SHELL對(duì)命令中多余的空格不進(jìn)行任何處理,因此程序員可以利用這一特性調(diào)整程序縮進(jìn)格式,達(dá)到增強(qiáng)程序可讀性的效果。
在對(duì)函數(shù)命名時(shí)最好能使用有含義且容易理解的名字,即使函數(shù)名能夠比較準(zhǔn)確地表達(dá)函數(shù)所完成的任務(wù)。同時(shí)建議對(duì)于較大的程序要建立函數(shù)命名和變量命名對(duì)照表。
如果一行未完成,可以在行尾加上“這個(gè)符號(hào) 表明下一行與此行會(huì)合并為同一行。
(4)SHELL簡(jiǎn)單調(diào)試
最簡(jiǎn)單的調(diào)試命令當(dāng)然是使用echo命令。可以使用echo在任何懷疑出錯(cuò)的地方打印任何變量值。另外還可以利用Bash中提供的選項(xiàng)進(jìn)行檢查
-n,讀一遍腳本中的命令但不執(zhí)行,用于檢查腳本中的語(yǔ)法錯(cuò)誤。
-v,一邊執(zhí)行腳本,一邊將執(zhí)行過(guò)的腳本命令打印到標(biāo)準(zhǔn)輸出。
-x,提供跟蹤執(zhí)行信息,將執(zhí)行的每一條命令和結(jié)果依次打印出來(lái)。該選項(xiàng)會(huì)顯示剛剛執(zhí)行的命令及參數(shù)。用戶可以通過(guò)set命令打開-x選項(xiàng)或在啟動(dòng)Shell使用-x選項(xiàng)將Shell設(shè)置成跟蹤模式。
使用這些選項(xiàng)有三種方法(注意:避免幾種調(diào)試選項(xiàng)混用)
1.在命令行提供參數(shù):$sh -x script.sh
2.腳本開頭提供參數(shù):#!/bin/sh -x
3.在腳本中用set命令啟用or禁用參數(shù):其中set -x表示啟用,set +x表示禁用。
(4)Sh和bash的區(qū)別
?Linux系統(tǒng)中的/bin/sh本是bash的符號(hào)鏈接,鑒于bash過(guò)于復(fù)雜,有人把bash從NetBSD移植到Linux并更名為dash,并建議將/bin/sh指向它,以獲得更快的腳本執(zhí)行速度。Dash?Shell比Bash?Shell小的多,符合POSIX標(biāo)準(zhǔn)。
因?yàn)閎ash是sh的增強(qiáng)版本,在我們平常實(shí)地操作的時(shí)候如果sh這個(gè)命令不靈了我們應(yīng)當(dāng)使用bash。
(5)用戶切換操作
1.sudo su //切換到root權(quán)限(但不是root用戶)
2. adduser tongxue1 增加一個(gè)同學(xué)1
3. login tongxue1 登錄同學(xué)1
4 這個(gè)時(shí)候使用who命令來(lái)查看 就會(huì)發(fā)現(xiàn)多了一個(gè)登錄賬戶 tongxue1了
三、實(shí)驗(yàn)內(nèi)容:
編寫一個(gè)用戶監(jiān)測(cè)程序usr_monitor, 其運(yùn)行格式為:
usr_monitor ?username |
其中username是用戶指定的任意一個(gè)用戶名。
程序運(yùn)行時(shí)首先列出當(dāng)前系統(tǒng)中的已登錄用戶的名單,再檢查指定用戶是否已登錄。如果已登錄,則顯示相應(yīng)信息;如果未登錄,則等待該用戶登錄,直到指定用戶登錄進(jìn)入系統(tǒng)為止。具體步驟如下所示:
(1)根據(jù)變量$#的值檢查命令行上是否有一個(gè)用戶名,如果有則繼續(xù)運(yùn)行;如果沒(méi)有或多于一個(gè)用戶名則輸出提示信息:
Usage: usr_monitor ?username
(2)運(yùn)行who命令,并將運(yùn)行結(jié)果中的用戶名字段截取下來(lái),保存到一個(gè)用戶變量中。
(3)echo命令顯示該變量的值,即當(dāng)前系統(tǒng)中的用戶名單。
(4)判斷用戶名單中是否包含命令行上指定的用戶,如果有則輸出提示信息:user [username] is logon,并退出程序。
(5)如果用戶名單中沒(méi)有包含命令行上指定的用戶,則輸出提示信息:waiting user [username] …,光標(biāo)停留在省略號(hào)后面。
(6)使用while循環(huán),用sleep命令每隔5秒鐘檢查指定用戶是否已登錄系統(tǒng)。檢測(cè)方法與步驟2相同。
(7)如果指定用戶未登錄,則一直等待下去;如果指定用戶已登錄,則在省略號(hào)后面接著輸出提示信息: ?[username] is log on,退出循環(huán),并結(jié)束程序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-501385.html
參考代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-501385.html
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: usr_monitor username"
exit 1
fi
username=$1
users=$(who | awk '{print $1}')
echo "Current logged-in users:"
echo "$users"
while true; do
users=$(who | awk '{print $1}')
if echo "$users" | grep -w "$username" > /dev/null; then
echo "User [$username] is logged on"
break
else
echo "Waiting for user [$username] ..."
sleep 5
fi
done
echo "User [$username] is logged on. Exiting."
到了這里,關(guān)于shell編程實(shí)驗(yàn)-用戶登錄狀態(tài)監(jiān)測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!