linux期末考试题(1)

linux期末考试题

一、选择题(共20分,每小题2分)

1.以下哪个环境变量表示shell搜索外部命令或程序路径(C

A.ENV B.PWD C.PATH D.ROOT

解答:

ENV用于显示当前环境变量,PWD显示当前工作目录,ROOT表示超级用户

2.为了达到使文件的属主和同组用户有读(r)、写(w)和执行(x)的权限,而其他用户只能进行只读访问,在设置文件的许可值时,应当设为(D)

A、 747 B、744 C、775 D、774

解答:

1️⃣r (读):4 w (写):2 x (执行):1

因此,计算如下:

属主(Owner):读(4) + 写(2) + 执行(1) = 7

同组用户(Group):读(4) + 写(2) + 执行(1) = 7

其他用户(Others):读(4)

因此,权限应该设置为 774

3.若要使用进程名来结束进程,应使用(D)命令。

A、ps -d B、psfree C、profree D、kill

解答:

ps命令用于显示当前进程的状态,-d选项通常用于指定显示哪些进程(如仅显示当前终端的进程),但它本身并不用于终止进程。

psfree:?????没找到这个命令

profree:??????没找到这个命令

4.默认情况下管理员创建了一个用户,就会在(B)目录下创建一个用户主目录。

A./usr B./home C./root D./etc

解答:

/usr 目录通常用于存储系统软件和程序资源,例如可执行文件、库文件和文档等。

/home 是Linux系统中用户主目录的标准存储位置。默认情况下,当管理员创建一个新用户时,系统会在 /home 目录下为该用户创建一个以用户名命名的子目录作为其主目录。

/root 是系统管理员(root用户)的专属主目录。

/etc 目录用于存储系统的配置文件,例如用户账户信息、网络配置、服务配置等。

5.Linux启动的第一个进程init启动的第一个脚本程序是(D

A、/etc/fstab B、/etc/rc.d/init.d C、/etc/inittab D、/etc/rc.d/rc.sysinit

解答:

init 是Linux系统启动后的第一个进程(PID为1),负责初始化系统环境并启动其他进程。

init 进程的启动流程

内核启动后,会启动 init 进程。

init 进程首先会执行全局系统初始化脚本,通常是 /etc/rc.d/rc.sysinit(在某些系统中可能是 /etc/rc.sysinit)。这个脚本负责挂载文件系统、设置主机名、初始化网络、加载内核模块等基础任务。

/etc/fstab 是一个配置文件,不是脚本程序,用于定义系统启动时自动挂载的文件系统。

/etc/rc.d/init.d 是一个目录,存放所有服务的启停脚本。它本身不是脚本程序,而是包含多个脚本的目录。.d 结尾表示目录,通常包含一组脚本或配置文件

/etc/inittab 是一个配置文件,用于定义 init 进程的行为(如默认运行级别、启动脚本等)。它不是脚本程序,而是 init 的配置文件。

6.下列(B)指令可以用来显示目前主机的路由表(routing table)。

A、netstat -rn B、route C、print route D、show ip route

解答:

路由表用于定义数据包从本地主机到其他网络的转发路径。

netstat 是一个网络统计工具,用于显示网络连接、路由表、接口统计等信息。-r 选项表示显示路由表,-n 选项表示以数字形式显示地址和端口(不解析主机名和服务名)。

route 是一个用于显示和操作IP路由表的命令。直接输入 route(不带任何选项)会显示当前主机的路由表。

print route 不是Linux中的标准命令。在Windows系统中,route print 可以显示路由表,但在Linux中无效。

show ip route 是Cisco IOS等网络设备中的命令,用于显示IP路由表。在Linux中无效。

7.Linux系统目录中/boot存放的内容是(A

A、存放系统的内核文件和引导装载程序文件

B、存放所有重要的库文件

C、应用程序存放目录

D、存放系统的大部分配置文件和子目录

解答:

/boot 目录主要用于存放与系统启动相关的文件。这些文件包括内核映像(kernel image)、初始RAM磁盘(initramfs或initrd)以及引导加载程序(如GRUB)的配置文件和模块。

重要的库文件通常存放在 /lib/usr/lib 目录中。

应用程序通常存放在 /usr/bin/usr/local/bin/opt 等目录中。

系统的大部分配置文件存放在 /etc 目录中。

8.Linux支持的文件系统有(ABCD)

A、Swap B、NFS C、ISO9660 D、proc

解答:

❓答案是BC

Swap(交换空间)是Linux中用于虚拟内存的一种机制。虽然Swap不是传统意义上的文件系统(如ext4、XFS等),但Linux确实支持Swap分区或Swap文件,并将其视为一种特殊的“文件系统”类型。

NFS(Network File System)是一种网络文件系统协议,允许不同主机之间通过网络共享文件。Linux内核支持NFS客户端和服务器端,因此NFS是Linux支持的一种文件系统类型。通过挂载NFS共享目录,可以在本地访问远程文件系统。

ISO9660是一种用于光盘(如CD-ROM、DVD)的文件系统标准。Linux支持挂载ISO9660格式的光盘镜像(如 .iso 文件),因此ISO9660是Linux支持的一种文件系统类型。

/proc 是Linux中的一个虚拟文件系统(pseudo-filesystem),用于提供内核和进程信息的接口。它不是存储在磁盘上的传统文件系统,而是由内核动态生成的。尽管 /proc 不是存储文件系统的类型(如ext4、XFS等),但它是一种特殊的文件系统类型,Linux内核明确支持它。在Linux中,/proc 文件系统总是挂载在 /proc 目录下,用于访问系统信息。

9.下列哪些命令可以用来显示文件内容(ABCD)

A、cat B、more C、tail D、head

解答:

cat用于显示文件内容,more用于分页显示文件内容,tail用于显示文件末尾内容,head用于显示文件开头内容

10.在/etc/password文件中包含以下哪些内容(ABCD)

A、用户ID B、用户密码 C、用户名称 D、用户使用的She11

解答:

cat /etc/passwd输出:

[root@node2 etc]# cat passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin

/etc/passwd 中存储的是密码的占位符(通常是 x),不是实际的加密密码。

二、简答题(共50分,每小题10分)

1.Linux系统的Shell作为操作系统的外壳,其主要的功能是什么?

答:Linux系统的Shell作为操作系统的外壳,主要功能是提供用户与内核交互的接口,负责解释并执行用户输入的命令,支持交互式命令行操作、脚本编程以实现自动化任务,提供输入/输出重定向和管道功能以灵活处理数据流,从而高效地管理系统资源和执行复杂操作。

2.在Shell的变量应用中,三种引号的作用有什么区别?

答:在双引号中,除了$,",和\以外所有的字符都解释成字符本身。

在单引号中所有的字符包括特殊字符$,“,和\都将解释成字符本身而成为普通字符;

在反引号中的字符串将解释成shell命令来执行。

3.执行命令ls -l时,显示结果如下:

-rw-r--r-- 1 john 2017 jul 16 11:58 data

(1)用户john 对该文件具有什么权限?

答:用户 john 对该文件具有读(r)和写(w)权限(-rw-),但没有执行(x)权限。

(2)用户tom和root都不是john 组的成员,他们对该文件具有什么样的访问权限?

答:用户 tom对该文件只有读(r)权限(r--)。

用户 root 作为超级用户,默认拥有对所有文件的完全访问权限(读、写、执行),不受文件权限限制。

(3)如何使任何用户都可以读、写、执行该文件?

答:使用 chmod 命令将文件权限设置为 777,输入命令:chmod 777 data

(4)如何把该文件属主改为用户tom?

chown tom data

如果需要同时更改属组,可以添加 :group,例如 chown tom:users data

4.某系统管理员每天需完成以下的重复工作,请编制一个任务调度计划。

?考点:

cron任务调度系统中,时间定义基本格式

* * * * * <command-to-execute>
| | | | |
| | | | +----- 星期几 (0 - 7) (0和7都表示周日)
| | | +------- 月份 (1 - 12)
| | +--------- 日期 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
#特殊字符的使用
星号(*)
表示“每一”或“任意”。
例如:*在分钟字段表示“每分钟”,在小时字段表示“每小时”。
逗号(,)
用于指定多个不连续的时间点。
例如:0 9,17 * * *表示每天9:00和17:00执行。
横线(-)
用于指定一个时间范围。
例如:0 9-17 * * *表示每天9:00到17:00之间的每小时(9:00, 10:00, ..., 17:00)。
斜杠(/)
用于指定时间间隔(步长)。
例如:*/2 * * * *表示每2分钟执行一次,0 */2 * * *表示每2小时执行一次。
#日期和星期几的冲突处理:在标准Linux cron中,日期和星期几字段是“或”关系。如果同时指定了日期和星期几,任务会在满足任一条件时执行。

重定向操作符

> 	用于将命令的输出重定向到文件中。
>>	将命令的输出追加到文件的末尾,而不是覆盖文件内容。
2>	将命令的错误输出重定向到文件。
&>	将命令的标准输出和错误输出同时重定向到文件。

命令行工具

ls
功能:列出目录内容。
常用选项:
-l:详细列表(权限、所有者、大小、修改时间等)。
-a:显示所有文件(包括隐藏文件)。
-h:可读的文件大小(如KB、MB)。
cd
功能:切换当前工作目录。
pwd
功能:显示当前工作目录的完整路径。
mkdir
功能:创建新目录。
常用选项:
-p:递归创建父目录(如果需要)。
rm
功能:删除文件或目录。
常用选项:
-r:递归删除目录及其内容。
-f:强制删除(不提示确认)。
cp
功能:复制文件或目录。
常用选项:
-r:递归复制目录。
mv
功能:移动或重命名文件或目录。
locate
功能:快速查找文件(基于预建的数据库)。
注意:需要先运行updatedb更新数据库。
cat
功能:查看文件内容或连接多个文件。
less 和 more
功能:分页查看文件内容(less比more更强大,支持前后翻页)。
head 和 tail
功能:查看文件的开头或结尾部分。
常用选项:
-n:指定行数。
grep
功能:在文件或输出中搜索文本模式。
常用选项:
-i:忽略大小写。
-r:递归搜索目录。
sed
功能:流编辑器,用于文本替换、删除、插入等。
示例:
sed 's/old/new/g' file.txt # 将file.txt中的"old"替换为"new"
awk
功能:强大的文本处理工具,常用于提取和格式化数据。
示例:
bash
awk '{print $1, $3}' file.txt # 打印每行的第1和第3列
vim 和 nano
功能:文本编辑器。
vim:功能强大但学习曲线陡峭。
nano:简单易用,适合初学者。
ps
功能:查看当前运行的进程。
常用选项:
aux:显示所有用户的所有进程。
top 和 htop
功能:实时监控系统进程和资源使用情况。
htop:是top的增强版,界面更友好。
kill 和 pkill
功能:终止进程。
kill:通过进程ID(PID)终止进程。
pkill:通过进程名终止进程。
bg 和 fg
功能:控制后台和前台进程。
bg:将暂停的作业放到后台运行。
fg:将后台作业带到前台。
jobs
功能:列出当前shell会话中的作业。
uname
功能:显示系统信息(如内核名称、版本等)。
常用选项:
-a:显示所有信息。
df
功能:显示磁盘空间使用情况。
常用选项:
-h:人类可读的格式。
du
功能:显示目录或文件的磁盘使用情况。
常用选项:
-h:人类可读的格式。
-s:仅显示总计。
示例:
du -sh /var/log # 显示/var/log目录的总大小
free
功能:显示内存和交换空间使用情况。
常用选项:
-h:人类可读的格式。
uptime
功能:显示系统运行时间和当前负载。
ifconfig 和 ip
功能:查看和配置网络接口。
ifconfig:较旧的工具(部分系统已弃用)。
ip:现代替代工具。
ping
功能:测试网络连通性。
netstat 和 ss
功能:查看网络连接、路由表等信息。
netstat:较旧的工具。
ss:现代替代工具。
nslookup 和 dig
功能:查询DNS信息。
dig:功能更强大。
示例:
dig example.com # 查询example.com的DNS记录
wget 和 curl
功能:从网络下载文件。
wget:适合下载文件。
curl:适合发送HTTP请求和调试API。
示例:
wget https://example.com/file.zip # 下载文件
curl -I https://example.com # 查看HTTP头信息
sudo
功能:以其他用户(通常是root)身份执行命令。
示例:
bash
sudo apt update # 以root权限更新软件包列表
su
功能:切换用户身份。
示例:
bash
su - username # 切换到其他用户
passwd
功能:修改用户密码。
示例:
passwd # 修改当前用户的密码
chmod
功能:修改文件或目录的权限。
常用选项:
755:所有者可读、写、执行,其他用户可读和执行。
chown
功能:修改文件或目录的所有者。
示例:
chown user:group file.txt # 修改file.txt的所有者和组
tar
功能:打包和解包文件(通常与压缩工具结合使用)。
常用选项:
-c:创建归档文件。
-x:解压归档文件。
-z:使用gzip压缩/解压。
-j:使用bzip2压缩/解压。
-v:显示详细输出。
示例:
tar -czvf archive.tar.gz /path/to/dir # 创建gzip压缩的tar包
tar -xzvf archive.tar.gz # 解压gzip压缩的tar包
gzip 和 gunzip
功能:压缩和解压文件(.gz格式)。
示例:
gzip file.txt # 压缩文件
gunzip file.txt.gz # 解压文件
zip 和 unzip
功能:压缩和解压文件(.zip格式)。
示例:
zip archive.zip file1.txt file2.txt # 创建zip文件
unzip archive.zip # 解压zip文件
ssh
功能:远程登录到其他Linux/Unix服务器。
示例:
ssh username@hostname # 远程登录
scp
功能:在本地和远程系统之间安全复制文件。
示例:
scp file.txt username@hostname:/remote/path/ # 上传文件
scp username@hostname:/remote/path/file.txt . # 下载文件
rsync
功能:高效同步文件和目录(支持增量同步)。
示例:
rsync -avz /local/path/ username@hostname:/remote/path/ # 同步目录
crontab
功能:管理定时任务(cron作业)。
示例:
bash
crontab -e # 编辑当前用户的cron作业
history
功能:查看命令行历史记录。

(1)每天早上9点和下午5点将在线人数保存到num文件中;

0 9,17 * * * who >> /opt/test/num 

注意:这里的>>是追加内容到文件末尾,也可以使用>,但会覆盖原来文件的内容。

(2)周一至周五每2小时进行一次备份pub文件数据到data文件中;

0 */2 * * 1-5 cp /opt/test/pub /opt/test/data 

提示: */2的意思是每两小时。

cp:复制命令。

cp -r 源文件路径 目标文件路径

  • -r-R:递归复制目录及其内容(用于复制目录时)。
  • -i:交互式复制,覆盖前提示用户确认。
  • -v:显示详细输出,显示复制的文件名。
  • -u:仅当源文件比目标文件新,或目标文件不存在时才复制。

(3)每周五下午6:00删除临时文件(/temp目录中的所有文件);

0 18 * * 5 rm -rf /temp/* 

注意:rm -rf是递归强制删除文件和目录。

/temp/*表示删除temp目录下的所有文件和子目录。

(4)每月1日8:30发消息给所有用户,提醒准备提交上月工作总结。

30 8 1 * * wall "请准备提交上月工作总结!" 

注意:wall 是一个命令行工具,用于向所有登录到系统的用户发送消息。wall 是 "write all" 的缩写

5.读下列程序my.sh的功能,以及读入命令行参数后的执行结果。

#!/bin/bash
echo 'key in a number (1-10):'	#显示提示信息,要求用户输入一个数字(1-10)
read a	#将用户输入的值存储到变量 a 中
if [ "$a" -lt 1 -o "$a" -gt 10 ]	#检查输入的数字是否小于 1 或 大于 10
then
 echo 'Error Number.'	#如果满足条件,输出 Error Number. 并退出脚本(exit)
 exit
elif [ ! "$a" -lt 5 ]	#检查输入的数字是否 不小于 5(即大于或等于 5)
then
 echo "It's not less 5."	#如果满足条件,输出 It's not less 5.
else
 echo "It's less 5."	#如果输入的数字在 1-4 之间,输出 It's less 5.
fi

运行#bash my.sh 6

?考点:

关系运算符

运算符说明示例
-eq等于if [ $a -eq $b ]
-ne不等于if [ $a -ne $b ]
-gt大于if [ $a -gt $b ]
-lt小于if [ $a -lt $b ]
-ge大于或等于if [ $a -ge $b ]
-le小于或等于if [ $a -le $b ]

解:该程序用于读取用户输入的数字(1-10),并根据输入的数字输出不同的提示信息。

echo是一个基础的 命令行工具,用于将文本或变量的值输出到标准输出。

这里的-o表示或,是旧式写法,-a表示与。

输入 6 的输出结果:It's not less 5

三、综合编程题(共30分,每小题15分)

1.编写Shell脚本test.sh,第一个位置参数为指定的目录,其后指定的位置参数为第一个位置参数指定目录下的文件,显示这些文件的内容。

解:批量查看指定目录下文件内容。

#!/bin/bash
# 检查是否提供了目录参数
#检查命令行参数数量,如果未提供任何参数($# -lt 1),则显示用法提示并退出
#$0 表示脚本自身名称,<directory> 是必选参数,后续可跟多个可选文件名
if [ $# -lt 1 ]; then
 echo "Usage: $0 <directory> [file1] [file2] ..."
 exit 1
fi
# 获取目录路径
#提取第一个参数作为目标目录路径
directory="$1"
# 检查目录是否存在
#使用 -d 测试操作符验证目录是否存在
#对路径进行双引号包裹处理,可正确处理含空格的目录名
if [ ! -d "$directory" ]; then
 echo "Error: Directory '$directory' does not exist."
 exit 1
fi
# 遍历后续参数(文件)
#shift 命令将参数列表左移一位,使 $1 变为第一个文件名
#遍历剩余参数("$@" 保留带空格的文件名)
#使用 -f 测试操作符检查:文件是否存在	是否为普通文件(排除目录/设备文件等特殊类型)
#对有效文件:打印分隔线(包含文件名)	使用 cat 显示文件内容	打印结束分隔线
#对无效文件:输出警告信息(包含具体路径)
shift # 移除第一个参数(目录),剩下的参数是文件
for file in "$@"; do
 # 检查文件是否存在且是普通文件
 if [ -f "$directory/$file" ]; then
 echo "===== Contents of $file ====="
 cat "$directory/$file"
 echo "============================="
 else
 echo "Warning: '$directory/$file' is not a valid file or does not exist."
 fi
done

2.编写程序,实现多进程编程,主进程每隔2秒获取当前系统时间写入某文件,子进程打开该文件,读取文件的内容显示在屏幕上。

解:下面是time_logger.sh脚本。

#!/bin/bash
# 定义文件路径
output_file="time_log.txt"
# 清空或创建文件
> "$output_file"
# 主进程:每隔 2 秒写入当前时间到文件
#( ... ) &:启动一个后台子 Shell 进程,括号内的代码会在子 Shell 中运行。
#while true; do ... done:无限循环,持续执行括号内的代码。
#current_time=$(date "+%Y-%m-%d %H:%M:%S"):调用 date 命令获取当前时间,格式为 年-月-日 时:分:秒,并将结果赋值给变量 current_time。
(
 while true; do
 current_time=$(date "+%Y-%m-%d %H:%M:%S")
 #将当前时间追加写入 time_log.txt 文件。
 echo "Main process writes: $current_time" >> "$output_file"	
	#暂停 2 秒,然后继续循环。
 sleep 2
 done
) &
# 获取主进程的 PID(用于后续管理)
#$!:获取上一个后台进程的 PID(即主进程的 PID)。
#main_pid=$!:将主进程的 PID 赋值给变量 main_pid,以便后续管理(如终止进程)。
main_pid=$!
# 子进程:读取文件内容并显示到屏幕
(
 while true; do
 if [ -f "$output_file" ]; then
 echo "Child process reads:"
 cat "$output_file"
 echo "---------------------"
 fi
 sleep 1 # 子进程读取频率可以比主进程写入频率高
 done
) &
# 获取子进程的 PID(用于后续管理)
#获取上一个后台进程的 PID(即子进程的 PID)。
#child_pid=$!:将子进程的 PID 赋值给变量 child_pid,以便后续管理(如终止进程)。
child_pid=$!
# 捕获退出信号(如 Ctrl+C),清理后台进程
#trap "..." SIGINT SIGTERM:捕获 SIGINT(Ctrl+C 信号)和 SIGTERM(终止信号),执行引号内的命令。
#kill $main_pid $child_pid:终止主进程和子进程。
trap "kill $main_pid $child_pid; exit" SIGINT SIGTERM
# 保持脚本运行
#wait:等待所有后台进程完成。由于主进程和子进程是无限循环的,wait 会一直阻塞,直到脚本收到终止信号(如 Ctrl+C)
wait

用c语言编程实现:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
// 获取当前时间并格式化为字符串
void get_current_time(char *time_str) {
 time_t now;
 time(&now);
 struct tm *local = localtime(&now);
 strftime(time_str, 20, "%Y-%m-%d %H:%M:%S", local);
}
// 主进程函数
void parent_process(const char *filename) {
 FILE *file;
 char time_str[20];
 while (1) {
 get_current_time(time_str);
 file = fopen(filename, "a");
 if (file == NULL) {
 perror("fopen");
 exit(EXIT_FAILURE);
 }
 fprintf(file, "Time: %s\n", time_str);
 fclose(file);
 sleep(2); // 每隔2秒写入一次
 }
}
// 子进程函数
void child_process(const char *filename) {
 FILE *file;
 char buffer[256];
 while (1) {
 file = fopen(filename, "r");
 if (file == NULL) {
 perror("fopen");
 exit(EXIT_FAILURE);
 }
 printf("Contents of %s:\n", filename);
 while (fgets(buffer, sizeof(buffer), file) != NULL) {
 printf("%s", buffer);
 }
 fclose(file);
 sleep(2); // 每隔2秒读取一次
 }
}
int main() {
 pid_t pid;
 const char *filename = "time_record.txt";
 pid = fork();
 if (pid == -1) {
 perror("fork");
 exit(EXIT_FAILURE);
 }
 if (pid == 0) {
 // 子进程
 child_process(filename);
 } else {
 // 主进程
 parent_process(filename);
 }
 return 0;
}
作者:想去看花花吗原文地址:https://www.cnblogs.com/xqkhuahua/p/18861478

%s 个评论

要回复文章请先登录注册