shellヘ.docx

上传人:b****5 文档编号:3427496 上传时间:2022-11-23 格式:DOCX 页数:13 大小:21.67KB
下载 相关 举报
shellヘ.docx_第1页
第1页 / 共13页
shellヘ.docx_第2页
第2页 / 共13页
shellヘ.docx_第3页
第3页 / 共13页
shellヘ.docx_第4页
第4页 / 共13页
shellヘ.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

shellヘ.docx

《shellヘ.docx》由会员分享,可在线阅读,更多相关《shellヘ.docx(13页珍藏版)》请在冰豆网上搜索。

shellヘ.docx

shellヘ

1.要求用shell写出一段程序,找出某一目录下,日期最早的文件,并且显示出来。

答案:

若文件包含目录,则为:

ls-lt|tail-1若文件不包含目录,则为:

ls-lt|grep^\-|tail-1

2、编写shell程序,实现自动删除50个账号的功能。

账号名为stud1至stud50。

程序实现及注释如下:

#!

/bin/bash

#deluser.sh

#考察while循环

i=1

while[$i-le50]

do

#查看账户是否存在:

只需要在/etc/passwd文件查找就可以了。

我是利用了一个管道符,再利用grep进行#查找;存在就删除,不存在给出提示。

#具体含义如下:

#ls/etc/passwd把passwd的内容打印到标准输出上(显示器上)但有了管道符以后。

passwd的内容就#不打印到标准输出上了,就直接转到了下一个命令的标准输入里。

那么grepstud$i,就从标准输入里进行

#查找了。

if[-n"`ls/etc/passwd|grepstud$i`"]

then

userdel-rstdu$i

else

echo"Nofindstdu$i"

i=$(($i+1))

done

#本题目考察到while、if语句、test命令等知识。

难点在于要删除的用户是否存在我们需要自己判断。

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

参考程序:

#!

/bin/sh

FILENAME=

echo“Inputfilename:

readFILENAME

if[-c"$FILENAME"]

then

cp$FILENAME/dev

fi

4.请下列shell程序加注释,并说明程序的功能和调用方法:

#!

/bin/sh

#!

/bin/sh

#

#/etc/rc.d/rc.httpd

#

#Start/stop/restarttheApachewebserver.

#

#TomakeApachestartautomaticallyatboot,makethis

#fileexecutable:

chmod755/etc/rc.d/rc.httpd

#

case"$1"in

'start')

/usr/sbin/apachectlstart;;

'stop')

/usr/sbin/apachectlstop;;

'restart')

/usr/sbin/apachectlrestart;;

*)

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

esac

参考答案:

(1)程序注释

#!

/bin/sh定义实用的shell

#

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

#

#Start/stop/restarttheApachewebserver.

#

#TomakeApachestartautomaticallyatboot,makethis

#fileexecutable:

chmod755/etc/rc.d/rc.httpd

#

case"$1"in#case结构开始,判断“位置参数”决定执行的操作。

本程序携带一个“位置参数”,即$1

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

/usr/sbin/apachectlstart;;#启动httpd进程

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

/usr/sbin/apachectlstop;;#关闭httpd进程

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

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

*)#若位置参数不是start、stop或restart时

echo"usage$0start|stop|restart";;#显示命令提示信息:

程序的调用方法

esac#case结构结束

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

(3)程序的调用方式有三种:

启动,停止和重新启动。

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

参考答案:

#!

/bin/sh

i=1

groupaddclass1

while[$i-le30]

do

if[$i-le9];then

USERNAME=stu0${i}

else

USERNAME=stu${i}

fi

useradd$USERNAME

mkdir/home/$USERNAME

chown-R$USERNAME/home/$USERNAME

chgrp-Rclass1/home/$USERNAME

i=$(($i+1))

done

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

(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文件;

(2)prgx文件的内容:

5016***rm-r/abc/*

08-18/1***cut-f1/xyz/x1>;>;/backup/bak01.txt

5017***tarzcvfbackup.tar.gz/data

5517***umount/dev/hdc

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

root@xxx:

#crontabprgx;在每日早晨8:

00之前开机后即可自动启动crontab。

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

Shell程序fileback存放在/usr/bin目录下。

参考答案:

(1)编写shell程序fileback:

#!

/bin/sh

DIRNAME=`ls/root|grepbak`

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

tarzcvf$BACKETC/etc

echo"filebackfinished!

"

(2)编写任务定时器:

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

crontab/root/etcbakcron

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

01***/bin/sh/usr/bin/fileback

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

参考答案:

(1)第一种方法:

用户应使用crontab–e命令创建crontab文件。

格式如下:

00**suncp–r/user/backup/tmp

(2)第二种方法:

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

0**suncp–r/user/backup/tmp

然后执行crontabfile使生效。

9.设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:

读;文件所有者的权限为:

读、写、执行;文件所有者所在组的权限为:

读、执行。

参考答案:

建立程序Pro16如下:

#!

/bin/sh

i=1

while[i-le50]

do

if[-d/userdata];then

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

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

else

mkdir/userdata

mkdir-p/userdata/user$i

chmod754/userdata/user$i

echo"user$i"

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

fi

done

10、多选题

10.1关于硬链接的描述正确的(BE)。

A跨文件系统B不可以跨文件系统D可以做目录的连接

C为链接文件创建新的i节点E链接文件的i节点同被链接文件的i节点

10.2.在网站发布用户wang的个人网页时,需要创建用户网页目录,假定用户网页目录设定为web

(用户目录在/home目录下),如下描述正确的是(BCE)

A存放用户网页的绝对路径/wang/webB存放用户网页的目录~wang/

C存放用户网页的绝对路径/home/wang/webD存放用户网页的绝对路径/home/web

E在本机访问用户wang的个人网页的URL地址http:

//localhost/~wang/

10.3.在一台WWW服务器上将端口号设定为8000,默认的网页文件index.html,服务器网页的根目录/www。

在本机访问服务器时,正确的用法是(BDE)

A浏览器访问该服务器的URL地址http:

//localhost/

B浏览器访问该服务器的URL地址http:

//localhost:

8000/

C浏览器访问该服务器的用户li网页URL地址http:

//localhost/~li

D浏览器访问该服务器的用户li网页URL地址http:

//localhost:

8000/~li

E浏览器访问该服务器的URL地址localhost:

8000/

10.4.在shell编程中关于$2的描述正确的是(CE)

A程序后携带了两个位置参数B宏替换C程序后面携带的第二个位置参数

D携带位置参数的个数E用$2引用第二个位置参数

10.5.某文件的权限是-rwxr--r--,下面描述正确的是(CD)

A文件的权限值是755B文件的所有者对文件只有读权限

C文件的权限值是744D其他用户对文件只有读权限E同组用户对文件只有写权限

6.关于OpenSSH的作用的描述正确的是(ACE)

A开放源代码的安全加密程序BOpenSSH常用于为http协议加密

COpenSSH用于提高远程登录访问的安全性D它和telnet实用同样的端口号

EOpenSSH是免

11、一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户。

答案:

sorttest1|uniq-c|sort-r|sed-n'1p'、

或者sorttest1|uniq-c|sort|tail-1|sed's/^\*//g'|cut-f2

解析:

A,sortip_input

首先使用sort命令排序,这样相同的IP地址则可以排在一起,这步我是为了接下来使用命令uniq。

因为uniq命令要求是使相邻的行唯一,如果相同行之间存在其它信息,命令不会使结果“唯一”!

输出结果为:

175.43.4.87

219.217.49.14

219.217.49.14

219.217.49.14

219.217.50.14

59.72.38.142

59.73.38.25

59.73.38.25

59.92.48.32

87.48.98.1

Bsortip_input|uniq-c

这里解释一下uniq-c选项。

它的作用是将重复行去掉并且在每行的前面添加此行重复的次数,下一步则对此结果进行排序则可以找到登录次数最多的IP记录以及登录次数。

输出结果为:

1175.43.4.87

3219.217.49.14

1219.217.50.14

159.72.38.142

259.73.38.25

159.92.48.32

187.48.98.1

(在第一个出现次数之前会有很多空格,这是怎么回事呢。

Csortip_input|uniq-c|sort-r>tmp

sort命令的默认排序方式是升序,使用-r选项逆序排序结果,则出现次数最多的IP则排在了第一行,并将结果保存在tmp文件当中。

Dsed-n'1p'tmp&&rm-ftmp

这里的sed-n用于将文件tmp的第一行做析取操作,此时输出结果为:

3219.217.49.14

IP219.217.49.14出现的次数最多,为3次。

 

PS:

在结果中,第一个数字为此IP记录在文件当中出现的次数,这里我本不想将3输出,不过我没有太好的办法解决。

当然办法也是有的,不过感觉很笨拙。

希望各位多提一些好的解决方案!

第一个答案较复杂,第二种简单而且正确

sortinput|uniq-c|sort|tail-1|sed's/^\*//g'|cut-f2-d\

sed's/^\*//g'去除每行开头空格

cut-f2-d\截取以空格为分割符号的第二个字段,\是引用一个空格。

12、从a.log文件中提取包含”WARNING”或”FATAL”,同时不包含”IGNOR”的行,然后提取以”:

”分割的第5个字段

答案:

grep-E‘warning|fatal’file|grep-vignor|awk-F“:

”‘{print$5}’

13、编写一个脚本,只想简单的减法运算,要求提示输入变量

答案:

#!

/bin/sh

echo-n“inputvar1:

readvar1

echo-n“inputvar2:

readvar2

echo$(($var1-$var2))

第二种答案(更简单)

#!

/bin/sh

read-p"inputvar1:

"var1

read-p"inputvar2:

"var2

echo$(($var1-$var2))

 

14.Shell脚本阅读(解释下面执行的功能),请挑出下面程序或脚本中的错误,并说明错在哪里。

#!

/bin/bash

#监控cpuser的point端口是否正常

logname=”/home/forum/log/lpointlog.wf”

flagfile=”/home/forum/log/lognum.txt”

lodnum=sed-n“1,1p”$flagfile

newnum=wc-l${logname}

echo$newnum>$flagfile

totalnum=expr$newnum-$oldnum

tail-n$totalnum$logname|grep“POINT_THREADWARNING”

if[$?

==0]

then

mail-s“cpuserpoint“端口异常,请处理!

”test@

fi>

解析:

(1)命令行替换用反引号

`sed-n“1,1p”$flagfile`

`newnum=wc-l${logname}`

`totalnum=expr$newnum-$oldnum`

(2)if[$?

==0]应该写做if[$?

=0],用来判断上次命令是否执行成功

if[$?

=0]

then

echosuccess

fi

注意:

if的两个[]与里面的内容一定要有空格,测试结果显示用=或者==都可以

(3)倒数第二行应该是>/dev/null,最后fi后面的>去掉

15、写脚本实现,可以用shell、perl等。

在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。

答案:

#!

/bin/sh

forfilenamein`find/tmp-typef-name"abc*"|head-n100`

do

sed-n'1p'$filename>>new

done

16、写脚本实现,可以用shell、perl等。

把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。

答案:

grep-v-x-fab

一道有难度的面试题。

(太难了)

写一个Bash脚本执行以下命令:

Merge[-i-o-ttime]sourcedirectory1sourcedirectory2destinationdirectory

通过各选项,让sourcedirectory1和sourcedirectory2复制并且合并到一个新的目录destinationdirectory中,源目录内容不改变。

这三个选项要实现:

默认情况merge是一个联合操作,即一个文件只要存在于源目录中的任何一个中则它就应该包含在新目录中。

如果用-i选项,那么merger是一个交集运算,即只有文件都存在于源目录才能包含在新目录中。

当一个文件存在于两个源目录,默认情况下,该文件的最新版本被复制。

如果使用-O选项,则该文件的旧版本应该复制到新目录。

最后-t选项,用一个时间变量作为参数值,如果执行此选项,文件将被复制到已经被创建或者超过最近特定时间修改过的目标目录中。

时间参数的选项应指定为实数,表示在过去的设置时间截止的天数。

注:

此题来源于HP公司面试题库

简单的实现一下默认选项的功能,没有容错,检查!

目录视为文件!

复制内容到剪贴板代码:

[root@tanwenbin]#catMerge

#!

/bin/bash

DIRA=$1

DIRB=$2

DIRC=$3

FILEONLY=$(diff"$DIRA""$DIRB"|grep'Onlyin'|awk-F'[:

]''{print$3$5}')

FILEONLYA=$(diff"$DIRA""$DIRB"|grep"Onlyin"$DIRA""|awk'{print$4}')

FILEBOTH=$(ls$DIRA|grep-v"$FILEONLYA")

forfilein`echo$FILEBOTH`

do

if["$DIRA"/"$file"-nt"$DIRB"/"$file"]

then

echo"$DIRA"/"$file">>.NEW

echo"$DIRB"/"$file">>.OLD

else

echo"$DIRB"/"$file">>.NEW

echo"$DIRA"/"$file">>.OLD

fi

done

forfilein`echo$FILEONLY`

do

cp-R"$file""$DIRC"

done

forfilein`cat.NEW`

do

cp-R"$file""$DIRC"

done

echoDONE!

!

rm-rf.NEW.OLD

[root@tanwenbin]#ll/root/shell/hello/

total16

-rw-r--r--1rootroot13Oct911:

1111

drwxr-xr-x2rootroot4096Oct910:

2012

-rw-r--r--1rootroot0Sep1513:

2622

drwxr-xr-x2rootroot4096Oct910:

24321

-rwxr-xr-x1rootroot52Sep1513:

27test

[root@tanwenbin]#ll/root/shell/wildcards/

total8

-rw-r--r--1rootroot0Oct910:

0211

drwxr-xr-x2rootroot4096Oct910:

2123

drwxr-xr-x2rootroot4096Oct910:

24321

[root@tanwenwildcards]#ll/root/aaaaa/

total0

[root@tanwenwildcards]#Merge/root/shell/hello//root/shell/wildcards//root/aaaaa/

DONE!

!

[root@tanwenwildcards]#ll/root/aaaaa/

total20

-rw-r--r--1rootroot13Oct911:

3911

drwxr-xr-x2rootroot4096Oct911:

3912

-rw-r--r--1rootroot0Oct911:

3922

drwxr-xr-x2rootroot4096Oct911:

3923

drwxr-xr-x2rootroot4096Oct911:

39321

-rwxr-xr-x1rootroot52Oct911:

39test

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1