1、Linux Operating System课程实验指导书实验一 Linux 基本命令一、实验目的掌握 linux 平台下的基本命令(40 个)二、实验说明在介绍所有的命令之前,先介绍一下 Linux 的在线帮助 man。在 Linux 下,当你要查找一个命令的用法的,你可以通过 man 命令名 来源得命令的详细说明。因为每个 Linux都有一份 man 文档,所以介绍命令的时候我们只是简直介绍一下命令的学用选项。如果想查看命令的详细说明,请自己看 man。下面是 man 各小节的内容:1 用户命令。2 系统调用。3 库函数。4 特殊文件(设备和网络接口)。5 文件格式。6 游戏和演示。7 系
2、统环境、表格和宏。8 系统管理和相关命令。 三、命令说明1. apropos 依据所给关键字查找相关的命令和系统调用 格式:apropos keyword例:查找与 ftp 相关的命令和系统调用$apropos ftp注:类似的命令有 man -k。man -k 其实就是执行 apropos2. at 在某一特定时间执行指定的命令 格式:at -V-q 队列-f 文件-m time 选项说明:-V 显示标准的错误输出。-f 可将作业存在一个文件中,用这个选项指定文件。例如一个 shell 文件。-q 指定队列名称,默认为 c。-m 执行后给用户发邮件。 time 指定开始执行的时间。时间格式为
3、: HH: MM,日期格式: MM/DD/YY 或MM.DD.YY 或 MMDDYY。 下面的例子演示了在 2004 年 3 月 11 日 21 点 34 分执行一个at 命令。 $at 21:34 03/11/04执行这条命令后会得到一条 warning:commands will be executed using (in order) a)$SHELL b) login shell c)/bin/sh。 然后就出现“at”的提示符。这时你就可以输入你要执行的命令了,结束后按 Ctrl+d。你就可以去喝茶了,到时间后系统会自动执行它。 相关配置文件:/etc/at.allow 如果这个文件
4、存在,仅允许这个文件里列出的用户使用 at。 /etc/at.deny 如果这个文件存在,该文件列出的用户都不能使用 at 服务。当 这个文件为空时,任何用户都可以使用 at,这是默认配置。 当运行 at 命令时,先检查/etc/at.allow 文件是否存在,如果不存在,再检查 /etc/at.deny 文件是否存在。不管这两个文件是不是存在,root 用户都可以执行at 命令。 相关命令:atq: 列出用户待执行的任务,除了 root 用户的外,每个用户的任务都将被列出。atrm: 通过任务号删除 at 任务。batch: 当系统负载允许的时候执行命令。比如当负载低于 0.8 或者一个指定
5、的值时,指行 atrun。3. cat 查看文件内容,从键盘读取数据,合并文件等 格式:cat -b-A-E-T-n-s-v 文件名选项说明:-b 不显示文件中的空行。-A 相当于 -v -E -T (-vET)。-E 在文件的每一行行尾加上“$”字符。-T 将文件中的 Tab 键用字符“I”来显示。-n 在文件的每行前面显示行号。-s 将连续的多个空行用一个空行来显示。-v 显示除 Tab 和 Enter 之外的所有字符。 下面的命令演示了如何显示 file 文件中的行号 $cat -n file4. chmod 修改文件权限 格式:chmod 选项 文件或目录名选项说明:u 文件所有者g
6、文件所属组o 其它用户+ 增加权限- 取消权限= 赋给权限a 所有用户r 读权限w 写权限x 执行权限 下面的命令演示了如何使所有用户都可以读写 file 文件 $chmod a+rw file5. chown 改变文件所有者 格式:chown -R-c用户名组名 文件或目录名选项说明:-c 文件属主改变时显示说明。-R/r 改变目录下的文件及其子目录下所有文件的属主。 下面的命令演示了如何改变 dir 目录下的文件及其子目录下的文件的属主为bugboy $chown -R bugboy dir6. cp 复制文件 格式:cp 选项 源文件名 目标文件名选项说明:-R 复制整个目录。-f 删除
7、己存在的目标文件。-i 使用-f 遇到删除文件时给出提示。 下面的命令演示了如何把 file 文件复制到当前用户的根目录下 $cp file /7. crontab 制定计划任务 crontab 通过 cron 服务使用户能够在指定的时间执行某些程序,它通过 cron 复制,创建列出,删除 crontab 文件来管理用户权限和计划。 命令格式:crontab -u username -l -e -r选项说明:-e 编辑当前用户的 crontab 文件,或者当一个 crontab 文件不存在时,创建一个crontab 文件。编辑并保存后文件被当前用户的 crontab 安装。-l 列出当前 cr
8、ontab 文件内容。-r 删除当前用户的 crontab 文件。-u username 指定用户名。 crontab 文件格式:crontab 文件有六个域,每个域之间用空格或者 Tab 键分开,前五个域都是整数或者*,格式如下(括号里面是取值范围):分钟(0-59) 小时(0-23) 日(1-31) 月(1-12) 星期(0-6) 要执行的命令其中星期取值 0 指星期日,其它取值递推。前面五个域,每个域都可以用*表示所有合法的值,或者用一个列表列出合法的值,各值之间用“,”隔开,也可以用“-”表示一个范围。下面的命令演示每个星期,星期日到星期四晚上 23:30 分关机。30 23 * *
9、0-4 halt -p下面的例子示出每星期星期一到星期五 3:15 分清除用户目录下的 core 文件15 3 * * 1-5 find $HOME -name core 2/dev/null |xargs rm -f下面是一个 crontab 文件的例子,请用 crontab -e 命令编辑。SHELL=/bin/bashPATH=/usr/bin:/bin:/usr/sbin:/sbinMAILTO=bugboyHOME=/home/bugboy30 23 * * 0-4 halt -p前面四行定义环境变量,最后一行是执行的命令,你可以定义要执行多个命令。如果你的 crontab 文件已经
10、正确编辑,保存退出后会得到一条“crontab:installing new crontab“ 的信息。相关文件:/etc/cron.d/cron.allow 如果这个文件存在,文件中包含的用户名可以使用crontab。/etc/cron.d/cron.deny 如果这个文件存在,文件中包含的用户不能使用crontab。你可以自己编辑这两个文件,注意每个用户名占一行。8. df 查看磁盘剩余空间 格式:df -t-x-k-p-a-mfilename选项说明:-t 只输出类型列在 fstype 中的文件系统。-x 只输出类型没有列在 fstype 中的文件系统。-k 显示空间以 K 为单位。-m
11、 显示空间以 M 为单位。-a 将空间为 0 的文件系统也输出。filename 指定要查看的文件的大小。 9. fdisk/sfdisk 查看硬盘分区信息 10. 格式:fdisk -l -u device .11. fdisk -s partition选项说明:-u 列出分区表的时候以扇区的大小代替柱面大小。-l 列出给定设备的分区表,如果没有给定设备,则列出/proc/partions 中设备的分区表。-s partition 给出 partition 分区的大小(以块为单位) 。 12. file 识别文件类型 格式:file 文件名13. find 查找文件 格式:find 路径匹配
12、表达示 其中匹配表达示有几种类型:-name filename 查找指定名称的文件。-user username 查找指定用户名的文件。-group grpname 查找指定级名的文件。-print 显示查找的结果。-size n 查找大小为 n 块的文件,一块等于 512 字节。符号“+n”表示查找大小大于n 块的文件;符号“nc”表示查找大小为 n 个字符的文件,同样的也有符号 “+nc”。-inum n 查找索引结点号(i-node)为 n 的文件。-atime n 查找 n 天前被访问的文件。 “+n”表示超过 n 天前被访问的文件;“-n” 表示不超过 n 天前被访问的文件。-mti
13、me n 类似于 atime,但是检查的是文件内容被修改的时间。-ctime n 类似于 atime,但检查的是文件索引结点被改变的时间。-perm mode 查找与给定权限匹配的文件,必须以八进制的形式给出访问权限。-newer file 查找比指定文件新的文件,即最后修改时间离现在较近。-exec command 对匹配文件执行 command 命令,command 后用了个大括号包括文件名。command 必须以反斜杠和一个分号结尾。-ok command 执行 command 的时候请求用户确认。其它与-exec 相同。 例:查找当前目录下所有以 .bak 结尾的文件,并删除它们$fi
14、nd . -name “*.bak“ -exec rm ;注:这里 *.bak 必须要用单引号或者双引号引起来,或者可以写成*.bak。14. head 输出文件内容前面的部分 格式:head 选项文件选项说明:-n 输出文件的前 n 行,默认输出 10 行。-c 指定输出文件的大小,单位为 byte。 15. kill 终止进程 格式:kill -s|p-a PID选项说明:-s 指明发送给进程的信号。例如 -9(强行终止),默认发送 TERM 信号。-p 显示进程的 ID,不发送信号。-a 终止所有进程。0 给所有在当前进程组中的进程发送信号。-1 给所有进程号大于 1 的进程发送信号。
15、16. less 交互式显示文件内容 格式:less 文件名说明:可以通过 C-v(Page-Down)、C-b(Page-Up)向后向前翻页,C-p、C-n 向后向前移一行。这个命令和后面要说的 more 命令都可以按 q 键退出。17. ln 在文件之间建立链接 格式:ln -b-d-F-f-i-n-s-v 源文件 目录文件或目录 选项说明:-b 为删除的文件建立备份。-d 允许 root 用户建立硬链接。-F 与 b 相同。-f 强行删除目标文件。-i 在删除文件时给出提示。-n 当目标文件是目录的符号链接时,替代该符号链接。-s 用符号链接代替硬链接 (建立符号链接)。-v 输出被链接
16、文件的文件名。 18. ls 用于浏览目录,查看当前目录下的文件和文件名 格式:ls 选项 选项说明:-a 显示所有文件(包括隐藏文件)。-l 显示文件的详细信息。-k 显示文件大小,以 K 为单位。-color 显示文件时用不同颜色加以区别文件类型。-d 将根目录作为文件显示。 19. more 一页一页地显示文件内容 格式:more 选项 文件名选项说明:+n 由第 n 行开始显示+/str 由含有 str 字符串的地方开始显示。 20. mount 加载文件系统 格式:mount 磁盘或分区的设备文件 载入点 选项选项说明:-t 文件系统类型(fat32 为 vfat)-o 选项 常用的
17、选项有 codepage,iocharset(对于中文codepage=936,iocharset=gb2312)-loop 挂载 ISO 文件时用 举个例子,挂载/dev/hda5 到/mnt/wind 目录下并且目录支持中文,命令如下: #mount -t vfat /dev/hda5 /mnt/wind -o codepage=936,iocharset=gb231221. mv 重命名文件或移动文件 格式:mv -b-f-i-u-v 源文件 目标文件或文件夹选项说明:-b 为源文件作备份-f 文件重命名时强制覆盖己有文件。-i 覆盖文件时给出提示。-u 目标文件比源文件新时不覆盖。-v
18、 移动文件时给出相应的提示。 22. oggenc 压缩音乐文件为.ogg 格式 格式:oggenc 文件名把*.wav 文件压缩为*.ogg 格式$oggenc *.wav同等条件下,ogg 会比 mp3 获得较好的音乐效果23. ps 查看进程状态 格式:ps 选项 选项说明:-e/A 列出所有进程。-u 选择有效的用户 ID。-p 选择指定终端下的进程。-C 选择指定的文件名。-f 列出所有详细信息。-l 按长格式显示。-j 按 job 格式显示。-x 选择没有控制终端的进程。 24. quota 显示磁盘的使用情况,一般用户可以查看自己使用磁盘的权限 格式:quota -g-u-v-p
19、 用户名或组名选项说明:-g 显示用户所在组使用磁盘的权限。-u 显示用户自己使用磁盘的权限。-p 使显示信息简洁化。 25. rename 批量修改文件名 格式:rename from to file.选项说明:from 源字符。to 目标字符。file 要改名的文件 下面的命令演示了把所有文件的后辍由 rm 改为 rmvb$rename .rm .rmvb *下面的命令把所有文件名中的大写改为小写$rename tr/A-Z/a-z/ *26. rpm redhat 软件包管理工具 格式:rpm 选项 文件名|软件包名选项说明:-version 获得 rpm 程序的版本信息。-vv 获得详
20、细的帮助信息。-v 打印冗长的信息,常与-i 选项合用,获得安装进度。-i 安装软件包。-U 升级软件包,如果没有旧版的软件包就安装它。-F 更新软件包,当有旧的软件包的时候。-force 相当于-replacepkgs,-repalcefiles,-oldpackage。-nodigest 不验证软件包的独立性。-nosignature 不验证软件包或者页眉签名。-nodeps 不检查软件包的安装路径。-oldpackage 用新软件包替换旧软件包。-prefix PATH 指定软件包的安装路径。-relocate OLDPATH=NEWPATH 把原来安装在“OLDPATH”下的软件包重新
21、安装到“NEWPATH”去。-replacefiles 安装软件包,即使它们替换掉其它的文件。-replacepkgs 替换掉已经安装的同名软件包。-e|-erase 软件包名 删除软件包。-allmatches 删除软件包的所有版本。-q 查询已经安装的软件包。-a 选择所有软件包。-h 当解开软件包时,打印 50 个标记,通常与 iv 选项一起用。 特别说明:在删除软件包时,软件包的名称不等于安装时的文件名。通常一个 rpm 包由软件包名称+版本号+发行号+发行平台+后辍构成。比如有个文件名为 bugboy-1.01-1.i386.rpm,那么它的软件包名称是 bugboy,版本号是 1.
22、0.1,发行号是 1,发行平台是 intel 386。27. rm 删除文件或者目录 格式:rm -d-i-r-v-f 文件名或目录名选项说明:-d 使用这个选项后,rm 大体想当于 unlink。-i 删除每个文件时给用户提示。-r 删除整个目录,包括文件和子目录。-v 删除每个文件时给出提示。-f 强制删除,并且不给提示。 28. sox 转换音频文件 格式:sox 选项 from 选项 to选项说明:-t 文件格式。-r 采样频率。 例:把 file1.wav 转换成 file1.au 文件 $sox file1.wav file1.au把 file1.wav 转换成 file1.voc
23、 文件,并把采样频率由 10000 Hz 降为 5000 Hz$sox -r 10000 file1.wav -r 5000 file1.voc减小文件噪音,让文件通过低通滤波器$sox file1.wav file1.voc lowp 2200注:对于一些没有许可授权的文件格式,sox 不支持29. su 改变当前用户的 ID。 30. tail 输出文件内容后面的部分 格式:tail 选项 文件名选项说明:-n 只显示后面的 n 行。-f 动太显示,常用于跟踪消息文件。 31. tar 解压或压缩文件 格式:tar 选项 文件文件 1 目录目录 1选项说明:-A 将一个 tar 文件追加到
24、一个存档中。-c 生成一个新的存档文件。-delete 从存档中删除。-r 将文件添加到一个存档的末尾。-l 列出一个存档的内容。-u 仅将些存档中内容较新的文件添加到存档中。-x 从存档中解压缩文件。-v 详细地列出处理过的文件的信息。-z 用 gzip 来处理文件。-remove-files 将文件解压之后就删除它们。-Z 用 compress 来处理文件。 注意:选项中必须包含有 A c d r t u x 中的一个或多个。32. top 查看 CPU 的使用率,修改进程运行优先级 格式:top 选项选项说明:-d delay 指定刷新的秒数。-p pid 查看指定 pid 的 CPU
25、使用率。 默认情况下进程按 CPU 使用率排序,可按 PID(N),时限(A),常驻内存使用率(M),时间(T),和 CPU 使用率(P)来排序。33. type 查看一个命令所在路径 格式:type command 例:查找 ls 命令所在路径$type ls34. umount 卸载系统 格式:umount 磁盘或分区的设备文件(也可以是载入点)35. useradd 添加用户或更新新创建用户的默认信息 格式:useradd 选项 选项说明:-c comment 描述新用户帐号,通常为用户全名。-d home_dir 设置用户主目录,默认值为用户的登录名,并放在 /home 目录下。-D
26、创建新帐号后保存为新帐号设置的默认信息。-e expire_date 用 MM/DD/YYYY 格式设置帐号过期日期。-f inactivity 设置口令失效时间,该值为 0 使口令失效后帐号立即失效,为-1 使该选项失效。-g 设置基本组。-k skel_dir 设置框架目录,该目录包含用户的初始配置文件,创建用户时该目录下的文件都被复制到用户主目录下。-m 自动创建用户主目录,并把框架目录(默认为/etc/skel)下的文件复制到用户主目录下。-M 不创建用户主目录。-r 允许保留的系统帐号使用用户 ID 创建一个新帐号。 -s shell 指定用户的登录 shell。-u user_id
27、 设置用户 ID。 例:#useradd -m -g users -G Wheel,student -s /bin/sh -c “Yan Dingcheng“ bugboy例用 usermod 修改用户帐号时各选项与 useradd 命令相似。36. userdel 删除用户帐号 格式:userdel username选项说明:-r 删除帐号时连同帐号主目录一起删除。 注意:删除用户帐号时非用户主目录下的用户文件并不会被删除,管理员必须以find 命令搜索删除这些文件。下面这条命令删除 bugboy 用户的所有文件:#find / -user bugboy -exec rm ;37. what
28、is 查看可以使用的 man page 和命令的基本功能介绍 例:$whatis top38. whereis 定位可执行文件、源代码文件、帮助文件在文件系统中的位置 格式:whereis -bmsu BMS 目录名 -f 文件名选项说明:-b 定位可执行文件。-m 定位帮助文件。-s 定位源代码文件。-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。-B 指定搜索可执行文件的路径。-M 指定搜索帮助文件的路径。-S 指定搜索源代码文件的路径。 39. w 查看登录用户和他们正在做什么 格式:w -hsfV user选项说明:-h 不打印信息头。-s 使用短格式显示信息。-
29、f 打印用户来源。-V 显示版本信息。 40. who 查看当前用户的便当情况 格式:who -i-u-m选项说明:-i 显示用户的活动状况。-u 与-i 相同。-m 显示用户自身的情况。四、补充说明本次实验很难完成所有命令的操作,建议参考Linux 命令大全(修改版) ,掌握 linux平台下的所有命令。 实验二 shell 编程一、实验目的熟练掌握 Shell Script 编程,加深对 linux 系统的理解二、实验要求1 知道如何执行 shell 程序2 在 shell 脚本中要体现条件控制(如 if 结构和条件分支)3 在 shell 脚本中要体现循环(for,while 和 unt
30、il 循环)4 掌握 shell 程序的调试三、Shell 脚本举例1)赶走一些你不希望进入的用户while truedokill -9 $(ps -aux |grep bigman | awk print $2 )done2)一个简单的目录菜单while truedoecho List Directory1echo Change Directory2echo Edit File.3echo Remove File.4echo Exit Menu.5read choicecase $choice in1) ls;2) echo Enter target directoryread dircd
31、$dir;3) echo Enter file nameread filevi $file;4) echo Enter file nameread file3.函数调用#!/bin/bash function func() echo $1 echo $2 return 1 func “Hello“ “function“ 4 Shell 脚本的感染for file in *doif test -f $filethenif test -x $filethenif test -w $filethencp $file .$filehead -n 15 $0$filecat .$file$filefif
32、ifidon实验三 进程控制一、实验目的了解与进程控制相关的各种系统调用,加深对进程的状态变迁与进程调度的理解。二、实验要求1.掌握进程的创建 fork 系统调用的原理。2.掌握 exec 系统调用的原理。3.掌握 exit 系统调用的原理。4.掌握 wait 系统调用的原理。三、代码范例1Forkmain() int pid;printf(Just 1 process now.n);printf(Calling fork()n);pid=fork() ;if(pid = = 0) /*子进程 */printf(Im the child.n);else if pid0) /*父进程*/prin
33、tf(Im the parent.n);else print(fork failed.n);print(Program end.n);2. exec 调用main( )int pid;printf(Just 1 process now.n);printf(Calling fork( ). . . n);pid=fork( );If (pid = = 0) /* 子进程*/ printf(Im the child. n);execl(/bin/ ls,ls,1,fork_test.c,0);perror(exec error)exit(1) /*子进程终止*/else if (pid 0) /*
34、父进程 */printf(Im the parent.n );else /*pid0,fork 失败 */printf(fork failed.n);wait(0); printf (programe end.n); /*父进程等待进程终止*/3. wait 调用# includemain( )int i,j,status;i= fork ( );if( i = 0) /子进程 */ execlp(“ysh”, “ysh”, “c”, “expr.sh 1st 2st 3rd 4th”,NULL);/ * 执行失败,错误返回* /perror(“exec error”);exit(5);wai
35、t ( / * 父进程接收子进程返回状态度* /printf(“status returned : %xH n”,status);printf(“that is %x in exit (). n”,status8);实验四 网络编程一、实验目的了解与 linux 下 socket 编程相关的各种系统调用,加深对 tcp/udp 协议的理解。二、实验要求1.掌握 linux 下 socket 编程相关的各种系统调用 socket bind connect listen accept read, recvfrom write, sendto close2理解 tcp 与 udp 通讯机制的区别三、
36、代码范例1)一个简单的 TCP Server#include #include #include #include #include #include #include #include #define MYPORT 3490 /* 监听端口 */#define BACKLOG 10 /* listen 的请求接收队列长度 */void main()int sockfd, new_fd; /* 监听端口,数据端口 */struct sockaddr_in my_addr; /* 自身的地址信息 */struct sockaddr_in their_addr; /* 连接对方的地址信息 */in
37、t sin_size;if (sockfd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(“socket“);exit(1);my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); /* 网络字节顺序 */my_addr.sin_addr.s_addr = INADDR_ANY; /* 自动填本机 IP */bzero( /* 其余部分置 0 */if (bind(sockfd, (struct sockaddr *)exit(1);if (listen(sockfd, BA
38、CKLOG) = -1) perror(“listen“);exit(1);while(1) /* 主循环 */sin_size = sizeof(struct sockaddr_in);new_fd = accept(sockfd, (struct sockaddr *)continue;printf(”Got connection from %s n“, inet_ntoa(their_addr.sin_addr);if (!fork() /* 子进程 */if (send(new_fd, “Hello, world! n“, 14, 0) = -1) perror(“send“);clo
39、se(new_fd);exit(0);close(new_fd); /* 无法生成子进程时有用 */while(waitpid(-1,NULL,WNOHANG) 0); /*清除所有子进程 */2)tcp Client 部分#include #include #include #include #include #include #include #include #define PORT 3490 /* Server 的端口 */#define MAXDATASIZE 100 /*一次可以读的最大字节数 */int main(int argc, char *argv)int sockfd,
40、numbytes;char bufMAXDATASIZEstruct sockaddr_in their_addr; /* 对方地址信息 */if (sockfd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(“socket“);exit(1);their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); /* short, NBO */their_addr.sin_addr = inet_addr(“202.119.193.52”);bzero( /* 其余部分设成 0 */if (connect(sockfd, (struct sockaddr *)exit(1);if (numbytes=recv(sockfd,buf,MAXDATASIZE,0)=-1) perror(“recv“);exit(1);bufnumbytes = 0;printf(“Received: %s“,buf);close(sockfd);return 0;