shell编程内核源码Word文件下载.docx
《shell编程内核源码Word文件下载.docx》由会员分享,可在线阅读,更多相关《shell编程内核源码Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。
1RestoreArchive"
#菜单选项1存储归档文件
2Backupdirectory"
#菜单选项2备份目录
3Unloaddirectory"
#菜单选项3卸载目录
4Quit"
#菜单选项4停止
#读取用户选择
echo-n"
EnterChoice:
"
#输出提示EnterChoice:
不换行
readCHOICE#读取输入到CHOICE变量
case$CHOICEin#case语句开始
[1-3])echo#若CHOICE变量值为1、2或3则执行下面语句
#读取和验证目录
echo-n"
Whatdirectorydoyouwant?
#输出Whatdirectorydoyouwant?
不换行
readWORKDIR#读取工作目录到WORKDIR变量
if[!
-d"
$WORKDIR"
]#若WORKDIR不是一个目录
then#则输出如下提示
echo"
Sorry,$WORKDIRisnotadirectory"
#WORKDID(替换成对应值)isnotadirectory
continue#进入下一轮测试
fi#if语句结束
cd$WORKDIR;
;
#使上面指定的目录成为当前工作目录
4):
#:
为空语句,不执行任何动作
*)echo"
Sorry,$CHOICEisnotavalidchoice"
#默认执行语句,输出SorryCHOICE(替换成对应值)isnotavalidchoice
continue#进行下一轮测试
esac#结束case
case"
$CHOICE"
in#case语句开始
1)echo"
Restoring..."
#若CHOICE的值与1匹配,输出Restoring...
cpio-i<
/dev/rmt/0h;
#将/dev/rmt/Oh中的数据保存到系统当中
2)echo"
Archiving..."
#若CHOICE的值与2匹配,输出Archiving...
ls|cpio-o>
#使用管道将ls的输出作为cpio的输入备份到/dev/rmt/Oh中
3)echo"
Unloading..."
#若CHOICE的值与3匹配,输出Unloading...
4)echo"
Quitting"
#若CHOICE的值与4匹配,输出Quitting...
break;
#跳出case
#检查cpio错误
if[$?
-ne0]#若命令执行后的返回值不为零,则发生操作错误
then#
echo"
Aproblemhasoccurredduringtheprocess"
#输出错误提示Aproblemhasoccuredduringtheprocess
if[$CHOICE=3]#若CHOICE的值等于3
then#
Thedirectorywillnotbeerased"
#则输出出提示Thedirectorywillnotbeerased
fi#结束if
Pleasecheckthedeviceandtryagain"
#输出提示Pleasecheckthedeviceandtryagain
continue#继续下一轮测试
else#如果操作没有发生错误
if[$CHOICE=3]#如CHOICE的值等于3
rm*#则卸载的掉CHOICE中指定的所有目录
fi#结束if-else
done#结束do
2、此Shell程序主要实现查看/bin/rmp目录下的相关内容
/bin/sh指定用bin目录下的sh解释执行以下命令
#本shell程序实现的功能是根据用户输入列出RPM下所有文档、文件或包的相关信息
#日期:
#文件名:
sh1
RPM=/bin/rpm#将/bin/rmp赋值给变量PMP
option="
-q"
#将字符串"
赋值给变量option
whiletrue#while循环
whattoquery?
"
#输出提示语句whattoquery?
selectvarin"
All"
file"
packagename"
#将"
之一存入变量var
do#do语句开始
case$varin
All)#如果变量var值为ALL,则执行下面语句
option=$option"
a"
追加到option变量后面
break#跳出case
;
#语句结束
file)#如果变量var值为file,则执行下面语句
pleaseinputfilename:
#输出提示pleaseinputfilename:
f"
追加到变量option后面
readargument#将输入读到变量argument中
packagename)#如果var变量值与packagename匹配,则执行下面语句
pleaseinputpackagename:
#输出pleaseinputpackagename:
readargument#读取输入到参数argument中
*)#默认语句
pleasechoosebetween1-3"
#输出pleasechoosebetween1-3
esac#case结束
done#done结束do
whatdoyouwanttoknow?
#输出whatdoyouwanttoknow?
location"
info"
case$varin#case语句开始
location)#如果var值与location位置匹配,则执行下列语句
l"
追加到option末尾
info)#如果var的值与info匹配,则执行下面语句
i"
#将'
i'
追加到option后面
packagename)#如果packagename与var的值匹配,则执行下面语句
*)#默认执行语句
#输出pleasechoosebetween1-3
esac#case语句结束
done#do语句结束
${RPM}$option$argument#引用变量RPM、option、argument
continue?
[yes/no]"
#输出提示continue?
[yes/no]
readanswer#读取输入到变量anser
if[answer="
no"
]#如果anwer的值为"
break#则跳出循环
fi#if语句结束
done#结束whiledo
二、Linux操作系统配置实例(20分)
1、DHCP服务的安装与配置
DHCP服务的安装
RedHatEnterpriseLinux安装程序默认没有安装DHCP
服务,使用下面的命令可以检查系统是否已经安装了
DHCP服务或查看已经安装了何种版本。
rpm-qdhcp
如果系统还没有安装DHCP服务。
如果现在需要安装,
可将RedHatEnterpriseLinux5的第3张安装盘放入光驱,
加载光驱后在光盘的Server目录下找到DHCP服务的RPM
安装包文件dhcp-3.0.5-3.el5.i386.rpm,然后使用下面的命
令安装DHCP服务。
rpm-ivh/mnt/Server/dhcp-3.0.5-3.el5.i386.rpm
DHCP配置文件dhcpd.conf的格式
选项/参数#这些选项/参数全局有效
声明{
选项/参数#这些选项/参数局部有效
}
dhcpd.conf文件中常用的声明及功能
声明
功能
shared-network名称{…}
定义超级作用域
subnet网络号netmask子网掩码{…}
定义作用域(或IP子网)
range起始IP地址终止IP地址
定义作用域(或IP子网)范围
host主机名{…}
定义保留地址
group{…}
定义一组参数
dhcpd.conf文件中常用的参数及功能
参数
ddns-update-style类型
定义所支持的DNS动态更新类型(必选)
allow/ignoreclient-updates
允许/忽略客户机更新DNS记录
default-lease-time数字
指定默认的租约期限
max-lease-time数字
指定最大租约期限
hardware硬件类型MAC地址
指定网卡接口类型和MAC地址
server-name主机名
通知DHCP客户机服务器的主机名
fixed-addressIP地址
分配给客户端一个固定的IP地址
dhcpd.conf文件中常用的选项及功能
选项
subnet-mask子网掩码
为客户端指定子网掩码
domain-name“域名”
为客户端指定DNS域名
domain-name-serversIP地址
为客户端指定DNS服务器的IP地址
host-name“主机名”
为客户端指定主机名
routersIP地址
为客户端指定默认网关
broadcast-address广播地址
为客户端指定广播地址
netbios-name-serversIP地址
为客户端指定WINS服务器的IP地址
netbios-node-type节点类型
为客户端指定节点类型
ntp-serverIP地址
为客户端指定网络时间服务器的IP地址
nis-serversIP地址
为客户端指定NIS域服务器的地址
nis-domain“名称”
为客户端指定所属的NIS域的名称
time-offset偏移差
为客户端指定与格林尼治时间的偏移差
配置文件实例
DHCP服务的配置文件dhcpd.conf的内容如下:
ddns-update-styleinterim;
ignoreclient-updates;
subnet192.168.16.0netmask255.255.255.0{
range192.168.16.11192.168.16.100;
optionrouters192.168.16.1;
optionsubnet-mask255.255.255.0;
optiondomain-name"
optiondomain-name-servers192.168.16.2,61.144.56.100;
optionbroadcast-address192.168.16.255;
default-lease-time86400;
max-lease-time172800;
hostpc1{
hardwareethernet00:
a0:
cc:
cf:
9c:
14;
fixed-address192.168.16.20;
}
hostpc2{
hardwareethernet04:
20:
c1:
f8:
37:
11;
fixed-address192.168.16.30;
设置IP作用域
IP作用域是一个IP子网中所有可分配的IP地址的连续范围。
在DHCP服务器内必须设置一个IP作用域。
当DHCP客户端向DHCP服务器请求IP地址时,DHCP服务器就可以从该作用域内选择一个尚未分配的IP地址,并将其分配给该DHCP客户端。
在dhcpd.conf文件中,可用subnet语句来声明一个IP作用域。
subnet语句的格式如下:
subnet子网IDnetmask子网掩码{
range起始IP地址结束IP地址;
#指定可分配给客户端的IP地址范围
IP参数;
#定义客户端的IP参数,如子网掩码、默认网关等
设置客户端的IP选项
除了给DHCP客户端指定IP地址外,还可以利用DHCP服务器来设置客户端的工作环境。
例如,可以设置其子网掩码、DNS服务器的地址和默认网
关等。
当DHCP客户端向DHCP服务器索取IP地址或更新租约时,DHCP服务器就会自动为DHCP客户端设置这些IP选项。
在配置文件dhcpd.conf中,设置DHCP客户端IP选项的语句的基本格式为:
option选项代码设置内容;
设置租约期限
租约期限是在DHCP服务器上指定的时间长度,在这个时间范围内DHCP客户端可以临时使用从DHCP服务器租借到的IP地址。
在dhcpd.conf文件中,有下面两个与租约期限有关的设置。
1.默认的租约期限default-lease-time
2.最大租约期限max-lease-time
保留特定的IP地址
可以保留特定的IP地址给指定的DHCP客户端使用,也就是说,当这个客户端每次向DHCP服务器索取IP地址或更新租约时,DHCP服务器都会给该客户端分配相同的IP地址。
要保留特定的IP地址给指定的DHCP客户端使用,可先用arp命令查出该客户端网卡的MAC地址;
然后在/etc/dhcpd.conf文件中,加入如下格式的host语句。
host主机名{
hardwareethernet网卡的MAC地址;
#指定DHCP客户端网卡的MAC地址
fixed-addressIP地址;
#指定为该DHCP客户端分配的IP地址
IP参数;
#指定默认网关等其他IP参数
分配多网段的IP地址
如果在一个规模比较大的物理网络中存在多个IP子网,而多个IP子网的主机都需要DHCP服务器来提供地址配置信息,那么可以采用的一种方法是:
在每一个IP子网中都装一台DHCP服务器,让它们分别为各个子网分配IP地址。
但是,从节约成本的角度出发,一般情况下都不这样做,而是采用在一个子网中安装DHCP服务器并让它来为多个子网分配IP地址的方法。
那么如何才能使该DHCP服务器向多个网段提供动态IP分配服务呢?
这时可以考虑使用DHCP中继代理功能。
DHCP中继代理(dhcrelay)允许将无DHCP服务器的子网内的DHCP客户请求转发给其他子网内的一个或多个DHCP服务器。
一个或多个DHCP服务器。
在DHCP服务器上设置超级作用域,修改DHCP服务器(192.168.16.177)上的dhcpd.conf文件,加入如下格式的shared-network语句。
shared-network名称{
subnet子网1的网络IDnetmask子网掩码{…}
subnet子网2的网络IDnetmask子网掩码{…}}
2.设置DHCP中继代理
#Commandlineoptionshere
INTERFACES="
eth1eth2"
DHCPSERVERS="
192.168.16.177"
启动和停止DHCP服务
1.启动DHCP服务
/etc/init.d/dhcpdstart
2.停止DHCP服务
/etc/init.d/dhcpdstop
3.重新启动DHCP服务
/etc/init.d/dhcpdrestart
4.设置自动启动DHCP服务
如果需要让DHCP服务随系统启动而自动加载,可以执行“ntsysv”命
令启动服务配置程序,找到“dhcpd”服务,在其前面加上“*”星号,然后
选择“确定”即可,
Linux中DHCP客户端的配置
①直接编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0,找到语句“BOOTPROTO=none”,将其改为“BOOTPROTO=dhcp”即可。
②重新启动网卡
ifdowneth0;
ifupeth0
或
ifconfigeth0down;
ifconfigeth0up
三、Linux操作系统应用开发实例(20分)
1、简单ping程序实现源码
//pingapp.c简单ping程序实现
/////////////////////////////////////////////////////////////////////
#include<
stdio.h>
stdlib.h>
string.h>
//字符串头文件
sys/socket.h>
//socket头文件
netinet/in.h>
arpa/inet.h>
//ARP相关头文件
unistd.h>
sys/types.h>
//一些结构体相关头文件
netinet/ip_icmp.h>
//IP、ICMP相关头文件
#defineWAIT_TIME3//等待时间
#defineBUFFER_SIZE1024//缓冲区大小
u_shortcal_cksum(constu_short*addr,registerintlen,u_shortcsum)
{
registerintnleft=len;
constu_short*w=addr;
registeru_shortanswer;
registerintsum=csum;
/**使用32位累加器实现校验码的计算
*联系对16位数进行累加,最后将高16位与低16位进行累加
*/
while(nleft>
1){
sum+=*w++;
nleft-=2;
}
/*如果最后剩余8位,补齐到16位(补零,同时注意网络字节与
主机字节间的转换)*/
if(nleft==1)
sum+=htons(*(u_char*)w<
<
8);
/**将高低16位相加,以消除累加时进位问题*/
sum=(sum>
>
16)+(sum&
0xffff);
/*高低16位相加*/
sum+=(sum>
16);
/*消除高低位相加的进位问题*/
answer=~sum;
/*取反*/
return(answer);
//ICMP报头解析代码
intunpack_packet_header(char*buf,intlen,structsockaddr_in*from)
{inti,iphdrlen;
structip*ip;
structicmp*icmp;
structtimeval*tvsend;
structtimevaltvrecv;
doublertt;
ip=(structip*)buf;
//ip报头长度=ip_hl*4
iphdrlen=ip->
ip_hl*4;
//得到ICMP报文信息
icmp=(structicmp*)(buf+iphdrlen);
//icmp报文总长度
len-=iphdrlen;
//如果长度小于要求,退出程序
if(len<
8){
printf("
ICMPpackets\'
slengthislessthan8