1.判斷/tmp/run目錄是否存在,如果不存在就建立,如果存在就刪除目錄里所有文件
#!/bin/bash dir=/tmp/run [-f$dir]&&mv$dir$dir.bak [-d$dir]&&rm-rf$dir/*||mkdir$dir
2.輸入一個文件的絕對路徑,判斷路徑是否存在,而且輸出是文件還是目錄,如果是字符連接,還得輸出是有效的連接還是無效的連接
#!/bin/bash read-p"Inputapath:"path if[-L$path-a-e$path];then echo"thisiseffectivelink" elif[-L$path-a!-e$path];then echo"thisisnoteffectivelink" elif[-d$path];then echo"thisisadirector" elif[-f$path];then echo"thisisfile" elif[-e$path];then echo"thisisaothertypefile" else echo"thefileisnotexist" fi
3.交互模式要求輸入一個ip,然后腳本判斷這個IP 對應的主機是否 能ping 通,輸出結果類似于:
Server10.1.1.20isDown!最后要求把結果郵件到本地管理員root@localhost和mail01@localhost
方法一:
#!/bin/bash read-p"輸入IP地址:"ip ping-c2$ip>/dev/null2>&1 if[$?-eq0];then echo"Server$ipisOK."|mail-s'checkserver'root@localhost else echo"Server$ipisDown!"|mail-s'checkserver'root@localhost fi
方法二:
#!/bin/bash read-p"Inputyourip:"ip ping-c1$ip&>/dev/null [$?-eq0]&&echo"server$ipisok"|mail-s"checkserver"root@localhost||echo"server$ipisdown"|mail-s"checkserver"root@localhost
方法三:
#!/bin/bash tmpfile=`mktemp` mailaddr="root@localhostmail@localhost" read-p"輸入IP地址:"ip ping-c2$ip>/dev/null2>&1 if[$?-eq0];then echo"Server$ipisUp!">>$tmpfile else echo"Server$ipisDown!">>$tmpfile fi cat$tmpfile mail-s"pingserver"$mailaddr$tmpfile rm?-rf?$tmpfile
方法四:
#!/bin/bash rootmail="root@localhost" tmpfile=`mktemp` read-p"Inputaip:"ip ping-c1"$ip"&>/dev/null retval=$? if[$retval-eq0];then echo"Server$ipisup">$tmpfile else echo"Server$ipisdown">$tmpfile fi cat$tmpfile mail-s"pingresult"$rootmail$tmpfile rm?-rf?$tmpfile
4.寫一個腳本,局域網內,把能ping通的IP和不能ping通的IP分類,并保存到兩個文本文件里(如果例舉整個網段的254個IP花的時間比較長,可以只分類10個ip10.1.1.1~10) 這只是一個局域網內機器檢查通訊的一個思路。
#!/bin/bash
#清空原來ip文件里的列表
>/tmp/ip_ok
>/tmp/ip_down
ip=10.1.1
#循環(huán)去ping局域網內的主機
for((i=1;i<=10;i++))
do
ping?-c1?$ip.$i?&>/dev/null
test$?-eq0&&echo"$ip.$i"|tee-a/tmp/ip_ok||echo"$ip.$i"|tee-a/tmp/ip_down
done
思考:以上方法可以實現(xiàn),但是速度很慢,希望并行執(zhí)行
#!/bin/bash
#清空原來ip文件里的列表
>/tmp/ip_ok
>/tmp/ip_down
ip=10.1.1
#循環(huán)去ping局域網內的主機
for((i=1;i<=10;i++))
do
{
ping?-c1?$ip.$i?&>/dev/null
test$?-eq0&&echo"$ip.$i"|tee-a/tmp/ip_ok||echo"$ip.$i"|tee-a/tmp/ip_down
}&
done
wait
echo"ipisok..."
5.寫一個腳本/home/hello.sh,要求當給腳本輸入參數(shù)hello時,腳本返回world,給腳本輸入參數(shù)world時,腳本返回hello。而腳本沒有參數(shù)或者參數(shù)錯誤時,屏幕上輸出“usage:/home/hello.sh hello or world”
#!/bin/bash #read-p"Inputastring:"a if[$#-eq0-o$#-gt1];then echo"usage:/home/program/test4.shworld|hello" #echo"usage:`basename$0`world|hello"#更常用的報錯寫法 elif["$1"="hello"];then echo"world" elif["$1"="world"];then echo"hello" else echo"usage:/home/program/test4.shworld|hello" fi
6.自動搭建nfs服務
#!/bin/bash #關閉防火墻和selinux serviceiptablesstop chkconfigiptablesoff setenforce0&>/dev/null echo"########防火墻和selinux已經關閉########" #測試網絡,配置內網yum源 ping-c1192.168.1.10&>/dev/null if[$?-eq0];then echo"########網絡ok########" else echo"########請檢查你的網絡########" exit fi wget-P/etc/yum.repos.d/ftp://192.168.1.10/demo.repo&>/dev/null #安裝相關軟件 yum-yinstall'nfs*'rpcbind&>/dev/null&&echo"########軟件安裝ok#######" #發(fā)布共享目錄并授權 read-p"Inputyoursharedir:"dir [!-d$dir]&&mkdir$dir-p #授權 chmod1777$dir read-p"Inputyoursharehost(192.168.0.0/24(ro)):"host cat>>/etc/exports</dev/null&&echo"##########rpcbind服務啟動成功#############" servicenfsrestart&>/dev/null&&echo"############nfs服務啟動成功#############" chkconfigrpcbindon chkconfignfson #測試驗證 mkdir/u01&>/dev/null mount.nfslocalhost:$dir/u01 [$?-eq0]&&echo"nfs服務測試ok,可以正常使用!" umount/u01
7.將/etc/passwd里的用戶名分類,分為管理員用戶,系統(tǒng)用戶,普通用戶。
分析: 1.根據(jù)用戶的uid來判斷用戶種類 2.用戶的信息保存在/etc/passwd文件中,需要在該文件中獲取UID 3.根據(jù)用戶的uid去判斷 管理員:root0 系統(tǒng)用戶:1-499ftpapache...65534nfsnobody 普通用戶:500-60000
#!/bin/bash foriin`cat/etc/passwd|cut-d:-f1,3` do uid=`echo$i|cut-d:-f2` name=`echo$i|cut-d:-f1` [$uid-eq0]&&echo$name>>/tmp/adminuser [$uid-gt0-a$uid-lt500-o$uid-eq65534]&&echo$name>>/tmp/systemuser [$uid-ge500-a$uid-ne65534]&&echo$name>>/tmp/normaluser done
8.寫一個倒計時腳本,要求顯示離2018年1月1日(元旦節(jié))的凌晨0點,還有多少天,多少時,多少分,多少秒。
分析: 1.該腳本應該是一個死循環(huán),除非當前系統(tǒng)時間等于1月1日的凌晨0點,要退出循環(huán),并且打印元旦快樂break 2.計算未來時間(1月1日的凌晨0點)和當前系統(tǒng)時間的時間差時間單位相同并且以相同的時間為一個基準 需要定義2個變量: 現(xiàn)在時間和未來時間 date命令-d%s 3.計算 假如1月1日和現(xiàn)在時間相差100000s 1天=86400s 1小時=3600s 1分鐘=60 $[100000/86400]=天 $[$[100000%86400]/3600]=小時 $[$[100000%3600]/60]=分鐘
#!/bin/bash goal=`date+%s-d20181001` whiletrue或者untilfalse do now=`date+%s` if[$[$goal-$now]-eq0];then break fi day=$[($goal-$now)/86400] hour=$[($goal-$now)%86400/3600] minute=$[($goal-$now)%3600/60] second=$[($goal-$now)%60] clear echo"離2018年1月1日還有$day天:$hour時:$minute分:$second秒" sleep1 done echo"元旦節(jié)快樂!!!"
9.寫一個腳本把一個目錄內的所有空文件都刪除,最后輸出刪除的文件的個數(shù)。
分析: 1.如何判斷文件是空文件-s判斷文件內容為非空;判斷空文件則!-seg:[!-sfile] 2.定義一個變量count=0來保存刪除文件的個數(shù),掌握四則運算letcount++ 3.交互式定義變量讓用戶自己決定清理哪個目錄/data/logs/10個文件循環(huán)次數(shù)由目錄里的文件個數(shù)決定find命令
#!/bin/bash read-p"輸入一個你要刪除空文件的目錄:"dir count=0 foriin`find$dir-typef` do [!-s$i]&&rm-rf$i&&letcount++##-s表示非空 done echo"刪除的個數(shù)為:"$count
10.寫一個腳本,將跳板機上yunwei用戶的公鑰推送到局域網內可以ping通的所有機器上 10.1.1.1~10.1.1.254
分析: 環(huán)境: jumper-server有yunwei用戶 app1-appn局域網內所有可以ping通的機器 1.在跳板上創(chuàng)建yunwei用戶,并且生成一對秘鑰 2.檢測當前局域網中哪些ip是能ping通哪些是不能ping通循環(huán)語句并發(fā)的去檢查 3.在腳本中所有的交互動作需要用到expect實現(xiàn) yunwei用戶sudo授權: visudo ##Allowroottorunanycommandsanywhere rootALL=(ALL)ALL yunweiALL=(root)NOPASSWD:ALL,!/sbin/shutdown,!/sbin/init,!/bin/rm-rf/
#!/bin/bash
#檢查局域網中哪些ip是可以ping通,并保存到一個文件
ip1=10.1.1
for((i=1;i<=10;i++))
do
?{
??????ping?-c1?$ip1.$i?&>/dev/null
[$?-eq0]&&echo"$ip1.$i">>ip_up.txt
}&
done
wait
#yunwei用戶生成一對秘鑰(有交互)
[!-f~/.ssh/id_rsa]&&ssh-keygen-P''-f~/.ssh/id_rsa
#將yunwe用戶的公鑰遠程拷貝到指定的服務器100循環(huán)
##判斷expect程序是否安裝
{
rpm-qexpect
[$?-ne0]&&sudoyum-yinstallexpect
whilereadip2
do
/usr/bin/expect<<-EOF
?spawn?ssh-copy-id??root@$ip2
?expect?{
??????"yes/no"?{send?"yes
";exp_continue}
??????"password:"?{send?"123
"}
??????}
?expect?eof
?EOF
done/dev/null
#測試驗證
remote_ip=`tail-1ip_up.txt`
sshroot@$remote_iphostname
[$?-eq0]&&echo"公鑰推送完畢...."
#!/bin/bash
#pushpublickeytoaap-servers
#將局域網內可以ping通的主機ip保存到一個文件
>ip_up.txt
foriin{2..10}
do
{
ip=10.1.1.$i
ping-c1$ip&>/dev/null
[$?-eq0]&&echo$ip|tee-aip_up.txt
}&//并行放到后臺運行
done
wait//等待進程結束
#將yunwei用戶目錄下的公鑰推送到可以ping的服務器上
#1.判斷yunwei用戶下有沒有公鑰
[!-f~/.ssh/id_rsa.pub]&&ssh-keygen-P""-f~/.ssh/id_rsa
#2.將id_rsa.pub公鑰遠程推送到指定服務器
#2.1判斷expect程序是否安裝,沒安裝則安裝它
{
rpm-qexpect
[$?-ne0]&&sudoyum-yinstallexpect
forremote_ipin`catip_up.txt`
do
/usr/bin/expect<<-EOF
?spawn?ssh-copy-id?root@$remote_ip
?expect?{
???????"yes/no"?{?send?"yes
";exp_continue?}
???????"password:"?{?send?"123
"?}
?}
??expect?eof
?EOF
done
}?&>/dev/null
#測試驗證
test_ip=`tail-1ip_up.txt`
sshroot@$test_iphostname
test$?-eq0&&echo"公鑰推送成功。"
#!/bin/bash
[!-f~/.ssh/id_rsa.pub]&&ssh-keygen-P""-f~/.ssh/id_rsa
rpm-qexpect
[$?-ne0]&&sudoyum-yinstallexpect
foriin{130..140}
do
ip=192.168.44.$i
ping-c1$ip
[$?-ne0]&&continue
echo$ip>>ip_up.txt
/usr/bin/expect<<-EOF
????????spawn?ssh-copy-id?root@$ip
????????expect?{
????????"yes/no"?{?send?"yes
";exp_continue?}
????????"password:"?{?send?"123456
"?}
????????}
????????expect?eof
????????EOF
done
#測試驗證
test_ip=`tail?-1?ip_up.txt`
ssh?root@$test_ip?hostname
test?$??-eq?0?&&?echo?"公鑰推送成功。"
11.
任務/背景:
現(xiàn)有的跳板機雖然實現(xiàn)了統(tǒng)一入口來訪問生產服務器,yunwei用戶權限太大可以操作跳板機上的所有目錄文件,存在數(shù)據(jù)被誤刪的安全隱患,所以希望你做一些安全策略來保證跳板機的正常使用。
具體要求:
只允許yunwei用戶通過跳板機遠程連接后臺的應用服務器做一些維護操作
公司運維人員遠程通過yunwei用戶連接跳板機時,跳出以下菜單供選擇:
歡迎使用Jumper-server,請選擇你要操作的主機: 1.DB1-Master 2.DB2-Slave 3.Web1 4.Web2 q.exit
當用戶選擇相應主機后,直接免密碼登錄成功
如果用戶不輸入一直提示用戶輸入,直到用戶選擇退出
思路:
需要當yunwei用戶登錄時執(zhí)行一個腳本(該腳本放到哪里?)yunwei用戶的家目錄里的.bashrc
腳本中需要打印一個菜單供用戶選擇(case…esac)
免密碼登錄(上面第10個腳本推公鑰的腳本)
#!/bin/bash
#公鑰推送成功
trap''12319
#打印菜單用戶選擇
menu(){
cat<<-EOF
歡迎使用Jumper-server,請選擇你要操作的主機:
1.?DB1-Master
2.?DB2-Slave
3.?Web1
4.?Web2
h.?help
q.?exit
EOF
}
#調用函數(shù)來打印菜單
menu
while?true
do
read?-p?"請輸入你要選擇的主機[h?for?help]:"?host
#通過case語句來匹配用戶所輸入的主機
case?$host?in
?1|DB1)
?ssh?root@10.1.1.1
?;;
?2|DB2)
?ssh?root@10.1.1.2
?;;
?3|web1)
?ssh?root@10.1.1.250
?;;
?h|help)
?clear;menu
?;;
?q|quit)
?exit
?;;
esac
done
#!/bin/bash
#jumper-server
#菜單打印
trap?''?1?2?3?
while?true
do
cat?<<-END
歡迎使用Jumper-server,請選擇你要操作的主機:
1.?DB1-Master
2.?DB2-Slave
3.?Web1
4.?Web2
5.?exit
END
#讓用戶選擇相應的操作
read?-p?"請輸入你要操作的主機:"?host
case?$host?in
?1)
?ssh?root@10.1.1.2
?;;
?2)
?ssh?root@10.1.1.3
?;;
?3)
?ssh?root@10.1.1.4
?;;
?5)
?exit
?;;
?*)
?clear
?echo?"輸入錯誤,請重新輸入..."
?;;
esac
done
12.寫一個腳本,統(tǒng)計web服務的不同連接狀態(tài)個數(shù)
#!/bin/bash #count_http_80_state #統(tǒng)計每個狀態(tài)的個數(shù) declare-ASTATE states=`ss-ant|grep80|cut-d''-f1` foriin$states do letSTATE[$i]++ done #通過遍歷數(shù)組里的索引和元素打印出來 forjin${!STATE[@]} do echo$j:${STATE[$j]} done
13.寫一個自動搭建apache服務的腳本,要求如下:
1、用戶輸入web服務器的IP、域名以及數(shù)據(jù)根目錄 2、如果用戶不輸入則一直提示輸入,直到輸入為止 3、當訪問www.test.cc時可以訪問到數(shù)據(jù)根目錄里的首頁文件“thisistestpage”
#!/bin/bash
#定義函數(shù)實現(xiàn)用戶不輸入則一直提示輸入,直到輸入為止
input_fun(){
input_var=''
while[-z$input_var]
do
read-p"$1"input_var
done
echo$input_var
}
#調用函數(shù)并且獲取用戶輸入web服務器的IP、域名以及數(shù)據(jù)根目錄
IP=`input_fun請輸入你的IP地址:`
name=`input_fun請輸入你的域名:`
dir=`input_fun請輸入你的數(shù)據(jù)根目錄:`
#將ip與主機名輸入到hosts文件里
cat>>/etc/hosts<$dir/index.html
#yum安裝apache
yum-yinstallhttpd&>/dev/null
#發(fā)布虛擬主機
cat>>/etc/httpd/conf/httpd.conf<<-EOF
NameVirtualHost?*:80
ServerAdminwebmaster@dummy-host.example.com
DocumentRoot$dir
ServerName$name
ErrorLoglogs/dummy-host.example.com-error_log
CustomLoglogs/dummy-host.example.com-access_logcommon
EOF
#啟動
servicehttpdrestart&>/dev/null
echo"====apache啟動成功===="
#測試驗證
curlhttp://$name
14.需求:寫一個腳本讓用戶輸入基本信息(姓名,性別,年齡),如不輸入一直提示輸入,最后根據(jù)用戶的信息輸出相對應的內容
思路:
循環(huán)直到輸入字符串不為空 -z -n
根據(jù)用戶輸入信息做出匹配判斷
#!/bin/bash
#該函數(shù)實現(xiàn)用戶如果不輸入內容則一直循環(huán)直到用戶輸入為止,并且將用戶輸入的內容打印出來
input_fun()
{
input_var=""
output_var=$1
while[-z$input_var]
do
read-p"$output_var"input_var
done
echo$input_var
}
或者
fun(){
read-p"請輸入您的姓名:"name
if[-z$name];then
fun
else
echo"你好,$name!"
fi
}
fun
#調用函數(shù)并且獲取用戶的姓名、性別、年齡分別賦值給name、sex、age變量
name=$(input_fun請輸入你的姓名:)
sex=$(input_fun請輸入你的性別:)
age=$(input_fun請輸入你的年齡:)
#根據(jù)用戶輸入的性別進行匹配判斷
#根據(jù)用戶所輸入的內容進行判斷輸入
case$sexin
man|男)
if[$age-ge18-a$age-le25];then
echo"哥們,娶媳婦了嗎"
elif[$age-gt25-a$age-le35];then
echo"要擔起家庭的責任"
elif[$age-lt18];then
echo"小伙子不錯"
else
echo"$name先生,你油膩了嗎?"
fi
;;
woman|女)
echo"$name小姐姐你好漂亮"
;;
*)
echo"你是泰國來的嗎?"
;;
esac
15.寫一個初始化系統(tǒng)的腳本
1)自動修改主機名(如:ip是192.168.0.88,則主機名改為server88.itcast.cc) a.更改文件非交互式sed /etc/sysconfig/network b.將本主機的IP截取出來賦值給一個變量ip;再然后將ip變量里以.分割的最后一位賦值給另一個變量ip1 2)自動配置可用的yum源 3)自動關閉防火墻和selinux
#!/bin/bash ip=`ifconfigeth1|sed-n'2p'|sed's/.*addr:(.*)Bcast.*/1/g'` ip1=`echo$ip|cut-d.-f4` #修改主機名 sed-i"/HOSTNAME=/cHOSTNAME=server$ip1.itcast.cc"/etc/sysconfig/network echo"$ipserver$ip1.itcast.cc">>/etc/hosts #配置yum源 mount/dev/sr0/mnt/&>/dev/null cat>/etc/yum.repos.d/local.repo<<-EOF [local] name=local?yum baseurl=file:///mnt enabled=1 gpgcheck=0 EOF #關閉防火墻和selinux service?iptables?stop?&>/dev/null setenforce0&>/dev/null #sed-i'/SELINUX=/cSELINUX=disabled'/etc/selinux/config
16.寫一個搭建ftp服務的腳本,要求如下:
1)不支持本地用戶登錄 2)匿名用戶可以上傳新建刪除 3)匿名用戶限速500KBps
#!/bin/bash #安裝軟件 read-p"請輸入需要安裝的軟件:"s yum-yinstall$s&>/dev/null #備份配置文件 c=/etc/vsftpd/vsftpd.conf cp$c$c.bak #修改配置文件 sed-i'/local_enable/clocal_enable=NO'$c sed-i'$aanon_upload_enable=YES'$c sed-i'$aanon_mkdir_write_enable=YES'$c sed-i'$aanon_other_write_enable=YES'$c sed-i'$aanon_max_rate=512000'$c #啟動服務 servicevsftpdrestart&>/dev/null echo'vsftpd啟動成功' #測試驗證 chmod777/var/ftp/pub touch/var/ftp/pub/1.txt ip=`ifconfigeth1|sed-n'2p'|sed's/.*addr:(.*)Bcast.*/1/g'` cd/tmp lftp$ip<
17.寫一個自動檢測磁盤使用率的腳本,當磁盤使用空間達到90%以上時,需要發(fā)送郵件給相關人員
#!/bin/bash #Name:check_space.sh #Desc:checkdiskspace /bin/df-h>df.txt use=`catdf.txt|awk'{print$5}'|grep-o'[0-9]+'` foriin$use do [$i-ge90]&&echonoticediskspace:`grep$idf.txt`|mailtom done rm-fdf.txt
18.寫一個腳本監(jiān)控系統(tǒng)內存和交換分區(qū)使用情況
#!/bin/bash OIFS=$IFS初始化默認分隔符 IFS=" "定義默認分隔符 file=`free-m|sed-nr'/Mem|Swap/p'|awk'{print$4,$2}'` mem=`echo$file|head-1` swap=`echo$file|tail-1` echo$mem|awk'{if(($1/$2)*100<=50)?print?"物理內存空間需要留意,剩余"$1"M";else?print?"物理內存在正常范圍"}' ??echo?$swap?|awk?'{if(($1/$2)*100<=50)?print?"交換空間需要留意,剩余"$1"M";else?print?"交換空間在正常范圍"}'#!/bin/bash #監(jiān)控系統(tǒng)內存和交換分區(qū)使用情況 #/shell05/free.sh #取當前時間 date>>/tmp/date.txt #取物理內存free值 echo"Mem-free:`free-m|grepMem|awk'{print$4}'`M">>/tmp/mem-free.txt #取緩沖區(qū)free值 echo"buffers/cache-free:`free-m|grep-|awk'{print$4}'`M">>/tmp/buffers-free.txt #取Swap區(qū)free值 echo"Swap-free:`free-m|grepSwap|awk'{print$4}'`M">>/tmp/swap-free.txt #將時間與相關數(shù)據(jù)重新寫入新文件 paste/tmp/date.txt/tmp/mem-free.txt/tmp/buffers-free.txt/tmp/swap-free.txt>/tmp/free.txt #發(fā)送監(jiān)控郵件 mail-s"內存監(jiān)控報告"root@localhost/tmp/free.txt
19.輸入一個IP地址,使用腳本判斷其合法性:必須符合ip地址規(guī)范,第1、4位不能以0開頭,不能大于255不能小于0
#!/bin/bash #ValidIP #/shell05/valid.sh read-p"請輸入要檢查的IP:"IP ifecho$IP|grep-E"^([0-9]{1,3}.){3}[0-9]{1,3}$"&>/dev/null;then a1=`echo$IP|cut-d.-f1` a2=`echo$IP|cut-d.-f2` a3=`echo$IP|cut-d.-f3` a4=`echo$IP|cut-d.-f4` if[$a1-gt0-a$a1-le255-a$a2-le255-a$a3-le255-a$a4-gt0-a$a4-le255];then echo"$IPavailable!" else echo"$IPnotavailable!" fi else echo"IPformaterror!" fi
審核編輯:劉清
-
局域網
+關注
關注
6文章
790瀏覽量
48075 -
TMP
+關注
關注
0文章
15瀏覽量
32082 -
NFS
+關注
關注
1文章
56瀏覽量
26810 -
Shell
+關注
關注
1文章
373瀏覽量
25010
原文標題:這19個Shell腳本值得收藏!
文章出處:【微信號:網絡技術干貨圈,微信公眾號:網絡技術干貨圈】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
100個Linux Shell腳本總結
如何創(chuàng)建和執(zhí)行一個簡單的Linux shell腳本
109個實用shell腳本分享
shell腳本基礎知識
Linux Shell腳本經典案例分享

小編科普一下19個Shell腳本
評論