飞翔灬吾爱的Blog
Linux | 运维常见面试题——编程与应用题
2018-8-6 fishyoung

前篇文章已经分享了,Linux | 运维常见面试题——填空题Linux | 运维常见面试题——选择题Linux | 运维常见面试题——简答题,今天继续分享Linux | 运维常见面试题——编程与应用题,编程与应用题还是需要一些编程基础的,还得有逻辑思维能力,创新能力,不怕不知道,就怕想不到,想到了可以先度娘一下或者谷歌一下,所以继续加油吧少年!!

编程与应用题

1.用Shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。

参考程序:

#!/bin/sh

FILENAME=

echo ―Input file name

read FILENAME

if [ -c "$FILENAME" ]

then

cp $FILENAME /dev

fi

2.请下列shell 程序加注释,并说明程序的功能和调用方法:#!/bin/sh

#!/bin/sh

#

# /etc/rc.d/rc.httpd

#

# Start/stop/restart the Apache web server.

#

# To make Apache start automatically at boot, make this

# file executable: chmod 755 /etc/rc.d/rc.httpd

#

case "$1" in

'start')

/usr/sbin/apachectl start ;;

'stop')

/usr/sbin/apachectl stop ;;

'restart')

/usr/sbin/apachectl restart ;;

*)

echo "usage $0 start|stop|restart" ;;

esac

参考答案:

1)程序注释

#!/bin/sh 定义实用的shell

#

# /etc/rc.d/rc.httpd 注释行,凡是以星号开始的行均为注释行。

#

# Start/stop/restart the Apache web server.

#

# To make Apache start automatically at boot, make this

# file executable: chmod 755 /etc/rc.d/rc.httpd

#

case "$1" in #case 结构开始,判断位置参数决定执行的操作。本程序携带一个位置参数,即$1

'start') #若位置参数为start

/usr/sbin/apachectl start ;; #启动httpd 进程

'stop') #若位置参数为stop

/usr/sbin/apachectl stop ;; #关闭httpd 进程

'restart') #若位置参数为stop

/usr/sbin/apachectl restart ;; #重新启动httpd 进程

*) #若位置参数不是startstop restart 

echo "usage $0 start|stop|restart" ;; #显示命令提示信息:程序的调用方法

esac #case 结构结束

2)程序的功能是启动,停止或重新启动httpd 进程

3)程序的调用方式有三种:启动,停止和重新启动。

3.设计一个shell 程序,添加一个新组为class1,然后添加属于这个组的30 个用户,用户名的形式为stdxx,其中xx 0130

参考答案:

#!/bin/sh

i=1

groupadd class1

while [ $i -le 30 ]

do

if [ $i -le 9 ] ;then

USERNAME=stu0${i}

else

USERNAME=stu${i}

fi

useradd $USERNAME

mkdir /home/$USERNAME

chown -R $USERNAME /home/$USERNAME

chgrp -R class1 /home/$USERNAME

i=$(($i+1))

done

4.编写shell 程序,实现自动删除50 个账号的功能。账号名为stud1 stud50

参考程序:

#!/bin/sh

i=1

while [ $i -le 50 ]

do

userdel -r stud${i}

i=$(($i+1 ))

done

5.某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案

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 前开机后启动。

参考答案:

解决方案:

1)用vi 创建编辑一个名为prgx crontab 文件;

prgx 文件的内容:

50 16 * * * rm -r /abc/*

2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt

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

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

5)、由超级用户登录,用crontab 执行 prgx 文件中的内容:

root@xxx:#crontab prgx;在每日早晨8:00 之前开机后即可自动启动crontab

---------------------------------------

-------

6.设计一个shell 程序,在每月第一天备份并压缩/etc 目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etcyy 为年,mm为月,dd 为日。Shell 程序fileback 存放在/usr/bin 目录下。

参考答案:

1)编写shell 程序fileback

#!/bin/sh

DIRNAME=`ls /root | grep bak`

if [ -z "$DIRNAME" ] ; then

mkdir /root/bak

cd /root/bak

fi

YY=`date +%y`

MM=`date +%m`

DD=`date +%d`

BACKETC=$YY$MM$DD_etc.tar.gz

tar zcvf $BACKETC /etc

echo "fileback finished!"

2)编写任务定时器:

echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron

crontab /root/etcbakcron

或使用crontab -e 命令添加定时任务:

0 1 * * * /bin/sh /usr/bin/fileback

7.有一普通用户想在每周日凌晨零点零分定期备份/user/backup /tmp 目录下,该用户应如何做?

参考答案:(1)第一种方法:

用户应使用crontab –e 命令创建crontab 文件。格式如下:

0 0 * * sun cp –r /user/backup /tmp

2)第二种方法:

用户先在自己目录下新建文件file,文件内容如下:

0 * * sun cp –r /user/backup /tmp

然后执行 crontab file 使生效。

8.设计一个Shell 程序,在/userdata 目录下建立50 个目录,即user1user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行。

参考答案建立程序 Pro16 如下:

#!/bin/sh

i=1

while [ i -le 50 ]

do

if [ -d /userdata ];then

mkdir -p -m 754 /userdata/user$i 加上-m 754 就不用写下面那一句了 -p 是递归建

立目录

#chmod 754 /userdata/user$i

echo "user$i"

let "i = i + 1" (或i=$(($i+1))

else

mkdir /userdata

mkdir -p -m /userdata/user$i

#chmod 754 /userdata/user$i

echo "user$i"

let "i = i + 1" (或i=$(($i1))

fi

done

9.有文件file

[root@xuegod63 ~]# cat file  #file中内容如下:

aaaaaa

bbbbbbbb

cccccccabc

查询file里面空行的所在行号

awk  '{if($0~/^$/)print NR}'  file

or

grep -n ^$ file |awk 'BEGIN{FS=":"}{print $1}'

查询file1 abc 结尾的行

grep abc$ file1

打印出file1 文件第到第

sed -n '1,3p'  file

head -3 file

10.编写个shell 脚本将/boot/grub/目录下大于100K 的文件转移到/opt 目录下[hide]

[root@xuegod63 ~]# cat test.sh

#!/bin/bash

cd /boot/grub

for file in `ls /boot/grub`

#for file in `ls /boot/grub`

do

if [ -f $file ]; then

if [ `ls -l $file|awk '{print $5}'` -gt 10000 ]; then

mv $file /opt/

fi

fi

done

11.有个文件如下:

http://a.domain.com/1.html

http://b.domain.com/1.html

http://c.domain.com/1.html

http://a.domain.com/2.html

http://b.domain.com/2.html

http://a.domain.com/3.html

要求:得到主机名(和域名),并统计哪个网址出现的次数,并排序。可以shell C

得到的结果应该是:

3 a.domain.com

2 b.domain.com

1 c.domain.com

[root@mail ~]# awk BEGIN{FS=/}{arr[$3]++}END{for(i in arr) print

arr[i],i}‘ list| sort -r 答案

3 a.domain.com

2 b.domain.com

1 c.domain.com

12.如果得到随机的字串,长度和字串中出现的字符表可定义,并将字串倒序显示,如把0123456789 作为基准的字串字符表,产生一个6位的字串642031,打印出的字串为130246,可使用bash/perl/php/c 任意一种.

 [root@localhost ~]# awk -v count=6 'BEGIN

{srand();str="0123456789";len=length(str);for(i=count;i>0;i--)

marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--)

printf("%c",marry[i]);printf("\n");for

(i=0;i<=count;i++) printf("%c",marry[i]);printf("\n")}'

838705

507838

13.10 台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/分区适用率大于80% 就发邮件报警放到crontab 里面, 10 分钟检查一次

#测试机器:虚拟机Linux as 4

#1.首先建立服务器间的信任关系。拿两台机器做测试

本机ip:192.168.1.6

[root@codfei ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

/root/.ssh/id_rsa already exists.

Overwrite (y/n)? y (以为我是第次建立关系所以此处覆盖原来的文件)

Enter passphrase (empty for no passphrase):(直接回车无须输入密钥)

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

04:37:13:2a:4b:10:af:c1:2b:03:3f:6b:27:ce:b9:62 root@codfei

[root@codfei ~]# cd .ssh/

[root@codfei .ssh]# ll

-rw------- 1 root root 883 Apr 25 17:51 id_rsa

-rw-r--r-- 1 root root 221 Apr 25 17:51 id_rsa.pub

-rw-r--r-- 1 root root 442 Apr 25 17:37 known_hosts

id_rsa 是密钥文件,id_rsa.pub 是公钥文件。

[root@codfei .ssh]# scp id_rsa.pub192.168.1.4:/root/.ssh/192.168.1.6

root@192.168.1.4's password:

id_rsa.pub 100% 221 0.2KB/s 00:00

这里把公钥文件取名为本机的ip 地址就是为了以后和更多的机器建立信任关系不发生混淆。

现在登陆到192.168.1.4 机器

[root@codfei ~]# cd .ssh/

[root@codfei .ssh]# cat 192.168.1.6 >> authorized_keys

然后回到192.168.1.6 机器直接

[root@codfei .ssh]# ssh 192.168.1.4

Last login: Wed Aug 8 12:14:42 2007 from 192.168.1.6

这样就可以了,里面偶尔涉及到权限问题。一般./ssh 文件夹是755 authorized_keys 600 或者644

####脚本如下#######################

#!/bin/bash

#SCRIPT:df_check.sh

#Writeen by codfei Mon Sep 3 07:25:28 CST 2007

#PURPOSE:This script is used to monitor for full filesystems.

#######################Begining####################

####################

FSMAX="80"

remote_user='root' #####完全可以不用root

remote_ip=(192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8 192.168.1.9

192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14 ) ---->

这里填写你要监控的主机ip

ip_num='0'

while [ "$ip_num" -le "$(expr ${#remote_ip[@]} - 1)" ]

do

read_num='1'

ssh "$remote_user"@"${remote_ip[$ip_num]}" df -h > /tmp/diskcheck_tmp

grep '^/dev/*' /tmp/diskcheck_tmp|awk '{print $5}'|sed 's/\%//g' >

/tmp/diskcheck_num_tmp

while [ "$read_num" -le $(wc -l < /tmp/diskcheck_num_tmp) ]

do

size=$(sed -n "$read_num"'p' /tmp/diskcheck_num_tmp)

if [ "$size" -gt "$FSMAX" ]

then

$(grep '^/dev/*' /tmp/diskcheck_tmp|sed -n $read_num'p' >

/tmp/disk_check_mail)

$(echo ${remote_ip[$ip_num]} >> /tmp/disk_check_mail)

$(mail -s "diskcheck_alert" admin < /tmp/disk_check_mail)

fi

read_num=$(expr $read_num + 1)

done

ip_num=$(expr $ip_num + 1)

done

#############over################################

################让脚本每十分钟执行一次#############

cron 表中加入

0/10 * * * * /home/codfei/diskcheck.sh 2>&1

################################################

##########################

14.如何统计apache 的每秒访问数?

tail access_log | awk '{print $1,$4}'

[root@localhost logs]# grep -c `date -d '3 second ago' +%T` access_log

0

15.将一个文本的奇数行和偶数行合并,第行和第行合并

[root@localhost bin]# cat 1

48 Oct 3bc1997 lpas 68.00 lvx2a 138

484 Jan 380sdf1 usp 78.00 deiv 344

483 nov 7pl1998 usp 37.00 kvm9d 644

320 aug der9393 psh 83.00 wiel 293

231 jul sdf9dsf sdfs 99.00 werl 223

230 nov 19dfd9d abd 87.00 sdiv 230

219 sept 5ap1996 usp 65.00 lvx2c 189

216 Sept 3zl1998 usp 86.00 kvm9e 234

[root@localhost bin]# sed '$!N;s/\n/ /g' 1

48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1 usp 78.00 deiv 344

483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393 psh 83.00 wiel 293

231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9d abd 87.00 sdiv 230

219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept 3zl1998 usp 86.00 kvm9e 234

[root@localhost bin]# sed -n -e 2p -e 3p 1|sed '$!N;s/\n/ /'

484 Jan 380sdf1 usp 78.00 deiv 344 483 nov 7pl1998 usp 37.00 kvm9d 644

16.自动ftp 上传

#!/bin/sh

ftp -n<<END_FTP

open 192.168.1.4

user codfei duibuqi //用户名codfei 密码duibuqi

binary

prompt off //关闭提示

mput test //上传test

close

bye

END_FTP

自动ssh 登陆 然后再到c

#!/usr/bin/expect -f

set timeout 30

spawn ssh codfei@B

expect "password:"

send "pppppp\r"

expect "]*"

send "ssh codfei@C\r"

expect "password:"

send "pppppp\r"

interact

17.a.log 文件中提取包含―WARNINGFATAL,同时不包含―IGNOR的行,然后,提取以:分割的第五个字段?

egrep 'WARNING|FATAL' a.log|grep -v'IGNOR'|awk -F: '{print$5}'egrep 'WARNING|FATAL' a.log|grep -v'IGNOR'|awk -F: '{print$5}'

18.添加一个新组为class01,然后,添加属于这个组的30 个用户,用户名的形式为stdXX,其中,XX 01 30

#!/bin/bash

groupadd class1

for ((i=1;i<=30;i++))

do

if [ $i -lt 10 ];then

username="std0"$i

else

username="std"$i

fi

useradd -G class1 $username

done#!/bin/bash

groupadd class1

for ((i=1;i<=30;i++))

do

if [ $i -lt 10 ];then

username="std0"$i

else

username="std"$i

fi

useradd -G class1 $username

done

19.在每个月的第一天备份并压缩/etc 目录下的所有内容,存放在/root/backup 目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd 为日。shell 程序fileback存放在/usr/bin 目录下?

crottab -e

00         * /usr/bin/fileback

# vi /usr/bin/fileback

#!/bin/bash

cd /tmp

tar zcvf `date +%Y%m%d`_etc  /etc

mv `date +%Y%m%d`_etc  /root/backup

20.shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev 目录下?

参考答案:

#!/bin/bash

directory=/dev

for file in anaconda-ks.cfg install.log install.log.syslog

do

if [ -f $file ]

then

cp $file $directory/$file.bak

echo " HI, $LOGNAME $file is backed up already in $directory !!"

fi

done

20.某系统管理员需要每天做一定的重复工作,编制一个解决方案:

(1).从下午450 删除/abc 目录下的全部子目录和全部文件;

(2).从早上800~下午600 每小时读取/xyz 目录下x1 文件中每行第一个域的全部数据加入到/backup 目录下的back01.txt 文件内;

(3).每逢周一下午550 /data 目录下的所有目录和文件归档并压缩为文件backup.tar.gz;

(4).在下午555 IDE 接口的CDROM 缷载(假设CDROM 的设备名为hdc;

(5).在早上800 前开机后启动。

解决方案:

1)用vi 创建编辑一个名为prgx crontab 文件;

prgx 文件的内容:

50 16 * * * rm -r /abc/*

2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt

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

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

5)、由超级用户登录,用crontab 执行 prgx 文件中的内容:

root@xxx:#crontab prgx;在每日早晨8:00 之前开机后即可自动启动crontab

21.使用shell,建立class1 用户组,再批量建立stu1--stu30 的用户,并指定用户组为class1

vi autoaddusr

#!/usr/bin/php -q

- 补充vim常用快捷方式

dd 删除当前行

G 移动到文章末行

gg移动到文本首行

x 编辑后保存推出,相对于wq

shift + $ 删除当前位置到行末

shift + G 删除当前位置到文本结束[/hide]

有时候我们发现一些新鲜事物,觉得很难,就远远的看着,如果你用心的去感受它,其实也就这么回事。 不要高估别人,低估自己,其实深入内心,很多你自以为很了不起的人,其实也没什么,真是这样。