天天看點

Linux運維工程師面試題第五套

本次試題全部都是寫腳本,一共有十道題,說是面試,其實都是基礎的東西,enjoy it~

1、編寫個shell腳本将目前目錄下大于10K的檔案轉移到/tmp目錄下。

1

2

3

4

5

6

7

8

9

10

11

<code>#Author:Name</code>

<code>#E-mail:E-mail Address</code>

<code>#Description:Move some files        #寫程式的時候加上姓名,聯系方式和描述是一個好習慣。</code>

<code>#!/bin/bash</code>

<code>ls</code> <code>-l|</code><code>awk</code> <code>'$5&gt;10240 {print $9}'</code> <code>&gt;name.txt    </code><code>#先把大于10K的檔案名都儲存到name.txt的檔案</code>

<code>for</code> <code>filename </code><code>in</code> <code>$(</code><code>cat</code> <code>name.txt)    </code><code>#for循環,注意$()</code>

<code>    </code><code>do</code>

<code>        </code><code>mv</code> <code>$filename </code><code>/tmp</code>

<code>        </code><code>echo</code> <code>$filename </code><code>"is ok."</code>

<code>    </code><code>done</code>

<code>ls</code> <code>/tmp</code>

【評析】第一套裡的第十題跟這道題是一樣的,bash是可以使用find語句的,那樣寫比較省事。而且要注意像答案那麼寫的話,檔案夾也是有可能被選中,但是不用擔心,檔案夾不會被mv,會提示“略過目錄”。

2、編寫shell腳本擷取本機的網絡位址。

<code>#Auther:ChrisChan</code>

<code>#E-mail:[email protected]</code>

<code>#Description:Check IP address and Netmask</code>

<code>IP=$( </code><code>ifconfig</code> <code>eth0|</code><code>grep</code> <code>inet|</code><code>head</code> <code>-1|</code><code>cut</code> <code>-d : -f 2|</code><code>sed</code> <code>'s/Bcast//g'</code> <code>)</code>

<code>echo</code> <code>"這台機器的IP位址是"</code><code>$IP</code>

<code>NETMASK=$( </code><code>ifconfig</code> <code>eth0|</code><code>grep</code> <code>inet|</code><code>head</code> <code>-1|</code><code>cut</code> <code>-d : -f 3|</code><code>sed</code> <code>'s/Mask//g'</code> <code>)</code>

<code>echo</code> <code>"這台機器的網關是"</code><code>$NETMASK</code>

【評析】一條指令,用三個方法去不斷的縮小範圍,直到最後确定那幾個數字。

12

<code>#Description:Jurde a file is a c-file or not</code>

<code>read</code> <code>-t 10 -p </code><code>"請輸入一個檔案名:"</code> <code>Fname</code>

<code>if</code> <code>[ -c $Fname ]</code>

<code>    </code><code>then</code>

<code>    </code><code>cp</code> <code>$Fname </code><code>/dev</code>

<code>   </code><code>else</code>

<code>       </code><code>echo</code> <code>"WRONG!"</code>

<code>       </code><code>exit</code> <code>88</code>

<code>fi</code>

【評析】給一個變量指派有兩種方法,一種就是上面列出的read -p的形式,還有一種是這樣的

<a href="http://s2.51cto.com/wyfs02/M00/80/6A/wKiom1dAazrg_AzcAAA7WN0jQ3A251.png" target="_blank"></a>

4.請為下列shell程式添加注釋,并說明程式的功能和調用方法:

13

14

15

16

17

18

19

20

21

22

23

<code>#!/bin/sh    #這是一個bash語言</code>

<code># /etc/rc.d/rc.httpd    #啟動Apache</code>

<code># Start/stop/restart the Apache web server.    #啟動/停止/重新開機Apache</code>

<code># To make Apache start automatically at boot, make thisfile executable: chmod 755 /etc/rc.d/rc.httpd    #若要apache開機自啟動,就要讓rc.httpd這個檔案有755</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code> </code> 

<code>'start'</code><code>)  </code><code>#若第一個變量是start</code>

<code>/usr/sbin/apachectl</code> <code>start ;;    </code><code>#apache就啟動</code>

<code>'stop'</code><code>)    </code><code>#若第一個變量是stop</code>

<code>/usr/sbin/apachectl</code> <code>stop ;;    </code><code>#apache就停止</code>

<code>'restart'</code><code>)    </code><code>#若第一個變量是restart</code>

<code>/usr/sbin/apachectl</code> <code>restart ;;    </code><code>#apache就重新開機</code>

<code>*)    </code><code>#若第一個變量不是上面的任意一個</code>

<code>echo</code> <code>"usage $0 start|stop|restart"</code> <code>;;    </code><code>#提示操作人員</code>

<code>esac</code>    <code>#結構結束,這是case的反寫</code>

功能就是控制apache程式的,調用方法就是啟動/停止/關閉

5、設計一個shell程式,添加一個新組為class1,然後添加屬于這個組的30個使用者,使用者名的形式為stdxx,其中xx從01到30。

開頭略

<code>!</code><code>#/bin/sh    #解釋器是sh</code>

<code>groupadd class1    </code><code>#建立一個群組</code>

<code>i=1</code>

<code>while</code> <code>[ i -</code><code>le</code> <code>30 ]</code>

<code>    </code><code>do</code> 

<code>    </code><code>if</code> <code>[i -</code><code>le</code> <code>9 ]</code>

<code>        </code><code>Username=std0$i</code>

<code>    </code><code>else</code>

<code>        </code><code>Username=std$i</code>

<code>    </code><code>fi</code>

<code>    </code><code>Useradd $Username</code>

<code>    </code><code>mkdir</code> <code>/home/</code><code>$Username</code>

<code>    </code><code>chown</code> <code>-R $Username </code><code>/home/</code><code>$Username    </code><code>#-R是改變使用者和群組</code>

<code>    </code><code>chgrp</code> <code>-R class1 </code><code>/home/</code><code>$Username</code>

<code>    </code><code>let</code> <code>i =i+1    </code><code>#我喜歡用這個疊加,簡單粗暴還好用但是要注意格式。</code>

<code>done</code>

6、編寫shell程式,實作自動删除50個賬号的功能。賬号名為stud1至stud50。

#開頭省略

<code>while</code> <code>[ $i -</code><code>le</code> <code>50 ]</code>

<code>    </code><code>userdel -r stud$i    </code><code>#這裡使用stud${i}</code>

<code>    </code><code>let</code> <code>i=i+1</code>

7.某系統管理者需每天做一定的重複工作,請按照下列要求,編制一個解決方案:

(1)在下午4 :50删除/abc目錄下的全部子目錄和全部檔案;

(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1檔案中每行第一個域的全部資料加入到/backup目錄下的bak01.txt檔案内;

(3)每逢星期一下午5:50将/data目錄下的所有目錄和檔案歸檔并壓縮為檔案:backup.tar.gz;

(4)在下午5:55将IDE接口的CD-ROM解除安裝(假設:CD-ROM的裝置名為hdc);

(5)在早晨8:00前開機後啟動。

#crontab -e先

(1)50 16 * * * rm -rf /abc/*

(2)1 8-18/1 * * * cut /xyz/x1 -f 1 &gt;&gt;/backup/bak01.txt

(3)50 17 * * 1 tar zcvf backup.tar.gz /data

(4)55 17 * * * umount /dev/hdc

(5)這個需要在root使用者登入的前提下操作, 而且這題出的有問題,不知道要啟動什麼。

【評析】每個使用者都會生成一個自己的crontab檔案,這個檔案一般位于/var/spool/cron,這個檔案裡的計劃任務是專門針對于root這個使用者的,如果使用#crontab -r那就會删除掉目前使用者的crontab的檔案。

8、有一普通使用者想在每周日淩晨零點零分定期備份/user/backup到/tmp目錄下,該使用者應如何做?

crontab -e

0 0 * * 0 cp /user/backup /tmp

【評析】五個*裡最後一個*的取值範圍是0~7,其中0和7都是代表星期天,可以寫成sun,/etc/crontab的文檔原話是這麼寫的:day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

9、設計一個Shell程式,在/userdata目錄下建立50個目錄,即user1~user50,并設定每個目錄的權限,其中其他使用者的權限為:讀;檔案所有者的權限為:讀、寫、執行;檔案所有者所在組的權限為:讀、執行。

<code>#開頭略</code>

<code>#!/bin/bash </code>

<code>while</code> <code>[ i -</code><code>le</code> <code>50 ]</code>

<code>        </code><code>mkdir</code> <code>-p -m 764 </code><code>/userdata/user</code><code>$i</code>

<code>        </code><code>echo</code><code>"第"</code><code>$i</code><code>"個目錄已經生成,權限是764."</code>

<code>        </code><code>let</code> <code>i=i+1</code>

【評析】mkdir -p是遞歸生成目錄,再加上-m 就是在生成目錄的時候直接賦予權限。

如果要是使用mkdir下生成一個樹形的目錄,mkdir -vp BBB/{CCC/,EEE/{FFF/,GGG/},KKK/,III/{OOO/,PPP/}},這樣生成了一個樹形檔案。

如果隻是在/userdata/下生成user1~user50的檔案,其實不用那麼費勁,#cd /userdata/ &amp;&amp; touch user{1..50}即可。

10、設計一個shell程式,在每月第一天備份并壓縮/etc目錄的所有内容,存放在/root/bak目錄裡,且檔案名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程式fileback存放在/usr/bin目錄下。

做一個腳本先

#cd /usr/bin

#vim fileback.sh

<code>YY=$( </code><code>date</code> <code>+ %y )</code>

<code>MM=$( </code><code>date</code> <code>+ %m )</code>

<code>DD=$( </code><code>date</code> <code>+ %d )    </code><code>#注意格式,注意格式~</code>

<code>tar</code> <code>-zcvf </code><code>/root/bak/</code><code>$YY$MM$DD </code><code>/etc/</code><code>*    </code><code>#将/etc目錄下的所有檔案都打包壓縮成etc.bak檔案</code>

儲存之後,添加計劃任務

#crontab -e

1 1 1 * * sh /usr/bin/fileback.sh

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1743037