一、企業Shell面試題1:批量生成隨機字符文件名案例html
使用for循環在/oldboy目錄下批量建立10個html文件,其中每一個文件須要包含10個隨機小寫字母加固定字符串oldboy,名稱示例以下:mysql
1
2
3
4
5
|
[root@oldgirl C19]# ls /oldboy
apquvdpqbk_oldboy.html mpyogpsmwj_oldboy.html txynzwofgg_oldboy.html
bmqiwhfpgv_oldboy.html mtrzobsprf_oldboy.html vjxmlflawa_oldboy.html
jhjdcjnjxc_oldboy.html qeztkkmewn_oldboy.html
jpvirsnjld_oldboy.html ruscyxwxai_oldboy.html
|
解答:nginx
#!/bin/sh [ ! -d /oldboy ] && mkdir /oldboy -p for i in {01..10} do pass=`uuidgen|cut -c 1-10` touch /oldboy/${pass}_oldboy.html done
二、企業Shell面試題2:批量更名特殊案例web
將以上面試題中結果文件名中的oldboy字符串所有改爲oldgirl(最好用for循環實現),而且將擴展名html所有改爲大寫面試
解答:sql
方法一:
#!/bin/sh for i in `ls /oldboy/*.html` do mv $i `echo $i|sed 's#oldboy.html#oldgirl.HTML#g'` done
方法二: rename oldboy.html oldgirl.HTML *.html
方法三: #!/bin/sh cd /oldboy &&\ for i in `ls` do str=`echo $i|cut -c -10` mv ${str}_oldboy.html ${str}_oldgril.HTML done
三、企業Shell面試題3:批量建立特殊要求用戶案例shell
批量建立10個系統賬號oldboy01-oldboy10並設置密碼(密碼爲隨機數,要求字符和數字等混合)
數據庫
解答:數組
#!/bin/bash for n in {01..10} do pass=`uuidgen|cut -c 1-10` id oldboy$n &>/dev/null if [ $? -ne 0 ];then useradd oldboy$n echo $pass|passwd --stdin oldboy$n &>/dev/null echo -e "user: oldboy$n pass: $pass" >>/tmp/user.log else echo "oldboy$n 已存在" fi done
四、企業Shell面試題4:掃描網絡內存活主機案例緩存
寫一個Shell腳本,判斷10.0.0.0/24網絡裏,當前在線的IP有哪些?
解答:
#!/bin/sh . /etc/init.d/functions for ip in {1..254} do ping -c2 -W1 10.0.0.$ip &>/dev/null if [ $? -eq 0 ] then action "10.0.0.$ip" /bin/true fi done
五、企業Shell面試題5:解決DOS攻擊生產案例
寫一個Shell腳本解決DOS攻擊生產案例。請根據web日誌或者或者網絡鏈接數,監控當某個IP併發鏈接數或者短時內PV達到100(讀者根據實際狀況設定),即調用防火牆命令封掉對應的IP。防火牆命令爲:iptables-I INPUT -s IP地址 -j DROP
解答:
#!/bin/sh while true do awk '{print $1}' access.log |sort |uniq -c >/tmp/ip.log#分析web訪問日誌 #netstat -an|grep EST|awk -F "[ :]+" '{print $6}'|sort|uniq -c#經過網絡鏈接線 while read line do ip=`echo $line|awk '{print $2}'` count=`echo $line|awk '{print $1}'` if [ $count -gt 100 ] && [ `iptables -L -n|grep $ip|wc -l` -lt 1 ] then iptables -I INPUT -s $ip -j DROP echo "$line is dropped" >>/tmp/drop_ip.log fi done </tmp/ip.log sleep 5 done
iptables查看結果
[root@m01 ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 140.205.225.206 0.0.0.0/0 DROP all -- 140.205.225.205 0.0.0.0/0 DROP all -- 140.205.225.200 0.0.0.0/0 DROP all -- 140.205.225.188 0.0.0.0/0 DROP all -- 140.205.201.43 0.0.0.0/0 DROP all -- 140.205.201.40 0.0.0.0/0 DROP all -- 140.205.201.37 0.0.0.0/0 DROP all -- 140.205.201.30 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination
六、企業Shell面試題6:腳本實現MySQL數據庫分庫備份
#!/bin/sh Myuser=root Mypass=123456 Mycmd="mysql -u$Myuser -p$Mypass" Mydump="mysqldump -u$Myuser -p$Mypass -x -B -F -R" Dblist=`$Mycmd -e "show databases;"|sed '1,2d'|egrep -v "_schema|mysql"` for database in $Dblist do $Mydump $database|gzip >/tmp/${database}_$(date +%F).sql.gz &>/dev/null done
七、企業Shell面試題7:腳本實現MySQL數據庫分庫分表備份
#!/bin/sh Myuser=root Mypass=123456 Mycmd="mysql -u$Myuser -p$Mypass" Mydump="mysqldump -u$Myuser -p$Mypass -x -F -R" Dblist=`$Mycmd -e "show databases;"|sed '1,2d'|egrep -v "_schema|mysql"` for database in $Dblist do Tablist=`$Mycmd -e "show tables from $database;"|sed 1d` for table in $Tablist do mkdir -p /tmp/${database} $Mydump $database $table|gzip >/tmp/${database}/${table}_$(date +%F).sql.gz done done
八、企業Shell面試題8:篩選符合長度的單詞案例
利用bash for循環打印下面這句話中字母數不大於6的單詞(某企業面試真題)。
I am oldboy teacher welcome to oldboy training class
解答:
方法一:
#!/bin/sh for word in I am oldboy teacher welcome to oldboy training class do if [ ${#word} -le 6 ] then echo $word fi done
方法二:數組 #!/bin/sh word=(I am oldboy teacher welcome to oldboy training class) for((i=0;i<${#word[*]};i++)) do if [ `echo ${word[i]}|wc -L` -le 6 ] then echo ${word[i]} fi done
方法三:awk echo "I am oldboy teacher welcome to oldboy training class"|awk '{for(i=1;i<=NF;i++)if(length($i)<=6)print $i}'
九、企業Shell面試題9:MySQL主從複製異常監控案例
十、企業Shell面試題10:比較整數大小經典案例
綜合實戰案例:開發shell腳本分別實現以腳本傳參以及read讀入的方式比較2個整數大小。用條件表達式(禁止if)進行判斷並以屏幕輸出的方式提醒用戶比較結果。注意:一共是開發2個腳本。當用腳本傳參以及read讀入的方式須要對變量是否爲數字、而且傳參個數不對給予提示
解答:
傳參的方法: #!/bin/sh num1=$1 num2=$2 [ $# -ne 2 ] && echo "請輸入兩個數字:" && exit 1 expr 1 + $num1 &>/dev/null [ $? -eq 2 ] && echo "輸入的第一個數字不是整數" && exit 2 expr 1 + $num2 &>/dev/null [ $? -eq 2 ] && echo "輸入的第二個數字不是整數" && exit 2 [ $num1 -lt $num2 ] && echo "$num1<$num2" && exit 0 [ $num1 -eq $num2 ] && echo "$num1=$num2" && exit 0 echo "$num1>$num2"
read讀入方法: #!/bin/sh read -p "請輸入第一個數字:" num1 read -p "請輸入第二個數字:" num2 expr 1 + $num1 &>/dev/null [ $? -eq 2 ] && echo "輸入的第一個數字不是整數" && exit 2 expr 1 + $num2 &>/dev/null [ $? -eq 2 ] && echo "輸入的第二個數字不是整數" && exit 2 [ $num1 -lt $num2 ] && echo "$num1<$num2" && exit 0 [ $num1 -eq $num2 ] && echo "$num1=$num2" && exit 0 echo "$num1>$num2"
十一、企業Shell面試題11:菜單自動化軟件部署經典案例
1
2
3
4
5
6
7
8
9
10
11
12
13
|
綜合實例:打印選擇菜單,按照選擇一鍵安裝不一樣的Web服務。
示例菜單:
[root@oldboy scripts]# shmenu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
一、當用戶輸入1時,輸出「startinstalling lamp.提示」而後執行/server/scripts/lamp.sh,腳本內容輸出
"lampis installed"
後退出腳本,工做中就是正式lamp一鍵安裝腳本;
二、當用戶輸入2時,輸出「startinstalling lnmp.提示」 而後執行/server/scripts/lnmp.sh輸出
"lnmpis installed"
後退出腳本,工做中就是正式lnmp一鍵安裝腳本;
三、當輸入3時,退出當前菜單及腳本;
四、當輸入任何其它字符,給出提示「Input error」後退出腳本;
五、要對執行的腳本進行相關的條件判斷,例如:腳本文件是否存在,是否可執行等判斷,儘可能用上前面講解的知識點。
|
解答:
#!/bin/sh . /etc/init.d/functions cat<<EOF =================================== 1.[install lamp] 2.[install lnmp] 3.[install nfs] 4.[exit] =================================== EOF while true do read -p "pls input the num you want:" num case $num in 1) /bin/sh /server/scripts/lamp.sh action "startinstalling lamp..." /bin/true ;; 2) /bin/sh /server/scripts/lnmp.sh action "startinstalling lnmp..." /bin/true ;; 3) /bin/sh /server/scripts/nfs.sh action "startinstalling nfs..." /bin/true ;; 4) exit ;; *) echo "對不起,輸入錯誤,請從新輸入" esac done
十二、企業Shell面試題12:Web及MySQL服務異常監測案例
①經過端口: #!/bin/sh . /etc/init.d/functions port=`lsof -i:80|grep nginx|wc -l` if [ $port -ge 2 ];then action "Nginx is running" /bin/true else action "Nginx is not running" /bin/false /application/nginx/sbin/nginx action "starting Nginx" /bin/true fi
②經過進程: #!/bin/sh . /etc/init.d/functions port=`ps -ef|grep nginx|grep -v grep|wc -l` if [ $port -ge 2 ];then action "Nginx is running" /bin/true else action "Nginx is not running" /bin/false /application/nginx/sbin/nginx action "starting Nginx" /bin/true fi
③wget返回內容: #!/bin/sh . /etc/init.d/functions port=`wget -T 5 --spider http://172.19.5.8 &>/dev/null` if [ $? -eq 0 ];then action "Nginx is running" /bin/true else /application/nginx/sbin/nginx action "starting Nginx" /bin/true fi
④curl返回值200: #!/bin/sh . /etc/init.d/functions port=`curl -s -I -w "%{http_code}\n" 172.19.5.8 -o /dev/null` if [ "$port" == "200" ];then action "Nginx is running" /bin/true else /application/nginx/sbin/nginx action "starting Nginx" /bin/true fi
1三、企業Shell面試題13:監控Memcached緩存服務是否正常
1
2
|
監控Memcached緩存服務是否正常,模擬用戶(web客戶端)檢測。
使用nc命令加上
set
/
get
來模擬檢測。
|
1四、企業Shell面試題14:開發腳本入侵檢測與報警案例
1
|
面試及實戰考試題:監控web站點目錄(/
var
/html/www)下全部文件是否被惡意篡改(文件內容被改了),若是有就打印改動的文件名(發郵件),定時任務每3分鐘執行一次。
|
1五、企業Shell面試題15:開發Rsync服務啓動腳本案例
#!/bin/bash . /etc/init.d/functions port=`netstat -lntup|grep 873|wc -l` if [ ! -f /etc/rsyncd.conf ] then action "rsync配置" /bin/false exit 1 elif [ ! -f /usr/bin/rsync ] then action "rsync命令" /bin/false exit fi case "$1" in start) if [ $port -lt 2 ];then rsync --daemon action "Starting rsync..." /bin/true else action "Rsync is running..." /bin/true fi ;; stop) if [ $port -ge 2 ];then killproc rsync action "Stopping rsync..." /bin/true else action "Rsync is not running..." /bin/true fi ;; restart) killproc rsync rsync --daemon action "Rsync is restarting." /bin/true ;; *) echo "USAGE:$0 {start|stop|restart}" esac
1六、企業Shell面試題16:開發MySQL多實例啓動腳本
1
2
3
4
5
|
開發MySQL多實例啓動腳本:
已知MySQL多實例啓動命令爲:mysqld_safe --defaults-file=/data/3306/my.cnf&
中止命令爲:mysqladmin -u root -poldboy123 -S/data/3306/mysql.sock shutdown
請完成mysql多實例啓動啓動腳本的編寫
要求:用函數,
case
語句、
if
語句等實現。
|
解答:
#!/bin/bash . /etc/init.d/functions Port="3306" Myuser="root" Mypass="123456" Mysock="/data/$Port/mysql.sock" function_start(){ if [ ! -e "$Mysock" ];then /application/mysql/bin/mysqld_safe --defaults-file=/data/$Port/my.cnf &>/dev/null & action "Starting MySQL..." /bin/true else action "MySQL is running..." /bin/true exit fi } function_stop(){ if [ ! -e "$Mysock" ];then action "MySQL is not running..." /bin/false exit else action "Stopping MySQL..." /bin/true /application/mysql/bin/mysqladmin -u$Myuser -p$Mypass -S $Mysock shutdown fi } function_restart(){ function_stop sleep 2 function_start action "MySQL is restarting..." /bin/true } case "$1" in start) function_start ;; stop) function_stop ;; restart) function_restart ;; *) echo "USAGE: /data/$Port/mysql{start|stop|restart}" esac
1七、企業Shell面試題17:破解RANDOM隨機數案例
1
2
3
4
5
6
|
已知下面的字符串是經過RANDOM隨機數變量md5sum後,再截取一部分連續字符串的結果,請破解這些字符串對應的使用md5sum處理前的RANDOM對應的數字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
|
解答:生成密碼字典
#!/bin/sh for i in {0..32767} do screct=`echo $i|md5sum` echo "$i $screct" >>/tmp/file.txt done
過濾出對應密碼字符串
[root@m01 ~]# egrep '21029299|00205d1c|a3da1677|1f6d12dd|890684b' /tmp/file.txt 1346 00205d1cbbeb97738ad5bbdde2a6793d - 7041 1f6d12dd61b5c7523f038a7b966413d9 - 10082 890684ba3685395c782547daf296935f - 25345 a3da1677501d9e4700ed867c5f33538a - 25667 2102929901ee1aa769d0f479d7d78b05 -
1八、企業Shell面試題18:批量檢查多個網站地址是否正常
1
2
3
4
5
6
7
8
9
|
企業面試題:批量檢查多個網站地址是否正常
要求:
一、使用shell數組方法實現,檢測策略儘可能模擬用戶訪問。
二、每10秒鐘作一次全部的檢測,沒法訪問的輸出報警。
三、待檢測的地址以下
http:
//blog.oldboyedu.com
http:
//blog.etiantian.org
http:
//oldboy.blog.51cto.com
http:
//10.0.0.7
|
解答:
#!/bin/sh . /etc/init.d/functions Url=( http://blog.oldboyedu.com http://blog.etiantian.org http://oldboy.blog.51cto.com http://10.0.0.7 ) for i in ${Url[*]} do port=`curl -s -I -w "%{http_code}\n" $i -o /dev/null` if [ $port -eq 200 ];then action "$i" /bin/true else action "$i" /bin/false fi done
1九、企業Shell面試題19:單詞及字母去重排序案例
1
2
3
4
|
用shell處理如下內容
一、按單詞出現頻率降序排序!
二、按字母出現頻率降序排序!
the squid project provides a number ofresources to assist users design,implement and support squid installations.Please browse the documentation and support sections
for
more infomation,byoldboy training.
|
解答:
20、企業Shell面試題20:開發腳本管理服務端LVS案例
1
2
|
請在LVS負載均衡主節點上,開發管理LVS服務的腳本ip_vs。
實現:利用ipvsadm能夠啓動並配置好LVS服務,腳本形式:/etc/init.d/lvs{start|stop|restart}
|
解答:
2一、企業Shell面試題21:LVS節點健康檢查及管理腳本案例
1
2
|
請在LVS負載均衡主節點上,模擬keepalived健康檢查功能管理LVS節點,
當節點掛掉從服務器池中剔除,好了再加到服務器池中來。
|
解答:
2二、企業Shell面試題22:LVS客戶端配置腳本案例
1
2
|
請在LVS客戶端節點上,開發LVS客戶端設置VIP以及抑制ARP的管理腳本
實現:/etc/init.d/lvsclient{start|stop|restart}
|
解答:
2三、企業Shell面試題23:模擬keepalved軟件高可用案例
1
|
請在LVS服務端備用節點上,模擬keepalved vrrp功能,監聽主節點,若是主節點不可訪問則備節點啓動並配置LVS實現接管主節點的資源提供服務(提醒:注意ARP緩存),提示此題要藉助19.1.21的功能
|
解答:
2四、企業Shell面試題24:Nginx負載節點狀態監測案例
1
|
開發經過Web界面展現監控Nginx代理節點狀態,效果圖以下,當節點宕機時,以紅色展現,當節點正常時以綠色展現
|
解答:
2五、企業Shell面試題30:企業代碼上線發佈系統案例
1
|
寫一套簡單的企業代碼上線發佈系統案例,利用SVN對代碼及配置文件進行管理,在辦公室服務器上從svn取出指定版本的代碼和配置,發佈到IDC機房分發機服務器上,在分發服務器或者負載均衡器上或者應用服務器本地實現代碼平滑發佈、上線、回滾腳本(具體設計請參考課堂講解的企業代碼發佈方案)。
|
解答:
2六、企業Shell面試題26:51CTO博文爬蟲案例
1
2
3
4
5
6
7
8
9
10
11
|
獲取51CTO博客列表倒序排序考試題
老男孩教育培訓機構需求:需求入下:
請把http:
//oldboy.blog.51cto.com地址中的全部博文,按照時間倒序列表以下:
2013-09-13運維就是一場沒有硝煙的戰爭
http:
//oldboy.blog.51cto.com/2561410/1296694
2016-04-17運維人員寫項目方案及推動項目的基本流程思路
http:
//oldboy.blog.51cto.com/2561410/1764820
附加:高級要求:
生成html頁面,並設置超連接。
結果以下:
http:
//oldboy.blog.51cto.com/2561410/1862041
|
解答:
#!/bin/sh Uri="http://blog.51cto.com/oldboy/p" Html_list=/tmp/html/oldboy_blog.html [ ! -d /tmp/html ] && mkdir -p /tmp/html for i in {1..29} do curl -s $Uri$i|grep -A 5 "time fl"|sed '/^.*zan fr.*/,+2d'|sed 's#^--$#<br>#g'|sed 's#<a.*fl">發佈於:#<a>#g'|sed 's#<sp.*an>##g' >>$Html_list echo '<br>' >>$Html_list done