Linux讲义

更新时间:2024-05-02 13:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 熟悉Linux操作系统

一、 实验目的:

1. 学习Linux的安装(多媒体教室、个人机器上)

2. 熟悉Linux操作系统的字符界面和X windows界面

3. 学会在Windows下用SecureCRT 3.4软件远程登录Linux服务器 4. 学会在Windows下用telnet命令也可以远程登录Linux服务器

二、 实验环境:

1. 计算机实验室单机环境下的Linux

2. 计算机实验室Windows下远程登录

三、 实验内容:

1. 启动Linux操作系统,进入X windows 图形界面:

1) 注意启动过程中Linux的启动步骤

2) 用用户:linux,密码:123456登录,新建终端并观察PS1提示符为:

3) 注销后用用户:root,密码:123456登录,新建终端并观察PS1提示符为:

4) 自己摸索X windows主菜单、窗口、各应用程序 5) 配置IP地址为:192.168.4.xxx,并修改主机名为linux+xxx。(参见本机windows的IP)

步骤:主菜单→系统设置→网络,IP:选“设备”标签,主机名:选“主机”标签(注:这些配置必须用root用户登录,希望同学们不要更改root的密码,否则其他同学就不好做实验了,切记!切记!!)。设置结果为:

6) 用Ctrl+Alt+F1组合键,从图形模式切换到文字模式字符终端tty1下,登录系统,输

入命令:who的显示结果:

输入命令:pwd的显示结果:

输入命令:ls / -al注意显示结果中各列的含义及为什么有些是彩色显示有些却没有

Ctrl+Alt+F2组合键切换到字符终端tty2下,登录系统,输入命令:who的显示结果:

说明:Ctrl+Alt+[F1]+[F6]可以切换到文字界面tty1-tty6终端,用Ctrl+Alt+F7组合键切换到图形界面

思考:在字符终端下用什么命令正确重新启动,又是什么命令正确关机? 重新启动命令:

正确关机命令:

sync的功能:

2. 启动Windows操作系统

1) 从服务器下载SecureCRT 3.4软件,按照说明步骤安装(或者直接使用telnet命令) 2) 用自己的用户名(学号)登录Linux服务器192.168.4.4的虚拟终端,用户Home为:

- 1 -

/home/学号。(可以用命令:pwd查看自己的主目录)结果为:

3) 输入命令:ls 显示结果为:

4) 输入命令ls –l 显示结果为:

5) 输入命令ls –a 显示结果为:

6) 输入命令:cp /tmp/test.txt ./ 将/下的tmp目录下的test.txt文件复制到自己的主目录

下(思考:为什么用./?),再输入命令:ll,查看显示结果,最后用命令:cat test.txt显示test.txt文本文件中的内容

7) 使用SecureCRT 3.4软件上传文件到自己的虚拟终端的当前目录(必须在自己的主目

录中,否则没有权限),步骤:①选择SecureCRT的“Transfer”菜单②选择其中的“Zmodem Upload List…”菜单项,打开对话框③找到自己要上传的文件,双击或者选择“Add”来添加文件到“File to send:”列表④用“Close”来关闭该对话框⑤再选择“Transfer”菜单⑥选择“Start Zmodem Upload”可以用ls 命令来查看是否传输成功!(或者用下面说的FTP服务来查看)

3. 在Windows下,用IE打开本服务器的FTP服务:ftp://192.168.4.4。并使用自己的用

户名和密码登录!

1) 观察是否是自己的主目录内容

2) 从自己本机复制一个文件到FTP主目录中 3) 在虚拟终端输入命令:ls –l 查看结果是否一致

4. 在虚拟终端或Linux单机环境(注:有些命令必须具有root权限才可以执行)下练习

Linux的基本命令(如:cd、mkdir、rmdir、ls、pwd、rm、cp、mv、cat、tac、more、less、head、tail、chmod、chown、chgrp、alias、cal、ps、top、kill、who、who am i、whoami、last、hostname、rpm等等)

实验二 Linux操作命令

一、 实验目的:

1. 掌握Linux操作的基本命令

2. 进一步掌握Linux目录操作

二、 实验环境:

1. 计算机实验室单机环境下的Linux

2. 计算机实验室Windows下远程登录

三、 实验内容:

1. 指令输入与基本指令

1) 指令的输入格式为:

command [-options] parameter1 parameter2 … 指令 选项 参数1 参数2 2) 显示日期:date

3) 显示日历:cal,语法cal [month] [year]

- 2 -

cal (显示当前本月日历) cal 2007 (显示2007年日历)

cal 3 2007 (显示2007年3月日历) 4) 简单计算器:bc

如:执行bc后,可输入 10-3*2 (Enter 回车) 4 (显示结果) (用quit退出)

5) 在线帮助:man (或者:info)

man ls (显示ls命令的帮助内容,退出man按q,空格键(或Page down):向下翻页;Page up:向上翻页;home:回到最前面;end:转到最终页;/word:搜寻word所代表的文件) info date

2. Linux文件权限与目录配置命令

1) 改变群组chgrp: chgrp 组名 文件(目录)名(使文件的组为指定组)

2) 改变拥有者命令chown:chown 用户名 文件(目录)名(使文件的拥有者为指定

用户)

3) 改变权限chmod:(-rwxrwxrwx是文件的9个属性:r:4 w:2 x:1

若owner = rwx = 4+2+1 = 7;group =rwx=4+2+1=7;others= --- = 0+ 0 +0=0) A)chmod [-R] xyz 文件或目录 (xyz为同三组rwx属性相加) 如:chmod 777 .bashrc (设置.bashrc的属性为-rwxrwxrwx) B)chmod u=rwx,g=rwx,o=rwx 文件或目录(u为拥有者,g为组,o为其他用户,a为所有即ugo都有,+(加入) -(除去) =(设定))

如:chmod a+w .bashrc (使ugo三者对.bashrc文件都具有w属性) chmod a-x .bashrc (使ugo三者对.bashrc文件都不具有x属性)

3. 文件与目录管理命令

1) 变换目录:cd [相对路径或绝对路径]

cd .. (到上一层目录,..与cd之间有空格) cd ../home (相对路径的写法)

cd /var/ftp/xag (绝对路径的写法) cd / (到根目录)

cd ~ (到用户的主(叫用户的根目录)目录) 2) 显示当前目录:pwd

3) 建立目录:mkdir [目录名]

4) 删除空目录:rmdir [目录名] (删除非空目录用rm -rf [目录名]) 5) 环境变量:PATH 可以用echo $PATH来显示当前用户的搜索路径

可以用PATH=”$PATH”:[绝对路径名] 来添加新搜索路径,如将/root加入自己的PATH中用PATH=”$PATH”:/root (保持原有路径不变加入新的搜索路径) 6) 显示文件名称、属性等:ls [-ailS] (-a指列出所有文件(连同隐藏文件);-i指打

印inode的值;-l指详细列出,连同文件大小、属性数据等;--color=X,X为never指不显示颜色X为always指均显示颜色X为auto指由系统自行判断) 如:ls –al

7) 复制文件或目录:cp [-drsu] [源文件] [目标文件] (-r指可以进行目录的复制;

- 3 -

–u指如果源文件较新,或者没有目标文件,才会进行复制动作,可用于备份操作;) 如:cp /tmp/test.txt ./ (将/tmp下的test.txt文件复制到当前目录下) 8) 删除文件或目录:rm [-fir] [文件名] (-i指提供用户确认(默认值);-r指循

环删除,直到没有东西为止;-f指force就是强制删除) 如:rm -rf test (连同test中的所有文件一起删除)

9) 移动文件或目录:mv [-u] [源文件] [目标文件] (–u指如果源文件比目标文件

新才会动作) 注:若源文件与目标文件在同一目录下表示的是更名 如:mv x.c y.c (则表将x.c更名为y.c) mv bashrc /tmp

mv bashrc bashrc2 /tmp (将bashrc、bashrc2一起移到/tmp下) 10) 查看文件内容

①cat 由第一行开始显示文件内容cat [-n] [文件名] (-n连行号一起输出到屏幕上)

②tac 从最后一行开始显示(反显),可以看出tac是cat的倒写tac [文件名] ③more 一页一页地显示文件内容more [文件名] 如:more ~/.bashrc

再如:ls -al .. | more (将ls的显示结果作为more的输入 | 表示管道)

④less 与more类似,但其优点是,可以往前翻页less [文件名] 如:less /etc/man.config (/word搜寻word这个字符串的所在;q退出less)

⑤head 只看头几行head [-n number] [文件名]

如:head ~/.bashrc 默认情况下显示前10行;head –n 20 ~/.bashrc 显示前20行

⑥tail 只看末尾几行tail [-n number] [文件名] 如:tail ~/.bashrc 注:假如想显示~/.bashrc的第11~20行,如何处理?

解:head -n 20 ~/.bashrc | tail –n 10 (先显示前20行作为tail的输入再显示后10行)

⑦nl 显示时同时输出行号 nl [文件名]

⑧od 以二进制方式读取文件内容 od [文件名] 用来显示非ASCII数据文件

11) 建立链接:ln [-s ] [源文件] [目标文件] (无-s表示建立的是硬链接,否则是

软链接)

如:cp /etc/passwd ./ (将/etc/passwd文件复制到自己的当前目录下)

ln passwd passwd-hard (将passwd文件建立一个硬链接文件passwd-hard说明passwd-hard也是一个目录项,也是和passwd文件的目录项指向同一个inode结点)

用ll命令查看得

-rw-r--r-- 2 root root 8479 Mar 21 22:54 passwd

-rw-r--r-- 2 root root 8479 Mar 21 22:54 passwd-hard -rw-r--r-- 1 root root 88 Mar 21 22:27 test.txt

一个文件显示的第2大列应该为1,而这里是2说明占用了2个inodes

再如:ln -s passwd passwd-soft (passwd-soft是一个软链接,它是一个独立文件,就象window下的快捷方式文件,原文件被删除,快捷方式就指向不了原文件(因原文件不存在)) 再用ll命令查看得:

-rw-r--r-- 2 root root 8479 Mar 21 22:54 passwd

-rw-r--r-- 2 root root 8479 Mar 21 22:54 passwd-hard

- 4 -

lrwxrwxrwx 1 root root 6 Mar 21 23:08 passwd-soft ->passwd -rw-r--r-- 1 root root 88 Mar 21 22:27 test.txt 第三行的第1小列说明这是一个链接文件指向passwd 在删除passwd后ll查看得

-rw-r--r-- 1 root root 8479 Mar 21 22:54 passwd-hard

lrwxrwxrwx 1 root root 6 Mar 21 23:08 passwd-soft ->passwd -rw-r--r-- 1 root root 88 Mar 21 22:27 test.txt

第一行的第2大列显示为1这个文件本身还存在,只是减少了一个inode;而第二行所指向的文件已经不存在了,会闪烁显示,再用more passwd-soft命令来显示,会显示错误,原因是它所指向的文件passwd已经不存在了,所以找不到 12) 文件与目录权限

①chown 改变文件的拥有者 chown [-R] user [目录名] (-R指循环地将该目录下的所有文件都改成user与group的名称,因为在复制文件或目录时原有的拥有者和群组都没有变,这样将一个原不属于某用户的文件就是复制他自己的目录下也没有权限访问,所以在复制文件后还要重新设置属性)

②chgrp 改变文件的所属群组 chgrp [-R] group [目录名]

③chmod 改变文件的可写、可读、可执行等属性chmod [-R] [parameter] [目录名] ④umask 改变预设的建立文件或目录时的初始属性 umask [xxx] (后不跟xxx则表示显示)

一个文件建立时默认属性为666(-rw-rw-rw-),一个目录建立时默认属性为777(drwxrwxrwx)umask的功能是“该默认值需要取消的权限”若umask值为002,则建立文件的属性为666-002=664(-rw-rw-r--);建立目录的属性为777-002=775(drwxrwxrw-x) 如下:

umask (默认显示为:0022)

mkdir abc (新建目录abc属性为drwxr-xr-x即777-022=755) umask 002 (设置为002)

mkdir xyz (再新建目录xyz属性为drwxrwxr-x即777-002=775) ⑤chattr 改变文件的特殊属性chattr [+-=] [Asacdistu] [文件或目录名] +-=: +为 增加 、- 为 减少 、= 为 设定 属性

A为设定了属性A,这个文件(或目录)的存取时间atime(access)将不可被修改,可避免诸如手提 电脑容易产生磁盘I/O错误的情况

S为这个有点类似sync,是将数据同步写入磁盘中,可以有效避免数据流失

a 为设定a后,这个文件将只能增加数据而不能删除,只有root才能设定这个属性 c 为设定这个属性之后,将会自动将此文件压缩,在读取时自动解压。但是在存储的时候,会先进行压缩再存储(对于大文件很有用)

i 为这个参数可以让一个文件“不能被删除、更名、设定链接也无法写入或新增数据”,对于系统安全性有相当大的帮助等等 ⑥lsattr 显示文件的特殊属性 13) 搜寻文件或目录

①which 查看可执行文件的位置 which [文件名] 如:which passwd

②whereis 查看文件的位置 whereis [-bmsu] [目录名] (-b 只找二进制文件; –m 只找在说明文件manual路径下的文件; -s 只找source 源文件; -u 没有说明文档的文件 )如:whereis passwd

再如:whereis –b passwd (仅列出二进制文件)

③locate 配合数据库查看文件的位置 locate [目录名] 如:locate root(含有

- 5 -

alenchan amanda apache ……

举例4:接下来我们以交互式实现循环功能,即当我们输入y或Y时,程序就结束。可以这样做:

# vi test15-loop.sh

#!/bin/bash #Using until #xag 2007-4-12

echo \

until [ \do

read yn done

echo \# sh test15-loop.sh Press Y/y to stop //下面的几行除了Stop here之外,都是你自己随意输入的内容: GDSG A Y

Stop here

上面说的是,当输入Y或y时才跳出do…done循环,而去执行下面的东西。

举例5:接下来,我们来判断目录是否存在,这是常用的。看看所谓的逻辑判断式的使用方法。可以使用条件判断来断定到底有没有文件(用-e)或者该名称是属于目录还是文件(-d,-f),接下来我们判断一个流程:

(1) 先查看~/test/logical这个名称是否存在; (2) 若不存在,则使用touch建立一个文件,建立完成后退出; (3) 如果存在,判断该名称是否为文件,若为文件则将之删除后建立一个目录,

文件名为logical,之后退出; (4) 如果存在,而且该名称为目录,则移除此目录。 看起来似乎很复杂,其实很简单。如下: # vi test16-ifthen.sh

#!/bin/bash

#Using if and then to select file or directory #xag 2007-4-12

if [ ! –e logical ];then touch logical

echo \

elif [ -e logical ] && [ -f logical ];then rm logical mkdir logical

echo \

echo \

- 31 -

exit 1

elif [ -e logical ] && [ -d logical ];then rm -rf logical

echo \else

echo \fi

然后请你依次执行sh test16-ifthen.sh ; ll 看看这个目录下logical文件有什么变化。这个动作可以让我们很轻松地判别出某个文件是否存在。

8. 如何调试脚本

脚本在执行之前,最怕的就是出现问题,那么如何调试脚本?有没有办法不需要直接执行该脚本就可以判断是否有问题?当然有,我们就直接以sh进行判断。 sh语法格式:sh [-nvx] scripts

-n:不执行脚本,查询脚本内的语法,若有错误则列出 -v:在执行脚本之前,先将脚本的内容显示在屏幕上; -x:将用到的脚本内容显示在屏幕上,与-v稍微不同。 如:

# sh -n test01-hello.sh # sh -v test01-hello.sh #!/bin/bash

#这个脚本的用途在屏幕上显示Hello ! How are you #创建日期:2007-4-10 #Written by xag

hello=Hello\\\\!\\How\\are\\you\\\\? echo $hello

Hello ! How are you

# sh –x test01-hello.sh + hello=Hello ! How are you + echo 'Hello !' How are you Hello ! How are you

熟悉sh的用法,可以使你在管理Linux的过程中得心应手。

对于Shell Scripts的学习方法,需要多看、多模仿,并将其修改为已用,这是最快的学习手段。网上有很多人在开发一些很有用的脚本,可以将对方的脚本拿来,并且改成适合自己主机的脚本,那么学习效果会更好。

四、练习:

请将本实验中的各个例子上机实验。

实验六 Linux编程环境

一、实验目的:

1. 掌握简单文件编辑器Vi等的使用 2. 掌握gcc编译器的使用

- 32 -

3. 掌握gdb调试C程序

二、实验环境:

1. 计算机实验室单机环境下的Linux 2. 计算机实验室Windows下远程登录

三、学习过程与实验内容

1. Vi的使用,见实验三。或者学习其他的文本编辑器如emacs(见课件) 2. 使用GNU cc

GNU cc(gcc)是Gnu/Linux操作系统中编译器套件,使用它能够编译C等编写的程序。gcc是一个交叉平台的编译器,支持在不同CPU平台上开发基于不同体系结构硬件的软件。gcc也可以在编译时优化执行代码,而且能够产生调试代码。

gcc在编辑过程中可以分为预处理、编译、链接三个阶段。 下表说明了gcc常用命令行选项 选项 -o filename -c -DFOO=BAR -IDIRNAME -LDIRNAME -static -lFOO -g -ggdb -On -ansi -pedantic -pedantic –error -w -Wall -werror -v 描述 指定输出文件名,如果不指定filename缺省文件则是a.out 只编译产生目标文件(.o文件)不链接 定义预处理宏FOO,其值为BAR 将DIRNAME路径加到头文件搜索目录中 将DIRNAME路径加到库文件搜索目录中 静态链接库文件 链接名为libFOO的库文件 在可执行代码中包含标准的调试信息 在可执行代码中包含gdb特有的调试信息 指定优化编译的级别n,n可以为1、2、3 使用ANSI/ISO C标准语法 允许发出ANSI/ISO C标准所列出的警告 允许发出ANSI/ISO C标准所列出的错误 关闭所有警告 允许发出gcc的所有警告 编译时将警告作为错误处理 显示在编译过程中每一步用到的命令 (1)举例:简单使用(源程序名设为t1.c)

1) 直接编译成可执行文件t1 #gcc t1.c –o t1 2) 只做预处理

#gcc -E t1.c –o t1.cpp

3) 将预处理结果编译成目标文件 #gcc -x cpp-output -c t1.cpp 4) 将目标文件链接成可执行文件t1 #gcc t1.o -o t1 (2)优化编译选项

优化可以改进执行文件的代码长度和执行效率 -O1 通常包括线程直接跳转和延迟退栈。

-O2 包含O1级所做的优化,并调整处理器指令执行时序。优化使处理器在等待其他指令的结果或数据延迟时仍然可以执行其他不相关指令,从而充分利用CPU资源,但

- 33 -

其实现与处理器是密切相关的

-O3 包括O2级的一切优化并使用内嵌函数、循环展开以及其他与特定处理器特性有关的优化。 (3)调试选项

gcc能够使用-g和-ggdb选项在可执行代码中插入调试信息以便于程序调试。-g选项后可以附加1、2或3指定要在代码中加入多少调试信息。缺少情况下是2,它将在输出代码中加入符号表、行号、局部和外部变量信息。1级选项仅生成函数调用时的堆栈转储和回退信息,不包含行号和变量的调试信息。3级选项则包括所有2级的调试信息并包含所有宏定义等。

如果使用GNU Debugger(gdb)来调试,可以使用-ggdb所特有的调试信息以方便gdb调试。但是,这样做会使程序不能被其他的调试程序调试。 3. 使用GNU gdb

一般,Linux发行版本都包含了一个叫gdb的GNU调试程序。gdb是一个功能强劲的调试器,提供了非常复杂的调试功能: ? 在调试器中查看代码 ? 设置断点

? 单步执行跟踪监视程序中变量的值 ? 运行中改变程序代码 (1) 启动gdb

#gdb

或#gdb filename //filename是由gcc –g(或-ggdb)生成的含调试信息的可执行文件 如下例:

#gcc -g t1.c -o t1 #gdb t1

(2) 在调试中查看源代码

(gdb)list //在gdb命令提示符下输入list命令显示当前行附件的10行代码

或(gdb) list n //显示第n行附近10行代码 (3) 设置断点与单步执行

(gdb)break //将第n行设置一个断点 或(gdb)break <函数名> //将某函数设置为一个断点

或在上面两种方式中加上文件名如break <文件名:n>来实现一个多文件项目设置断点 或(gdb)break <行号n或函数名> if <条件表达式> //根据条件设置断点

在断点停止执行时,可以用step或next命令实现单步调试,step遇到函数时将单步进入函数,而next命令在遇到函数时执行整个函数。 (4) 监视程序中变量的值

(gdb)print 变量名

第一次显示为$1=值 第二次显示出为$2=值等等 (5) 改变代码的运行

(gdb)print 变量名=值 //可以用print命令给变量在调试中赋新值,方便调试 可以用finish命令结束当前函数的调用(含main函数),或者用return value停止当前函数并将value返回结调用者。 4. 练习

如有以下C程序yanghui.c #include

- 34 -

int main()

{ int a[16][16]; int i,j;

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

{a[i][1]=1;a[i][i]=1;} for(i=3;i<16;i++) for(j=2;j

a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=1;i<16;i++) { for(j=1;j<=i;j++)

printf(\ printf(\ } }

(1) 用gcc编译生成可执行文件yanghui?

(2) 用gcc只做预处理生成yanghui.cpp?

(3) 将yanghui.cpp编译生成目标文件yanghui.o?

(4) 再yanghui.o链接生成yanghui1

(5) 为了使用gdb来调试,请将yanghui.c编译生成含调试信息的目标代码文件yanghui2。

(6) 用gdb打开yanghui2文件,用list命令查看一下源代码。

(7) 在gdb环境下运行代码查看输出结果。

(8) 将第7行设置一个断点,并使程序运行,到第7行暂停,此时查看i,j变量的值为

何?用whatis命令查看变量i,j的类型及数据a的类型。

(9) 使用单步命令执行5次后,查看此时i,j的值为何?

(10) 再将第15行设置第二个断点?使程序从刚才位置直接运行到此断点。(finish)

(11) 删除所有断点,再运行一次程序。

(12) 修改源程序yanghui.c将第10行修改为for(i= =1;i<16;i++),再将其编译生成含调试

信息的目标代码yanghui3。

(13) 在gdb中打开yanghui3,运行,查看结果是什么?为什么?

(14) 将第10行设置成断点,运行程序,暂停后查看i的值,结果为多少?

(15) 此时,用print语句将i设置成1,再单步查看程序的执行,是否可以继续执行?为

- 35 -

本文来源:https://www.bwwdw.com/article/xl1g.html

Top