table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}
51、如果你在之前的练习中创建了一个新分区,使用fsck命令检查它并观察输出。请说明对应的命令及该命令的作用。
命令为:
$ fsck -f /dev/partition
。该命令用于强制检查指定分区(
/dev/partition
需替换为实际分区名称)。
示例中强制检查
/dev/sda1
时,会依次进行以下操作:
检查 inode、块和大小
检查目录结构
检查目录连接性
检查引用计数
检查组摘要信息
并输出检查结果,如:
文件数量
块数量
非连续文件比例等信息
52、使用df命令检查文件系统状态:$ df -h 。a. -h标志如何帮助你解读结果?b. 如何判断文件系统是否接近满容量?c. 如何找出利用率较低的文件系统?
a.
-h
标志以人类可读的格式显示结果,包含如 M(兆字节)和 G(吉字节)这样的后缀,便于解读。
b. 查看文件系统的使用百分比,若接近 100% 则可认为接近满容量,示例中默认挂载的七个文件系统中,没有超过 55% 容量的,没有接近满容量的。
c. 查看文件系统的使用百分比,百分比数值较低的文件系统即为利用率较低的,示例中:
/dev/sda5
(2%)
/dev/sda9
(22%)
/dev/sda6
(23%)
/dev/sda10
(0%)
/dev/sda7
(3%)
这些文件系统利用率较低。
53、如何使用sort命令让命令输出更有用?
可以使用
sort
命令对输出进行排序,如使用
sort -nu
进行不区分大小写的数值排序。
例如,若要查看当前目录下文件的 inode 编号排序列表,可使用:
ls -i * | awk '{print $1}' | sort -nu | less
若要将结果保存到文件,可使用:
ls -i * | awk '{print $1}' | sort -nu > in.txt
54、复习 /etc/fstab 文件。确保你能说出所有六个字段及其顺序,并描述它们的功能。
以下是调整为 Markdown 格式的内容:
六个字段及其顺序和功能如下:
设备名(Device)
:指定要挂载的设备或远程文件系统,如磁盘分区、网络共享等。
挂载点(Mount point)
:指定设备挂载到文件系统的位置。
文件系统类型(Filesystem type)
:指定设备使用的文件系统类型,如 ext2、ext3、ext4、swap、iso9660、vfat、nfs 等。
挂载选项(Mount options)
:包含以逗号分隔的选项列表,部分选项特定于特定文件系统类型。
转储频率(Dump frequency)
:dump 程序(标准 Unix 备份实用程序)会参考此信息确定备份文件系统的频率,该字段为整数,本地 Linux 文件系统(如 ext2)通常设为 1,其他设为 0。
fsck 检查顺序(Pass number for fsck)
:fsck 实用程序在指定 -A 选项(通常在启动时)使用该字段,其值只能为 0、1 或 2。值为 1 表示根文件系统,fsck 会首先检查;值为 2 表示在值为 1 的文件系统检查后检查;值为 0 表示不检查该文件系统。
55、如果你在之前的练习中创建了一个新分区,先执行以下操作:创建挂载点并挂载该分区,然后查看挂载情况。操作命令如下:$ mkdir /mnt/new $ mount /dev/partition /mnt/new $ df /mnt/new 问题 a:文件系统是否正确挂载?你能在上面存储文件吗?接着,卸载该分区,执行命令:$ umount /dev/partition /mnt/new 最后,为新分区在 /etc/fstab 中添加一行:/dev/partition /mnt/new ext3 defaults 1 2 。
首先,执行创建挂载点、挂载分区和查看挂载情况的操作。要判断文件系统是否正确挂载,可依据
df /mnt/new
命令的输出:
若输出有关于 `/mnt/new` 的分区信息,则表明挂载成功。
若挂载成功,通常可以在该分区存储文件。
卸载分区时,
umount
命令使用有误,正确的用法是:
umount /dev/partition
或者
umount /mnt/new
最后,在
/etc/fstab
中添加指定的行后,下次系统启动时会自动挂载该分区。
56、通过为特定用户设置较低的配额来测试配额,然后以该用户身份开始添加文件,直到超出配额。超出配额的可观察到的后果是什么?
当磁盘写入超过硬限制或过期的软限制时,写入操作只有部分会完成,会留下一个被截断且可能无用的文件。如果用户使用的 shell 是隐藏的(例如,用户通过 Windows 系统的 SMB 共享写入磁盘),超出配额时报告给用户的消息可能会丢失,这会让用户感到困惑,因为应用程序生成的错误消息会表明磁盘已满或被写保护。
57、练习将以下文件模式从八进制转换为符号形式:a. 0777 b. 0754 c. 0666 d. 1700 e. 7777
a.
rwxrwxrwx
b.
rwxr-xr--
c.
rw-rw-rw-
d.
rwx------T
e. 由于7777中第一个7代表特殊权限组合无对应常规情况,超出常见范围,无法准确转换为标准符号形式。
58、以root身份创建临时文件,并使用chown修改用户所有权和组所有权。
可以按以下步骤操作:
创建临时文件,例如使用
touch
命令:
touch tempfile
修改用户所有权,使用
chown
第一个语法形式:
chown -v jdoe tempfile
修改用户和组所有权,使用
chown
第三个语法形式:
chown -v jdoe.sales tempfile
其中,
jdoe
是用户所有者,
sales
是组所有者,
tempfile
是临时文件。
59、使用chgrp命令修改临时文件的组所有权。
可以使用以下命令来实现:
chgrp [选项] 组所有者 临时文件列表
如果要递归修改目录下所有文件的组所有权,可使用
-R
选项;若要查看详细操作信息,可使用
-v
选项。
例如,递归且详细地将所有临时文件的组所有者修改为
sales
:
chgrp -Rv sales 临时文件目录
60、按如下方式创建一个临时文件和链接:$ touch a_file $ ln -s a_file an_slink $ ln a_file an_hlink 现在验证该文件和硬链接确实共享一个索引节点,并且符号链接指向原始文件,应该使用什么命令?
首先执行命令创建临时文件和链接:
创建一个名为
a_file
的文件。
使用
ln -s
命令创建指向
a_file
的符号链接
an_slink
。
使用
ln
命令创建指向
a_file
的硬链接
an_hlink
。
然后使用
ls -li
命令查看文件和链接的详细信息:
若
a_file
和
an_hlink
的索引节点编号(inode)相同,则说明它们共享一个索引节点;
若
an_slink
显示指向
a_file
,则说明符号链接指向原始文件。
61、访问 http://www.pathname.com/fhs/ 查看 FHS 的最新版本。
需访问指定网址查看 FHS 最新版本。
62、使用 which 命令检查可执行文件的位置。
使用
which
命令的语法为:
which command
它会确定命令的位置并显示 shell 为执行该命令而启动的可执行程序的完整路径名。
例如,要确定输入
tcsh
命令时会启动的 shell 的位置,可使用:
# which tcsh
其输出结果可能是:
/bin/tcsh
63、使用命令“$ find / -name bash”搜索“bash”文件,再用“$ locate bash”搜索同一文件。结果有何不同?描述每个命令在何种场景下有用。
结果差异
find
命令
会从根目录
/
开始递归搜索整个文件系统,查找名为
bash
的文件。
搜索时间长
能找到最新创建或重命名的文件
locate
命令
通过搜索预建数据库来查找文件。
速度快
如果数据库未及时更新,可能找不到最近创建或重命名的文件
使用场景
find
适用于以下场景:
需要精确查找最新文件
按文件属性(如日期、权限、文件类型等)查找文件
文件经常移动
locate
适用于以下场景:
快速查找文件名已知的文件
文件不常移动
64、设备名 /dev/hda 代表哪种硬件?A. 声卡 B. 调制解调器 C. IDE 硬盘 D. SCSI 硬盘 E. SATA 硬盘
C
65、要确定系统上是否存在IRQ冲突,应该查询哪个文件?a. /proc/ioports b. /proc/interrupts c. /proc/cpuinfo d. /proc/meminfo e. /proc/irqstatus
b
66、使用 #!/bin/bash 语法创建一个简单的 bash 脚本,设置可执行权限位并执行该脚本。如果运行正常,添加错误以查看诊断信息。让脚本报告已导出和未导出的变量。验证未导出的变量在新 shell 启动后不会保留。
以下是完成该任务的详细步骤:
创建简单的 bash 脚本
:
使用文本编辑器(如 vim 或 nano)创建一个新的脚本文件,例如
test_script.sh
,并在其中添加以下内容:
“`bash
#!/bin/bash
# 定义未导出的变量
non_exported_var=”This is a non-exported variable”
# 导出变量
export exported_var=”This is an exported variable”
# 打印已导出和未导出的变量
echo “Non-exported variable: $non_exported_var”
echo “Exported variable: $exported_var”
# 模拟一个错误,尝试访问不存在的文件
cat non_existent_file
“`
设置可执行权限位
:
在终端中,使用
chmod
命令为脚本添加可执行权限:
bash
chmod +x test_script.sh
执行脚本
:
运行脚本并观察输出:
bash
./test_script.sh
运行后,会看到输出已导出和未导出的变量值,以及由于尝试访问不存在的文件而产生的错误消息。
验证未导出的变量在新 shell 中不保留
:
在脚本中执行新的 bash shell,并检查变量:
“`bash
#!/bin/bash
# 定义未导出的变量
non_exported_var=”This is a non-exported variable”
# 导出变量
export exported_var=”This is an exported variable”
# 打印已导出和未导出的变量
echo “Non-exported variable: $non_exported_var”
echo “Exported variable: $exported_var”
# 启动新的 bash shell
bash <<EOF
echo “Inside new shell – Non-exported variable: $non_exported_var”
echo “Inside new shell – Exported variable: $exported_var”
EOF
“`
再次运行脚本,会发现新 shell 中未导出的变量没有值,而已导出的变量保留了其值。
67、在当前 shell 中创建一些 bash 别名。通过在当前 shell 中运行 bash 命令启动一个新的 shell。这些别名在子 shell 中是否有效?为什么?
别名在子 shell 中无效。因为别名是当前 shell 本地的,不会传递给程序或其他 shell。
68、使用 useradd 命令添加一个用户,同时使用 /etc/skel 目录下的文件填充新的主目录。
可以使用命令
useradd -m
来添加用户并使用
/etc/skel
目录下的文件填充新的主目录,例如添加用户名为 newuser 的用户:
useradd -m newuser
69、使用 groupadd 命令添加一个组。
使用以下语法添加组:
groupadd <组名>
例如,要添加名为
sales
的组,可执行:
groupadd sales
70、使用
passwd
命令为新用户设置密码。
passwd
使用
passwd [options] username
命令可以交互式地为指定用户名设置密码,密码不能在命令行输入。例如,若要为用户
bsmith
设置密码,可执行
passwd bsmith
,然后按提示操作。
71、登录新账户,并使用 newgrp 命令切换到新组。
该步骤是一个操作任务,具体操作如下:
首先使用新用户账户登录系统。
然后在命令行输入以下命令:
newgrp 新组名
(将“新组名”替换为实际要切换到的组名)
即可完成切换到新组的操作。
72、使用groupdel和userdel删除新的组和用户(包括主目录)。
使用
groupdel
删除组的命令格式为:
groupdel group
使用
userdel
删除用户并包含主目录的命令格式为:
userdel -r user
例如,要删除组
testgroup
和用户
jdoe
(包含其主目录),命令分别为:
groupdel testgroup
和
userdel -r jdoe
73、在你个人的crontab文件中添加一个条目来执行一项任务,比如给你发送一封电子邮件。确认该操作按预期发生。尝试使用五个时间指定符。
首先,使用
crontab -e
命令交互式编辑个人 crontab 文件。
假设要每天早上 9 点发送一封电子邮件,可使用以下格式添加条目:
0 9 * * * echo '这是一封测试邮件' | mail -s '测试' your_email@example.com
其中
your_email@example.com
需替换为你的真实邮箱地址。
添加完成后保存并退出编辑器。之后等待到指定时间,检查邮箱是否收到邮件以确认操作按预期发生。
可以通过修改时间指定符(分钟、小时、日、月、周)来进行不同时间的任务调度实验,例如:
15 18 1,15 * *
表示每月 1 号和 15 号的 18:15 执行任务。
74、使用 at 命令在未来安排一个命令。at 与 cron 有何不同?
cron
系统用于定期、周期性地执行命令;
at
用于将一个命令或一组命令的执行延迟到未来的某个时间,是一次性的命令执行安排;
使用
at
来安排延迟执行的任务很简单,且无需创建重复的
cron
条目。
75、在你的配置中添加 local5 设施。使用 logger 写入新的日志文件,并验证其内容。将你的日志条目与 /var/log/messages 中的条目进行比较。
在
/etc/syslog.conf
中添加如下行来定义
local5
设施的新日志文件:
# Define a new log file for the local5 facility
local5.* /var/log/local5
然后使用如下命令从 shell 脚本向该设施写入消息(在创建新日志文件前,必须重启或发信号让
syslogd
重新初始化):
$ logger -p local5.info "Script terminated normally"
消息
"Script terminated normally"
会连同时间戳和发送消息的主机名一起被放入
/var/log/local5
。
可查看
/var/log/local5
和
/var/log/messages
的内容进行比较,
/var/log/messages
依据
*.info;mail.none;authpriv.none /var/log/messages
配置接收除邮件和认证私有信息(info 级别及以上)外的所有系统消息,而
/var/log/local5
只接收
local5
设施的消息。
76、检查 /etc/logrotate.conf 文件。/var/log/messages 日志文件轮转后会发生什么?
`/var/log/messages` 轮转后,会执行 postrotate 脚本中的命令,即 `/usr/bin/killall -HUP syslogd`。
77、如何检查打印机状态以及向打印机队列发送打印任务?
可通过
lpq -P printer
和
lpc status
命令检查打印机状态;使用
lpr -P printer file
命令将文件发送到指定打印机队列进行打印。
78、使用dig命令从DNS服务器定位有关域名的信息,请举例说明具体的使用方式。
可以使用以下方式:
使用默认DNS服务器查询:
bash
dig www.oreilly.com
查询非默认DNS服务器:
bash
dig @10.20.10.10 www.oreilly.com
验证PTR记录:
bash
dig -x 208.201.239.100
搜索MX记录:
bash
dig mx www.oreilly.com
79、使用traceroute命令检查到一个指定网站的路由,如何操作,并举例说明如何设置初始探针的生存时间值。
在命令行中使用如下命令格式:
traceroute [options] 网站域名
例如要检查到 oreilly.com 的路由,可使用命令:
traceroute oreilly.com
若要设置初始探针的生存时间值为 5,可使用命令:
traceroute -f 5 oreilly.com
80、与控制文件 /etc/hosts.allow 和 /etc/hosts.deny 关联的守护进程是什么?
与这两个文件关联的守护进程是
tcpd
,它用于配置 TCP 包装器,可增强由
inetd
或
xinetd
控制的守护进程的安全性。
81、概括地描述一种在本地文件系统中定位SUID程序的方法。为什么管理员可能会定期进行此操作?
可以使用
find
命令定位 SUID 程序,示例命令为:
# find /bin -perm -4000 -type f
其中
-perm -4000
选项表示只显示设置了 SUID 位的文件。管理员定期执行此操作是因为 SUID 可能带来安全风险,如果不合理地授予访问权限,会破坏系统的其他安全协议。管理员需要了解系统上哪些程序设置了 SUID 位,对于不需要 SUID 位的程序,将其移除,以增强系统安全性。
82、为什么用户应该使用 ssh 而不是 telnet?
SSH 简介
SSH(Secure Shell)是过时的
telnet
命令的替代方案,
telnet
已被淘汰。
主要用途
SSH 的主要用途是对到远程主机的 shell 会话进行加密。
安全性对比
telnet
:不具备加密功能,使用
telnet
传输的数据可能会被窃取或篡改。
SSH
:能提供更安全的远程连接。
83、描述影子密码及其存储密码的文件。为什么我们不再在 /etc/passwd 中存储加密的密码字符串了?
影子密码系统将用户密码存储在 `/etc/shadow` 文件中,该文件有严格的权限限制。最初,Unix 系统将用户加密后的密码字符串存储在 `/etc/passwd` 文件的第二个字段中,虽然通过单向哈希算法加密的密码很难逆向推导,但 `/etc/passwd` 是全局可读的,任何用户都能访问其他用户的加密密码。攻击者可以使用相同的加密算法对随机字符串进行加密,并与存储的加密字符串进行比较,通过暴力破解攻击尝试找到正确的密码。为了提高安全性,现在大多数系统将用户密码存储在 `/etc/shadow` 文件中。
84、就
ulimit
命令而言,硬限制和软限制的区别是什么?
ulimit
以下是调整为 Markdown 格式的文本内容:
硬限制由超级用户为用户或用户组设置,不能被超越;软限制也由超级用户设置,但用户在需要时可以临时超越(通过调用
ulimit
命令),该临时提升仅在用户的 shell 会话期间有效。硬限制和软限制由超级用户在
/etc/security/limits.conf
文件中为所有用户设置。
85、在有多个管理员的环境中,为什么建议使用sudo而不是su?
使用
sudo
无需分发 root 密码
它会记录每个命令(包括完成和尝试的)
能明确是哪个用户在何时以 root 身份运行了什么命令
而若多人以 root 身份登录进行维护
无法确切知道是哪个用户在特定时间登录为 root 并运行了什么命令
86、使用nmap命令可以确定远程系统的哪些信息?
可以确定远程系统开放的端口
运行的服务或软件版本
操作系统
还能发现子网中哪些主机处于“活动”状态
87、描述使用 SSH 在系统之间进行基于密钥的身份验证的过程。
生成公钥
:通过
ssh-keygen
生成公钥,公钥位于
~/.ssh/id_dsa.pub
。
传输公钥
:将公钥传输到远程机器,由于是公钥,无需保密。
放置公钥
:在远程机器上,将公钥放在
~/.ssh/authorized_keys2
文件末尾。
实现免密登录
:一旦公钥在该文件中,所有拥有对应私钥的用户都可以无需密码登录到该远程账户。
88、描述如何使用gpg加密文件。
若要加密一个名为
chapter24.odt
的文件,使只有名为Andy Oram的用户可以使用它,可执行命令:
$ gpg -e -u "James Stanger" -r "Andy Oram" chapter24.odt
生成的加密文件名为
chapter24.odt.gpg
。
89、在 /etc/sudoers 文件中创建一个条目,允许你的用户账户以 root 身份运行任何命令。通过 sudo 运行一些命令并查看 /var/log/messages 文件。你会看到哪些条目?在多管理员环境中这有什么用处?
在
/etc/sudoers
中添加条目,例如:
your_username ALL=(ALL) ALL
可让指定用户以 root 身份运行任何命令。
运行命令后,
/var/log/messages
文件中会记录用户使用 sudo 执行命令的详细信息,如:
执行时间
用户
命令
在多管理员环境中,
sudo
会详细记录每个管理员执行的命令,这样可以明确是哪个管理员在何时执行了什么命令,便于追踪和审计操作,提高系统安全性和管理效率。
90、查看 /etc/shadow 文件。哪些用户账户没有密码?为什么没有?
以下是以 Markdown 格式呈现的内容,未对原始内容进行任何改动:
`bin`、`daemon`、`adm` 和 `lp` 这些系统账户没有密码(加密密码字段为 `*`)。这些账户用于运行系统进程和维护文件所有权,不允许交互式登录,所以被禁用了交互式登录密码。
91、使用chage命令为你的账户设置密码有效期。
可以使用
chage
命令的不同选项设置密码有效期,例如:
-d LASTDAY
:设置上次密码更改的天数
-E EXPIREDATE
:设置用户账户在特定日期过期
-m MINDAYS
:设置密码更改的最小间隔天数
-M MAXDAYS
:设置密码的最大有效天数
-W WARNDAYS
:设置密码过期前系统开始警告用户的天数
示例
:若要强制用户在下次登录时更改密码,可使用命令:
# chage -d 0 [用户名]
92、运行 ulimit –a 命令。设置了哪些默认限制?对用户设置哪些限制会比较有用?
运行
ulimit -a
命令显示的默认限制如下:
核心文件大小(块,-c)
:0
数据段大小(千字节,-d)
:无限制
调度优先级(-e)
:0
文件大小(块,-f)
:无限制
待处理信号(-i)
:8192
最大锁定内存(千字节,-l)
:32
最大内存大小(千字节,-m)
:无限制
打开文件数(-n)
:1024
管道大小(512 字节,-p)
:8
POSIX 消息队列(字节,-q)
:819200
实时优先级(-r)
:0
堆栈大小(千字节,-s)
:10240
CPU 时间(秒,-t)
:无限制
最大用户进程数(-u)
:8192
虚拟内存(千字节,-v)
:无限制
文件锁(-x)
:无限制
对用户设置的有用限制包括:
限制用户可创建的最大文件大小,避免磁盘空间被过度占用;
限制用户可运行的最大进程数,防止服务器因用户进程过多而停止响应;
限制用户可打开的最大文件数,避免内存耗尽;
限制用户可持有的最大文件锁数量,防止资源过度占用。
93、当你输入命令名时,哪个环境变量保存了 shell 搜索的所有目录列表?a. $LIST b. $VIEW c. $PATH d. $ENV e. 以上都不是
C