29個運維經典面試題

前言

這篇博文參考阿銘linux-28個運維經典面試題,並對其中的一些題目進行擴展和解析。
如有侵權,請聯繫我刪除~再次感謝阿銘老師的分享。

大家有空可以看看阿銘老師的教程~

第一題:Linux如何掛載windows下的共享目錄?

mount.cifs //IP地址/server /mnt/server -o user=administrator,password=123456

linux 下的server需要自己手動建一個 後面的user與pass 是windows主機的賬號和密碼 注意空格 和逗號


第二題:如何查看http的併發請求數與其TCP連接狀態?

語法格式如下:

netstat -n | awk '/^tcp/ {++b[$NF]} END {for(a in b) print a,"\t",b[a]}'

如結合netstat和awk命令來統計網絡連接數:

# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

會得到類似下面的結果,具體數字會有所不同:

TIME_WAIT    92
CLOSE_WAIT   164
FIN_WAIT1    14
SYN_SENT     25
ESTABLISHED      198
FIN_WAIT2    436
SYN_RECV     11

狀態描述:

  • CLOSED:無連接是活動的或正在進行

  • LISTEN:服務器在等待進入呼叫

  • SYN_RECV:一個連接請求已經到達,等待確認

  • SYN_SENT:應用已經開始,打開一個連接

  • ESTABLISHED:正常數據傳輸狀態

  • FIN_WAIT1:應用說它已經完成

  • FIN_WAIT2:另一邊已同意釋放

  • ITMED_WAIT:等待所有分組死掉

  • CLOSING:兩邊同時嘗試關閉

  • TIME_WAIT:另一邊已初始化一個釋放

  • LAST_ACK:等待所有分組死掉

也就是說,這條命令可以把當前系統的網絡連接狀態分類彙總。

下面解釋一下爲什麼要這樣寫:

一個簡單的管道符連接了netstat和awk命令。

先來看看netstat:

# netstat -n

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT

你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。

再來看看awk

  • /^tcp/

濾出tcp開頭的記錄,屏蔽udp, socket等無關記錄。

  • state[]

相當於定義了一個名叫state的數組

  • NF(Number of Field,當前記錄的field個數)

表示記錄的字段數,如上所示的記錄,NF等於6

  • $NF

表示某個字段的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是TIME_WAIT

  • state[$NF]

表示數組元素的值,如上所示的記錄,就是state[TIME_WAIT]狀態的連接數

  • ++state[$NF]

表示把某個數加一,如上所示的記錄,就是把state[TIME_WAIT]狀態的連接數加一

  • END

表示在最後階段要執行的命令

  • for(key in state)

遍歷數組

  • print key,"\t",state[key]

打印數組的鍵和值,中間用\t製表符分割,美化一下。

如發現系統存在大量TIME_WAIT狀態的連接,通過調整內核參數解決:

vim /etc/sysctl.conf

編輯文件,加入以下內容:

net.ipv4.tcp_syncookies = 1 //表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN***,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1  //表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1  //表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
net.ipv4.tcp_fin_timeout = 30  //修改系統默認的 TIMEOUT 時間

然後執行 /sbin/sysctl -p 讓參數生效。

下面附上TIME_WAIT狀態的意義:
客戶端與服務器端建立TCP/IP連接後關閉SOCKET後,服務器端連接的端口狀態爲TIME_WAIT。是不是所有執行主動關閉的socket都會進入TIME_WAIT狀態呢?有沒有什麼情況使主動關閉的socket直接進入CLOSED狀態呢?
主動關閉的一方在發送最後一個 ack 後,就會進入TIME_WAIT 狀態 停留2MSL(max segment lifetime)時間,這個是TCP/IP必不可少的,也就是“解決”不了的。

也就是TCP/IP設計者本來是這麼設計的,主要有兩個原因:

(1)防止上一次連接中的包,迷路後重新出現,影響新連接。經過2MSL,上一次連接中所有的重複包都會消失。

(2)可靠的關閉TCP連接。在主動關閉方發送的最後一個 ack(fin) ,有可能丟失,這時被動方會重新發 fin,如果這時主動方處於 CLOSED 狀態 ,就會響應 rst 而不是 ack。所以主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。

TIME_WAIT 並不會佔用很大資源的,除非受到***。還有,如果一方 send 或 recv 超時,就會直接進入 CLOSED 狀態!

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

netstat -tna | cut -b 49- |grep TIME_WAIT | sort 取出目前所有 TIME_WAIT 的連接 IP ( 排序過 )

net.ipv4.tcp_syncookies = 1 //表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN***,默認爲0,表示關閉;

net.ipv4.tcp_tw_reuse = 1 //表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;

net.ipv4.tcp_tw_recycle = 1 //表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉;

net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間;

net.ipv4.tcp_keepalive_time = 1200 //表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改爲20分鐘;

net.ipv4.ip_local_port_range = 1024 65000 //表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改爲1024到65000;

net.ipv4.tcp_max_syn_backlog = 8192 //表示SYN隊列的長度,默認爲1024,加大隊列長度爲8192,可以容納更多等待連接的網絡連接數;

net.ipv4.tcp_max_tw_buckets = 5000 //表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認爲180000,改 爲5000。對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參 數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。

在懷疑有Dos***的時候,可以輸入:

利用netstat和awk發現並阻止DDoS***

netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':' | awk -F: '{print $1}' | sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}' | sed 's/^.*$/iptables -I firewall 1 -p tcp -s & --dport 80 --syn -j REJECT/' | sh

先把衝擊量最大的前50個IP給封了.

還可以加幾個例外的白名單IP:

netstat -na | grep :80 |awk '{print $5}'|awk -F '::ffff:' '{print $2}' | grep ':' | awk -F: '{print $1}' | sort | uniq -c | sort -r | awk -F' ' '{if ($1 > 50) print $2}' | grep -v xxx.xxx.xxx.xxx | sed 's/^.*$/iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s & --dport 80 --syn -j REJECT/' | sh

以上的命令還沒有實際考證過, 放在這裏做參考.

參考文檔:結合netstat和awk命令來統計網絡連接數


第三題:如何用tcpdump嗅探80端口的訪問看看誰最高?

# tcpdump -i eth0 -tnn dst port 80 -c 1000 |awk -F "," '{print $1"."$2"."$3"."$4"."}'|sort |uniq -c|sort -nr|head -5

第四題:如何查看/var/log目錄下的文件數?

# ls -lR /var/log |grep "-"|wc -l  //文件與目錄的總個數

第五題:如何查看Linux系統每個ip的連接數?

# netstat -n|head -n 100|awk '/^tcp/ {print $4}'|awk -F ":" '{print $1}'|sort |uniq -c|sort -rn
     42 123.78.121.167
     29 10.145.134.120
     27 127.0.0.1

第六題:shell下生成32位隨機密碼

# cat /dev/urandom |head -1 |md5sum |head -c 32

第七題:統計出apache的access.log中訪問量最多的5個ip

# cat access.log |awk '{print $1}'|sort |uniq -c |sort -nr|head -n5
    353 100.112.231.35
    349 100.136.223.222
    345 100.134.222.111
    343 100.123.224.156
    340 100.125.231.232

第八題:如何查看二進制文件的內容?

我們一般通過hexdump命令 來查看二進制文件的內容。hexdump -C XXX(文件名) -C是參數 不同的參數有不同的意義:

  • -C 是比較規範的 十六進制和ASCII碼顯示

  • -c 是單字節字符顯示

  • -b 單字節八進制顯示

  • -o 是雙字節八進制顯示

  • -d 是雙字節十進制顯示

  • -x 是雙字節十六進制顯示

第九題:ps aux 中的VSZ代表什麼意思,RSS代表什麼意思?

VSZ:虛擬內存集,進程佔用的虛擬內存空間;RSS:物理內存集,進程佔用實際物理內存空間。


第十題:如何檢測並修復/dev/hda5?

fsck用來檢查和維護不一致的文件系統。若系統掉電或磁盤發生問題,可利用fsck命令對文件系統進行檢查。


第十一題:介紹下Linux系統的開機啓動順序

加載BIOS–>讀取MBR–>Boot Loader–>加載內核–>用戶層init用inittab文件來設定系統運行的等級(一般3或者5,3是多用戶命令行,5是界面)–>init進程執行rc.syninit–>啓動內核模塊–>執行不同級別運行的腳本程序–>執行/etc/rc.d/rc.local(本地運行服務)–>執行/bin/login,就可以登錄了。


第十二題:符號鏈接與硬鏈接的區別

我們可以把符號鏈接,也就是軟連接 當做是 windows系統裏的 快捷方式。硬鏈接就好像是又複製了一份,舉例說明:

ln 3.txt 4.txt 這是硬鏈接,相當於複製,不可以跨分區,但修改3,4會跟着變,若刪除3,4不受任何影響。

ln -s 3.txt 4.txt 這是軟連接,相當於快捷方式。修改4,3也會跟着變,若刪除3,4就壞掉了。不可以用了。


第十三題:保存當前磁盤分區的分區表

dd 命令是以個強大的命令,在複製的同時進行轉換:

# dd  if=/dev/sda of=./mbr.txt bs=1 count=512

第十四題:如何在文本里面進行復制、粘貼,刪除行,刪除全部,按行查找和按字母查找?

注意⚠️:以下操作全部在命令行狀態操作,不要在編輯狀態操作。

  • 在文本里 移動到想要複製的行 按yy 想複製到哪就移動到哪,然後按P 就黏貼了;

  • 刪除行 移動到改行 按dd;

  • 刪除全部 dG 這裏注意G一定要大寫;

  • 按行查找 :90 這樣就是找到第90行;

  • 按字母查找 /path 這樣就是 找到path這個單詞所在的位置,文本里可能存在多個,多次查找會顯示在不同的位置;

第十五題:手動安裝grub

# grub-install /dev/sda

第十六題:修改內核參數

vi /etc/sysctl.conf 這裏修改參數
sysctl -p 刷新後可用

第十七題:在1-39內取隨機數

# expr $(($RANDOM%39+1))  //RANDOM隨機數,%39取餘數範圍0-38

第十八題:限制apache每秒新建連接數爲1,峯值爲3

每秒新建連接數 一般都是由防火牆來做,apache本身好像無法設置每秒新建連接數,只能設置最大連接:

# iptables -A INPUT -d 172.16.100.1 -p tcp –dport 80 -m limit –limit 1/second -j ACCEPT

第十九題:FTP的主動模式和被動模式

FTP協議有兩種工作方式:PORT方式和PASV方式,中文意思爲主動式和被動式。

PORT(主動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,客戶端在命令鏈路上用 PORT 命令告訴服務器:“我打開了XX端口,你過來連接我”。於是服務器從20端口向客戶端的 XX 端口發送連接請求,建立一條數據鏈路來傳送數據。

PASV(被動)方式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時,服務器在命令鏈路上用PASV 命令告訴客戶端:“我打開了XX端口,你過來連接我”。於是客戶端向服務器的 XX 端口發送連接請求,建立一條數據鏈路來傳送數據。

從上面可以看出,兩種方式的命令鏈路連接方法是一樣的,而數據鏈路的建立方法就完 全不同。


第二十題:顯示/etc/inittab中以#開頭,且後面跟了一個或者多個空白字符,而後又跟了任意非空白字符的行

# grep "^#\{1,\}[ ^ ]" /etc/inittab
# inittab is no longer used when using systemd.
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To view current default target, run:
# systemctl get-default
# To set a default target, run:
# systemctl set-default TARGET.target

第二十一題:顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行

# grep "\:[0-9]\{1\}:" /etc/inittab

第二十二題:怎麼把腳本添加到系統服務裏,即用service來調用?

在腳本里加入:

#!/bin/bash
# chkconfig: 345 85 15
# description: httpd

然後保存,chkconfig httpd –add 創建系統服務,現在就可以使用service 來 start or restart~


第二十三題:寫一個腳本,實現批量添加20個用戶,用戶名爲user01-20,密碼爲user後面跟5個隨機字符

#!/bin/bash
#description: useradd
for i in $(seq -f"%02g" 1 20);do
useradd user$i
echo "user$i-$(echo $RANDOM|md5sum|cut -c 1-5)"|passwd –stdinuser$i >/dev/null 2>&1
done

第二十四題:寫一個腳本,實現判斷192.168.1.0/24網絡裏,當前在線的IP有哪些,能ping通則認爲在線

#!/bin/bash
for ip in $(seq 1 255)
do
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
done
wait

第二十五題:使用for循環批量修改文件擴展名

詳見shell練習題:使用for循環批量修改文件擴展名


第二十六題:通過腳本判斷遠程Web服務器狀態碼是否正常

詳見通過腳本判斷遠程Web服務器狀態碼是否正常


第二十七題:Shell函數+case 應用

現在好多企業喜歡使用Svn,隨着公司業務和人員的增加,運維人員需要對公司的svn平臺有個比較直觀的認識,如人員的增刪,人員查詢等。

下面的代碼的作用是:一鍵添加、查找和查找人員信息:

詳見老男孩shell實戰讀書筆記 (6-10章節)


第二十八題:接入郵件和微信提供報警信息服務思路

詳見接入郵件和微信提供報警信息服務


第二十九題:如何讓history命令顯示具體時間?

$ HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
$ export HISTTIMEFORMAT

$ history
    1  2019-01-10 13:15:28cd
    2  2019-01-10 13:15:31HISTTIMEFORMAT=”%Y-%m-%d %H:%M:%S”
    3  2019-01-10 13:15:40HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"
    4  2019-01-10 13:15:47export HISTTIMEFORMAT
    5  2019-01-10 13:15:49history

重新開機後會還原,可以寫 /etc/profile 裏。

參考文檔

阿銘linux-28個運維經典面試題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章