小试题体现大智慧

所有内容来自笔者平时总结和朋友们共享的面试题内容,欢迎留言添加新知识
<―――――――――――――――――――――――――――――――――――>
------------------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下又两个命令用于查找文件: V\:*{url(#default#VML);}O\:*{url(#default#VML);}W\:*{behavior:url(#default#VML);}< /style> locate和find。
locate  :非实时的查找,在一个事先建立好的对于当前文件缩影的数据库中查找,
          非精确查找
          速度快

locate数据库手动生成:updatedb

find: 实时查找
       精确查找
       速度慢

find命令使用格式:
find [/path] [ceriteria,…] [action]
find不带参数   当前      任意条件     显示出来

find查找条件:
-name “”
-iname “” 不区分名字的大小写
-user  用户名 find /home �Cuser redhat
-group 组名
-uid   用于那些用户已经删除 但是属主文件还在,这时候文件已经没有属主属组了
-gid
-nouser  查找没有属主的文件
-nogroup 查找没有属组的文件
-type   根据文件类型
       f普通文件
       d 目录文件
       l 连接文件
       bc 设备文件
       s特殊文件
       p管道文件
-size
     K,M,G默认是字节  注意加减(+/-)号的范围  单位匹配0.1-0.9 都是1的做法
-amin  多少分钟访问过
-mmin  多少分钟修改过
-cmin   多少分钟改变过
-atime  多少天访问过
-mtmie  多少天修改过
-ctime  多少天改变过
同时也可以和+/-号连用

-perm
      mode   做权限的具体匹配
     -mode   用于匹配mode必须有的权限   0表示不做任何限定
     /mode    表示任意一类用户对应权限 就行
-newer f1 !f2              #查更改时间比f1新但比f2旧的文件
-prune                      #忽略某个目录
-daystart      测试系统从今天开始24小时以内的文件,用法类似-amin
-depth             使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-maxdepth   限制在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录



-print 将查找到的文件输出到标准输出
-fprint file   打印文件完整文件名
-fprintf file format     打印文件格式
-exec command {} \;     -----将查到的文件执行command操作
-exec ls -l {} \;

find /var/log -type f -mtime +30 -exec rm {} \;在/car/log 目录中查找更改时间在30日以前的文件并删除它们
 find ./ -mtime -1 -type f -exec ls -l {} \;列出当前目录下当天修改的文件

find / -path '/mnt' -prune -o -name '*fileutil*' 在除了/mnt之外到所有文件夹中查找*fileutils*命名的文件:

find  . -not -perm /111  -name  "*.sh" -exec chmod 755 {} \;

---------- 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.org, zooyo大牛和 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 [email protected]  Wed Feb 29 18:24  45/1754  "Logwatch for localhost.localdomain (Linux)"
 N  2 [email protected]  Thu Mar  1 04:00 122/3544  "Logwatch for localhost.localdomain (Linux)"
 N  3 [email protected]  Thu Mar  1 04:02 122/3544  "Logwatch for localhost.localdomain (Linux)"
 N  4 [email protected]  Mon Mar 19 15:16  44/1698  "Logwatch for localhost.localdomain (Linux)"
 N  5 [email protected]  Wed Apr  4 17:25  43/1626  "Logwatch for localhost.localdomain (Linux)"

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

你可能感兴趣的:(Linux常用命令,职场,休闲)