所有内容来自笔者平时总结和朋友们共享的面试题内容,欢迎留言添加新知识
<———————————————————————————————————>
------------------snmp v3 客服端脚本 ------------------------------------
#!/bin/bash
mypasswd=`ifconfig | awk -F: '/inet addr/{print $2}'| awk '{if(NR==1) print $1 }'`
rpm -ql snmp
[ $? -eq 0 ] ||    yum install net-snmp net-snmp-devel net-snmp-utils -y
net-snmp-config --create-snmpv3-user -ro -A snmp@$mypasswd -a MD5 jiankongbao
echo $mypasswd
service snmpd restart
#!/bin/bash
getenforce | grep    Enforcing
        if [ $? -eq 0 ];then
                sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
setenforce 0
        fi
mypasswd=` ifconfig | awk -F: '/inet addr/{print $2}'| awk '{if(NR==1) print $1 }' | md5sum | head -c32; echo`
rpm -ql snmp
[ $? -eq 0 ] ||    yum install net-snmp net-snmp-devel net-snmp-utils -y
service snmpd stop
net-snmp-config --create-snmpv3-user -ro -A snmp@$mypasswd -a MD5 jiankongbao
echo snmp@$mypasswd
service snmpd restart
snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@$mypasswd" -l authNoPriv 127.0.0.1 sysDescr
[ $? -eq 0 ] && echo "snmp is ok"
chkconfig  snmpd on
------------------ 清空linux buffer cache------------------
sync && echo 3 > /proc/sys/vm/drop_caches

-------------- linux 下文件查找命-------- ------ --------
linux下又两个命令用于查找文件:
---------- linuxtone论坛经典shell例子--------------------
 
如题:
3    14
3    23
3    25
3    12
1    16
1    24
1    32
1    25
0    14
0    23
0    25
0    12
要求将以上数字输出下面格式
3    14         1    16         0    14
3    23         1    24         0    23
3    25         1    32         0    25
3    12         1    25         0    12
这个题来自 http://bbs.linuxtone.orgzooyo大牛和 cange大牛的答案真实经典,故贴下来分享下:
zooyo写的
awk '{c=(NR-1)%l;a[c]=a[c]?a[c]"\t"$0:$0}END{for(i=0;i<l;i++)print a[i]}' l=4 file
cange
sed -n '1,4p' a>1;sed -n '5,8p' a >b;sed -n '9,12p' a|paste 1 b -
cange把paste命令运用的很灵活,他的想法很简单就是把这个文件分为3个独立文件,然后再多个文件中连接行。
除了上面两位,Format写的更容易理解些
awk 'BEGIN{RS="";FS="\n"}{for(i=1;i<=4;i++) print $i,$(i+4),$(i+4*2)}' file

-------------------- linux 下read命令的使用------------------
read的用法很多种,这里只给出常用的几种。
-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态;
-n num 设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量
-s选项能够使read命令中输入的数据不显示在监视器上--实际上,数据是显示的,只是 read命令将文本颜色设置成与背景相同的颜色
[root@localhost ~]# read -n3 -p "name" name
namegab[root@localhost ~]#    
[root@localhost ~]# read -t 5 -p "name" name
namegaby
[root@localhost ~]# read -t 5 -p "name" name
name[root@localhost ~]#
[root@localhost ~]# read -s -p  "name" name
name[root@localhost ~]#

-u [ n ] 读取一位数的文件描述符号码 n 作为输入。文件描述符可以用 ksh exec 内置命令打开。n 的缺省值是 0,表示的是键盘。值 2 表示标准错误
下面引用一个例子
请教下,现在有2个文件
a文件:
1
2
3

b文件:
a
b
c
要变成

[1,a]
[2,b]
[3,c]
这个题考查点是paste,但是下面的read更是把知识用的炉火纯青
while read -u3 a && read -u4 b;do echo "[$a,$b]";done 3<a 4<b
paste    -d "," a b|sed -e 's/.*/[&]/'

--------------------- linux系统管理知识----------------------
显示/test目录下的所有目录
ls -l | grep ^d    /test
ls -F | grep '/'    /test
将文件/etc/a 下中除了 b文件外的所有文件压缩打包放到/home/a下,名字为a.gz
tar zcvf a.gz /etc/a --exclude=/etc/b /home/a
如何查看test进程所打开的所有文件
lsof | grep test
检测某个端口所占用的进程,如80端口
lsof -i:80
lsof命令扩展
哪个进程在使用apache的可执行文件
  lsof `which httpd`    
哪个进程在占用/etc/passwd
  lsof /etc/passwd
显示出那些文件被以k打头的进程名的进程打开,以bash打头,和以init打头
  lsof -c k
             lsof -c bash
             lsof -c init
显示那些文件被pid为30297的进程打开:
             lsof +p 30297    
打印出占用httpd可执行文件的进程的进程号
             lsof -t `which httpd
获取eth0网卡上80端口的数据包信息
tcpdump -i eth0    port 80
将/usr/local/test 目录下大于100K 的普通文件转移到/tmp 目录下
find /usr/local/test/    -type f -a -size +100k    -exec mv {} /tmp/ \;
umask022代表什么意思  
umask决定目录和文件被创建时得到的初始权限,022表示创建的文件和目录初始化权限是755。

--------------- shell 面试题-----------------------------------------
取出gaby文件的第3列记录
cat gaby
1 a A 5
2 b B 4
3 c C 3
4 d D 2
5 e E 1
cat gaby | colrm 1 4 | colrm 2

取出系统上执行的命令记录,并删除重复记录
history | sed 's/\s[0-9]\+\(.*$\)/\1/g' | column -t |sort -r | uniq -u
history | cut -c 8- | column -t  | sort | uniq -u

统计文件gaby有多少行
[root@localhost ~]# cat gaby
1
2
3
4
5
6
sed -n '$=' gaby
awk 'END{print NR}'    gaby
grep -c "" gaby
wc -l gaby | awk '{print $1}'

每隔10秒执行一个脚本 下一个10秒执行另一个脚本(需要执行的脚本房子/gaby目录下)
#!/bin/bash
while read gabylinux    
do
cd /gaby
/bin/bash -x $gabylinux
/bin/sleep 10
done << EOF
`ls /gaby/`
EOF
把当前目录下test文件中内容huhu  hehe haha gaga xixi yaya以如下方式输出
huhu
hehe
haha
gaga
xixi
yaya
下面给出三种方式,欢迎继续添加
sed 's/ /\n/g' test | column -t
awk '{for(i=1;i<=NF;i++)print $i}' test    
awk '{i=1;while(i<=NF){print $i;i++}}' test

处理以下文件内容,将域名取出并进行计数排序,如处理:
http://www.baidu.com/index.html
http://www.baidu.com/1.html
http://post.baidu.com/index.html
http://mp3.baidu.com/index1.html
http://www.baidu.com/3.html
http://post.baidu.com/2.html
得到如下结果:
域名的出现的次数 域名
3 www.baidu.com
2 post.baidu.com
1 mp3.baidu.com
可以使用bash/perl/php/c 任意一种
cat filename    | cut -d/ -f3 | sort -r | uniq -c | column -t
查询file 里面空行的所在行号
awk '{if($0~/^$/)print NR}' file
grep -n ^$ file |awk 'BEGIN{FS=":"}{print $1}'
打印出fstab 文件第1 到第3 行
sed -n '1,3p' /etc/fstab
head -3 /etc/fstab
awk 'BEGIN{i=1}''{if(NR<=3){print }{i++}}' /etc/fstab
linux主机的ip地址
ifconfig | awk -F: '/inet addr/{print $2}'| awk '{if(NR==1) print $1 }'
如何查看系统上最占cpu和内存的10进程
ps -auxf |sort -nr -k 4 |head -10
ps -auxf |sort -nr -k 3 |head -10
通过apache 访问日志access.log 统计IP 和每个地址访问的次数,按访问量列出前10 名。
cat access_log | awk '{print $1}' | sort  | uniq -c | sort -rn | head -10

------------------------- iptables-------------------------
iptables在生产环境中不常用,一般用于面试时候,常见用法如下。
iptables(nat,filter,mangle,raw)(INPUT,FORWARD,OUTPUT,PREROUTING,POSTROUTING)
iptables -t nat -F PREROUTING    ##把nat表中的PREROUTING链中的规则清空
iptables -F  ##清空所有的链中的规则-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP ##A插入一条规则默认放在最后一条
iptables -t filter -I INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP ##I插入一条规则默认放在第一条
iptables -t filter -I INPUT 3 -s 172.16.0.0/16 -p udp --dport 53 -j DROP ##插入一条规则放在第三条
##根据状态防止c/s******
iptables -A INPUT -s 172.16.0.0/24 -d 172.16.100.1 -p tcp --dport 22 -m    state --state NEW,ESTABLSHED -j ACCEPT    
iptables -A OUTPUT    -m state --state ESTABLISHED -j ACCEPT
##禁止ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all ##这样的结果是自己也ping不通别人,如果自己想ping通别人,可以用下面规则
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT    -p icmp --icmp-type 0 -j ACCEPT
##多端口匹配
iptables -A FORWARD -p tcp -m multiport --destination-port 22,25,80,110    -m state --state NEW,ESTALISHED -j ACCEPT
##防止SYN***
iptables -A INPUT -i eth0 -p tcp --dport 80 --syn -m connlimit --connlimit-above 80 -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 443 --syn -m connlimit --connlimit-above 80 -j DROP
##如何将本地80 端口的请求转发到8080 端口
iptables -t nat -A PREROUTING    -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.55:8080

---- 不小心在系统下执行了chmod -x/sbin/chmod 怎么办?
    [root@localhost ~]# rpm -qf /bin/chmod
coreutils-5.97-34.el5_8.1
[root@localhost ~]# yum -y install coreutils
具体思想如上,具体操作可以由下面命令(测试过不能100%,rpm能100%实现)实现
yum -y install $( rpm -qf `which chmod` | awk -F- '{print $1}')
或者下载rpm包,然后
rpm -ivh    coreutils-8.4-16.el6.x86_64.rpm    --nodeps --force

--------------------- 一道shell面试题--------------------------------
1
3
8
21
55
144
#/bin/sh
x=0
y=1
for ((i=1;i<=100;i++))
do
z=$((x+y))
x=$y
y=$z
done
echo $z
下面是自己写的

#bin/bash
s[1]=1
s[2]=2
for n in {3..100};do
                let x=$[$n-2]
                let y=$[$n-1]
                let s[$n]=$((s[$x]+s[$y]))
                echo $[s[$n]]
done

---------------------  ##/#-----------------------------------------
linux 下/etc/rc.d/init.d/functions里面的函数daemon在sv脚本中很常见到,其中该函数有一句while [ "$1" != "${1##[-+]}" ]; do 中的##迷惑我好久,这个迷惑在我看netkiller(一个10年工作经验的技术大牛的博客后豁然开朗)
mytar.sh

#!/bin/bash

if [ "${1##*.}" = "tar" ]
then
        echo This appears to be a tarball.
else
        echo At first glance, this does not appear to be a tarball.
fi

$ ./mytar.sh thisfile.tar
This appears to be a tarball.
$ ./mytar.sh thatfile.gz
At first glance, this does not appear to be a tarball.

以上内容来自 http://netkiller.sourceforge.net/shell/bash.variable.html#idp221856,上面还有更多用法
--------------------- 强悍的awk-----------------------------------
今天在论坛上看见这样一个帖子:

我看过第一印象写脚本,但是看完大牛们的恢复,我只想说,awk你等着我。
来自大牛的回复,
awk 'BEGIN{print "name average total"}{a[$1]+=$2;b[$1]++};END{for(i in a)print i"\t"a[i]/b[i]"\t"a[i]}' test|column -t
不会数组的需要了解下数组才能看懂。
---------------------- linux信号------------------------------------
linux进程间通讯有两种方式:共享内存和信号中断。所有linux中的信号(都是一些短小的信息,发往另一个进程传递控制信息)对linux系统来说是很重要的,查看linux系统都有哪些信号也有两种方式:man 7 signal 和kill -l 
从上面两个命令可以看出linux下信号有64种之多,但是我们常用或者是说需要熟悉的有信号1,2,9,15,18,19,
  1) SIGHUP(用于唤醒一个进程,重读配置文件) 2) SIGINT(中断,终止=ctrl+c键) 9) SIGKILL(立即结束无视该进程打开的文件或者操作)15) SIGTERM (终止结束一个进程,等待该进程操作完成)18) SIGCONT(将其唤醒)19) SIGSTOP(让该进程处于停止态)
向一个进程传递信号时使用kill/killall,如kill 123 默认用信号15把进程号为123的kill掉
kill -signal PID 只能向对方的进程的进程号传递信号。
killall -signal 进程名
kill -HUP httpd=kill -1 httpd 意思重读http配置文件相当于service httpd reload
___________________________________________________________________
------ ----------------------- mail- ---------------------------------
在linux系统会给用户发送邮件,用mail命令可以查看系统当前用户发的邮件:
[root@localhost ~]# mail
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 5 messages 5 new
>N  1 logwatch@localhost.l  Wed Feb 29 18:24  45/1754  "Logwatch for localhost.localdomain (Linux)"
 N  2 logwatch@localhost.l  Thu Mar  1 04:00 122/3544  "Logwatch for localhost.localdomain (Linux)"
 N  3 logwatch@localhost.l  Thu Mar  1 04:02 122/3544  "Logwatch for localhost.localdomain (Linux)"
 N  4 logwatch@localhost.l  Mon Mar 19 15:16  44/1698  "Logwatch for localhost.localdomain (Linux)"
 N  5 logwatch@localhost.l  Wed Apr  4 17:25  43/1626  "Logwatch for localhost.localdomain (Linux)"

表示当然系统上给root用户发送的邮件,在“& ”后面输入相对应的数字可以查看相对应的邮件。在“& ”后面输入“?”号可以查看mail的更多功能,输入q回车后推出命令查看。
----------------------------------------------------------------------