1. 程式人生 > >Linux面試題總結

Linux面試題總結

linux面試題(部分試題為網上摘錄)

1、/var/log/messages日誌中找到相關信息:kernel: nf_conntrack: table full, dropping packet。出現這些信息會導致什麽後果?該如何解決?(此試題為網上他人總結,自己拿來學習)

解答:這個報錯意思是,連接跟蹤表已滿,開始丟包。

出現上述結果會導致業務訪問很慢。解決方法如下:

方案1:進行相關的系統參數的可以調優。

sysctl -a | grep nf_conntrack(在/etc/sysctl.conf文件中 ):

net.netfilter.nf_conntrack_max  =   1048576  
net.netfilter.ip_conntrack_tcp_timeout_established  =   3600  
net.netfilter.nf_conntrack_tcp_timeout_close_wait  =   60  
net.netfilter.nf_conntrack_tcp_timeout_fin_wait  =   120  
net.netfilter.nf_conntrack_tcp_timeout_time_wait  =   12

方案2:使用祼表,添加“不跟蹤”標識。如下示例更適合桌面系統或隨意性強的服務器。因為它開啟了連接的狀態機制,方便和外部通信。修改 /etc/sysconfig/iptables 文件:

*raw 
# 對TCP連接不啟用追蹤,解決ip_contrack滿導致無法連接的問題 
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 22 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 21 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 60000:60100 -j NOTRACK 
-A PREROUTING -p tcp -s 192.168.10.1 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 22 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 21 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK 
-A OUTPUT -p tcp -m tcp --sport 60000:60100 -j NOTRACK 
-A OUTPUT -p tcp -s 192.168.10.1 -j NOTRACK COMMIT 
*filter 
# 允許ping 
-A INPUT -p icmp -j ACCEPT # 對本地回路、第5張網卡放行 
-A INPUT -i lo -j ACCEPT -A INPUT -i eth4 -j ACCEPT # 連接狀態跟蹤,已建立的連接允許傳輸數據 
-A INPUT -m state --state ESTABLISHED,RELATED,INVALID,UNTRACKED -j ACCEPT # filter表裏存在但在raw裏不存在的,默認會進行連接狀態跟蹤 
-A INPUT -s 192.168.10.31 -p tcp --dport 2669 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

方案3:如果對安全沒有要求,比如在內網。這種情況下,可以使用下面的方法進行解決
關閉防火墻,並設置不自動開啟
chkconfig iptables off 
chkconfig ip6tables off 
service iptables stop 
service ip6tables stop
切記:在防火墻關閉狀態下,不要通過iptables指令(比如 iptables -nL)來查看當前狀態!因為這樣會導致防火墻被啟動,而且規則為空。雖然不會有任何攔截效果,但所有連接狀態都會被記錄,浪費資源且影響性能並可能導致防火墻主動丟包!

方案4:加大防火墻跟蹤表的大小,優化對應的系統參數
  1、狀態跟蹤表的最大行數的設定,理論最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
    以64G的64位操作系統為例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152
    即時生效請執行:
sysctl –w net.netfilter.nf_conntrack_max = 2097152
  2、其哈希表大小通常為總表的1/8,最大為1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8
    同樣64G的64位操作系統,哈希最佳範圍是 262144 ~ 1048576 。
    運行狀態中通過 sysctl net.netfilter.nf_conntrack_buckets 進行查看,通過文件 /sys/module/nf_conntrack/parameters/hashsize 進行設置
    或者新建 /etc/modprobe.d/iptables.conf ,重新加載模塊才生效:
options nf_conntrack hashsize = 262144

2、請執行命令取出linux中eth0的IP地址(請用cut,有能力者也可分別用awk,sed命令答)

ifconfig bond0 | sed -n 2p | cut -d : -f2 |cut -c 1-13
ifconfig bond0 | sed -n 2p | awk -F ‘[ :]+‘ ‘{print $4}‘
ifconfig bond0 | awk  -F ‘[ :]+‘ ‘NR==2 {print $4}‘
ifconfig bond0 | grep "inet addr:*" | awk -F ‘[ :]+‘ ‘{print $4}‘
ifconfig bond0 | sed -n 2p | sed ‘s#^.*addr:##g‘|sed ‘s#B.*$##g‘

解釋:處理需要的目標(獲取的字符串如上題的IP地址)前的字符串一般用以..開頭(^.*)來匹配開頭,匹配的結尾協商實際的字符,如:"^.*addr:"表達式匹配,結尾同開頭匹配方式一致

取出Bcast

ifconfig bond0 |sed -n 2p | sed ‘s#^.*75[[:space:]]##g‘ | sed ‘s#:.*$##g‘ 
ifconfig bond0 |sed -n 2p | sed ‘s#^.*75  ##g‘ | sed ‘s#:.*$##g‘

用分組的方法來匹配

sed ‘s#(ddd)(fff)\1\2##g‘
ifconfig bond0 | sed -n ‘s#^.*addr:\(.*\)  B.*$#\1#gp‘



3、查找當前目錄下所有文件,並把文件中的www.a.org字符串替換成www.b.cc

find . -type f -name "*.txt" | xargs sed -i ‘s#www.a.org#www.b.cc#g‘
find . -type f -name "*.txt" -exec sed -i ‘s#www.a.org#www.b.cc#g‘ {} \;


4、請給出如下格式的date命令 例:11-02-26

date +%F
date +%y-%m-%d
顯示時分秒
date +%Y-%m-%d\ %T
date +%F\ %T
cp space.sh space.sh$(date +%F)   以時間結尾來備份  或者cp space.sh space.sh`date +%F`  (反引號)
結果為:space.sh2017-05-04
打印三天前的日期:date +%F --date "-3 day"
打印三天後的日期:date +%F -d "3 day"   date +%F -d "+3 day"


5、

編寫個 shell 腳本將/root/script 目錄下大於 20K 的文件轉移到/root/file 目錄下

法1:
#!/bin/bash
for file in `ls -l /root/script`
do
if [ -f $file ]; then
if [ `ls -l $file|awk ‘{print $5}‘` -gt 10000 ]; then
mv $file /root/file
fi
fi
done
法2:
#/bin/bash
#=========bk file great 20K to other dirctory
cd /root/script
file=`ls -lk`
dir=/root/file
if
  [ -d $dir ] 
    then
       echo "directory is exsit"  
       find . -size +10k | xargs -I ‘{}‘ mv {} $dir
    else 
       mkdir -p /root/file
       find . -size +10k | xargs -I ‘{}‘ mv {} $dir
fi


本文出自 “linux學習總結” 博客,請務必保留此出處http://myybaby.blog.51cto.com/1555499/1951727

Linux面試題總結