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;
}