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;
}
50、如何使用sort命令让文件列表的输出更有用?
可以将
sort
命令与其他命令结合使用,构建管道来处理文本数据。例如:
ls -i * | awk '{print $1}' | sort -nu | less
该命令使用
awk
从
ls
输出中提取 inode 号,再使用
sort
进行排序,最后通过
less
分页查看结果。
也可以将结果重定向到文件,例如:
ls -i * | awk '{print $1}' | sort -nu > in.txt
51、如果你需要对一个新分区进行挂载、检查挂载情况、卸载以及设置开机自动挂载操作。请完成以下步骤:1. 创建挂载点 /mnt/new;2. 将新分区 /dev/partition 挂载到 /mnt/new;3. 检查文件系统是否正确挂载,能否在上面存储文件;4. 卸载该分区;5. 在 /etc/fstab 文件中添加一行配置,使该分区在系统启动时自动挂载。
先使用 `mkdir` 命令创建挂载点 `/mnt/new`,再用 `mount` 命令将新分区 `/dev/partition` 挂载到该挂载点。使用 `df` 命令查看挂载情况,若能正常显示挂载信息则可能挂载成功,若挂载成功理论上可以存储文件。卸载时使用 `umount` 命令。最后在 `/etc/fstab` 文件中添加指定行:
/dev/partition /mnt/new ext3 defaults 1 2
这样后续系统启动时会自动挂载该分区。
52、通过为特定用户设置较低的配额来测试配额,然后以该用户身份开始添加文件,直到超出配额。超出配额会有什么明显后果?
当磁盘写入超过硬限制或过期的软限制时,写入操作只有部分会完成,会留下一个被截断且可能无用的文件。如果用户使用的 shell 是隐藏的(例如,用户通过 Windows 系统的 SMB 共享写入磁盘),超出配额时报告给用户的消息可能会丢失,这可能会让用户感到困惑,因为应用程序生成的错误消息表明磁盘已满或被写保护。
53、练习将以下文件模式从八进制转换为符号形式:a. 0777 b. 0754 c. 0666 d. 1700 e. 7777
a.
rwxrwxrwx
b.
rwxr-xr--
c.
rw-rw-rw-
d.
rwx--x--x
e. 由于八进制每位最大为7,
7777
超出范围,无法准确转换。
54、练习将这些文件模式从符号形式转换为八进制形式。你可以假设在SUID、SGID和粘滞位下x位已设置:a. -rwxr-xr-x b. -r–r–r– c. -rwsrwsrwx d. -rw-rw—-t e. -rws-w–w-
a. 0755;b. 0444;c. 6777;d. 1660;e. 4622
55、以root身份创建临时文件,并使用chown修改用户所有权和组所有权。
首先创建临时文件,例如使用
touch
命令:
# touch tempfile
然后使用
chown
修改用户所有权和组所有权:
若要同时修改用户和组,可使用如下命令:
bash
# chown -v user-owner.group-owner tempfile
若只修改用户所有权,可使用:
bash
# chown -v user-owner tempfile
若要将用户所有权设为
user-owner
,组设为
user-owner
的默认组,可使用:
bash
# chown -v user-owner. tempfile
若只修改组所有权,可使用:
bash
# chown -v .group-owner tempfile
若以另一个文件为模板设置所有权,可使用:
bash
# chown -v --reference=rfile tempfile
其中,
-v
选项用于详细报告操作情况。
56、使用chgrp命令修改临时文件的组所有权。
可以使用以下命令来实现:
chgrp [options] group-owner files
或者
chgrp [options] --reference=rfile files
例如,若要递归地将整个
sales
目录的组所有者更改为
sales
,可以使用命令:
# chgrp -Rv sales sales
57、按如下方式创建一个临时文件和链接:$ touch a_file $ ln -s a_file an_slink $ ln a_file an_hlink 现在验证该文件和硬链接确实共享一个索引节点,并且符号链接指向原始文件,应该使用什么命令,该命令执行后如何判断文件和硬链接共享索引节点、符号链接指向原始文件?
应该使用命令:
$ ls -li a_file an_slink an_hlink
该操作流程是先创建一个名为
a_file
的文件,接着创建指向
a_file
的符号链接
an_slink
和硬链接
an_hlink
,最后使用
ls -li
命令查看文件和链接信息。
若
a_file
和
an_hlink
的inode编号相同,则说明它们共享一个inode;符号链接
an_slink
会显示指向
a_file
,表明它指向原始文件。
58、访问 http://www.pathname.com/fhs/ 查看 FHS 的最新版本。
需访问指定网址查看 FHS 最新版本。
59、使用 which 命令检查可执行文件的位置。
使用
which
命令的语法为:
which command
例如,要确定输入
tcsh
命令时将启动的 shell 的位置,可以使用:
# which tcsh
输出结果可能为:
/bin/tcsh
which
命令会搜索用户的
PATH
变量来确定可执行程序的位置,并显示其完整路径名。
60、使用
find
命令搜索
bash
:
$ find / -name bash
。现在使用
locate
命令搜索同一个文件:
$ locate bash
。结果有何不同?描述每个命令在何种场景下有用。
find
bash
$ find / -name bash
locate
$ locate bash
结果差异
find
命令会从根目录
/
开始递归搜索,实时遍历文件系统来查找匹配的文件,搜索时间长,但能找到最新创建或重命名的文件;
locate
命令通过搜索预先生成的数据库来查找文件,速度快,但如果数据库未及时更新,可能无法找到最近创建或重命名的文件。
使用场景
find
适用于需要精确查找最新文件、根据文件属性(如日期、权限、文件类型等)查找文件,或文件系统结构经常变动的情况;
locate
适用于快速查找已知文件名且文件不经常移动、重命名或创建的情况。
61、设备名 /dev/hda 代表哪种硬件?a. 声卡 b. 调制解调器 c. IDE 硬盘 d. SCSI 硬盘 e. SATA 硬盘
C
62、要确定系统上是否存在IRQ冲突,应该查询哪个文件?a. /proc/ioports b. /proc/interrupts c. /proc/cpuinfo d. /proc/meminfo e. /proc/irqstatus
b
63、使用 #!/bin/bash 语法创建一个简单的 bash 脚本,设置可执行权限位并执行该脚本。如果脚本运行正常,添加错误以查看诊断消息。让脚本同时报告已导出和未导出的变量。验证未导出的变量在新 shell 启动后不会保留。
以下是具体步骤和示例代码来完成这个任务:
创建简单的 bash 脚本
:
使用任意文本编辑器创建一个名为
test_script.sh
的文件,内容如下:
“`bash
#!/bin/bash
# 定义未导出的变量
non_exported_var=”I am a non-exported variable”
# 导出变量
export exported_var=”I am an exported variable”
# 打印变量
echo “Non-exported variable: $non_exported_var”
echo “Exported variable: $exported_var”
# 模拟一个错误命令(尝试访问不存在的文件)
cat non_existent_file
“`
设置可执行权限位
:
在终端中运行以下命令为脚本添加可执行权限:
bash
chmod +x test_script.sh
执行脚本
:
运行脚本并查看输出:
bash
./test_script.sh
你应该会看到未导出和已导出变量的值,以及
cat non_existent_file
命令产生的错误消息。
验证未导出的变量在新 shell 启动后不会保留
:
在脚本中添加启动新 shell 的代码,修改后的
test_script.sh
如下:
“`bash
#!/bin/bash
# 定义未导出的变量
non_exported_var=”I am a non-exported variable”
# 导出变量
export exported_var=”I am an exported variable”
# 打印变量
echo “Non-exported variable: $non_exported_var”
echo “Exported variable: $exported_var”
# 模拟一个错误命令(尝试访问不存在的文件)
cat non_existent_file
# 启动新的 bash shell
bash <<EOF
echo “Inside new shell – Non-exported variable: $non_exported_var”
echo “Inside new shell – Exported variable: $exported_var”
EOF
“`
再次运行脚本:
bash
./test_script.sh
在新 shell 中,你会发现未导出的变量
non_exported_var
没有值,而已导出的变量
exported_var
仍然有值,这就验证了未导出的变量在新 shell 启动后不会保留。
64、在当前 shell 中创建一些 bash 别名。通过在当前 shell 中运行 bash 命令启动一个新的 shell。这些别名在子 shell 中是否有效?为什么?
这些别名在子 shell 中无效。因为别名是当前 shell 本地的,不会传递给程序或其他 shell。
65、使用 useradd 命令添加一个用户,同时创建一个新的主目录,并将 /etc/skel 目录下的文件复制到该主目录中。
可以使用
useradd -m
命令来添加用户并创建新的主目录,由于默认情况下
useradd -m
会将
/etc/skel
下的文件复制到新用户主目录,示例命令如下:
useradd -m username
其中
username
是要添加的用户的名称。
66、使用 groupadd 命令添加一个组。
使用命令
groupadd group
来添加组,其中
group
是要添加的组名,例如添加名为
sales
的组,使用命令:
# groupadd sales
67、使用 passwd 命令为新用户设置密码。
使用命令
passwd [options] username
可以交互式地为指定用户名设置密码,密码不能在命令行输入。
例如要为用户 bsmith 设置密码,可执行:
passwd bsmith
68、登录新账户,并使用 newgrp 命令切换到新组。
这是一个操作步骤描述。具体操作时,步骤如下:
使用新账户登录系统。
在命令行输入
newgrp 新组名
来切换到指定的新组。
69、使用groupdel和userdel删除新组和用户(包括主目录)。
删除用户组和用户
删除新组
使用
groupdel
命令,语法为:
bash
groupdel group
例如删除名为
newgroup
的组,可执行命令:
bash
groupdel newgroup
删除用户并同时删除其主目录
使用
userdel -r
命令,语法为:
bash
userdel -r user
例如删除名为
newuser
的用户及其主目录,可执行命令:
bash
userdel -r newuser
70、在你的个人 crontab 文件中添加一个条目来执行一项任务,比如给你发送一封电子邮件。确认该操作按预期发生。尝试使用五个时间指定符。
可以使用
crontab -e
命令编辑个人 crontab 文件,按
分钟 小时 日期 月份 星期 命令
的格式添加条目,例如:
0 9 * * * echo '这是测试邮件' | mail -s '测试' your_email@example.com
表示每天上午9点发送邮件。添加后保存退出,等待执行时间验证是否收到邮件,还可修改时间指定符进行更多测试。
71、使用 at 命令在未来安排一个命令。at 与 cron 有何不同?
定时任务工具对比
cron 系统
:用于定期、周期性地执行命令。
at 命令
:用于将一个命令或一组命令的执行延迟到未来某个时间,是一次性的命令执行安排,且使用 at 无需创建重复的 cron 条目。
72、在你的配置中添加 local5 设施。使用 logger 写入新的日志文件,并验证其内容。将你的日志条目与 /var/log/messages 中的日志条目进行比较。
可在 `/etc/syslog.conf` 中添加如下行来配置 `local5` 设施:
Define a new log file for the local5 facility
local5.* /var/log/local5
然后使用以下命令通过 `logger` 写入日志:
```bash
$ logger -p local5.info "Script terminated normally"
新日志文件
/var/log/local5
会包含带时间戳和发送消息主机名的日志条目。
要验证内容,可使用
cat
或
less
等命令查看
/var/log/local5
文件。
将其与
/var/log/messages
比较时,
/var/log/messages
依据
*.info;mail.none;authpriv.none /var/log/messages
配置,包含除邮件和认证私有信息外所有设施
info
级别及以上消息。
local5
日志文件则仅包含
local5
设施相关消息。
##73、检查 /etc/logrotate.conf 文件。/var/log/messages 文件轮转后会发生什么?
给定的文本内容调整为 Markdown 格式如下:
/var/log/messages 文件轮转后,会执行 postrotate 脚本中的命令,即
/usr/bin/killall -HUP syslogd
。
##74、请说明如何检查打印机状态以及如何向打印机队列发送打印任务。
可通过 `lpq -P printer` 和 `lpc status` 检查打印机状态,确认状态后,使用 `lpr -P printer file` 命令将指定文件发送到指定打印机队列进行打印。
##75、使用dig命令从DNS服务器定位有关域名的信息,请列举不同查询需求下的命令示例。
可以使用以下命令:
1. 查询默认DNS服务器中域名信息:
`dig www.oreilly.com`
2. 查询指定DNS服务器中域名信息:
`dig @10.20.10.10 www.oreilly.com`
3. 查询指定IP地址的PTR(反向)记录:
`dig -x 208.201.239.100`
4. 查询指定域名的MX(邮件交换)记录:
`dig mx www.oreilly.com`
##76、使用traceroute命令检查到一个指定网站的路由,并说明如何设置初始探测的生存时间值以及如何显示数字地址而非名称。
可以使用以下命令格式:
traceroute [options] destination
例如要检查到 oreilly.com 的路由,可使用命令:
traceroute oreilly.com
若想设置初始探测的生存时间值为 5,可使用命令:
traceroute -f 5 oreilly.com
若想显示数字地址而非名称,可使用命令:
traceroute -n oreilly.com
##77、一般来说,描述一种在本地文件系统中定位SUID程序的方法。为什么管理员要定期进行这项操作?
## 定位本地文件系统中 SUID 程序的方法
定位本地文件系统中 SUID 程序的方法是使用 `find` 命令,示例如下:
```bash
find /bin -perm -4000 -type f
其中,
-perm -4000
选项表示只显示设置了 SUID 位的文件。
管理员定期进行这项操作是因为 SUID 可能带来安全风险。如果不合理授予访问权限,会破坏系统的安全协议。管理员需要清楚系统上哪些程序设置了 SUID 和/或 SGID 位,对于不需要 SUID 位的程序可以将其移除,以增强系统安全性。
78、描述影子密码以及存储密码的文件。为什么我们不再将加密后的密码字符串存储在 /etc/passwd 中?
影子密码
影子密码是一种增强系统安全性的密码存储方式。
用户的加密密码字符串存储在
//etc/shadow
文件中,该文件具有受限的权限。
不再将加密后的密码字符串存储在
/etc/passwd
中的原因是,
/etc/passwd
是世界可读的文件,任何系统用户都可以访问其中存储的每个其他用户的加密密码。
虽然从加密字符串中数学推导原始密码极其困难,但攻击者可以使用相同的加密算法对随机字符串进行加密,并将结果与其他用户的加密字符串进行比较,即进行暴力攻击。
如果攻击者有足够的耐心并尝试足够多的字母和数字组合,最终可能找到与用户账户加密字符串匹配的密码。
79、就ulimit命令而言,硬限制和软限制有什么区别?
硬限制由超级用户为用户或用户组设置,不能被超越;软限制也由超级用户设置,但用户在需要时可临时超越(通过调用 `ulimit` 命令),这种临时提升仅在用户的 shell 会话期间有效。硬限制和软限制由超级用户在 `/etc/security/limits.conf` 文件中为所有用户设置。
80、在有多个管理员的环境中,为什么建议使用sudo而不是su?
使用
sudo
无需向他人分发 root 密码就能让他们运行一些命令;
sudo
会记录每个命令(已完成和尝试执行的),而若多人以 root 身份登录进行维护,无法确切知道哪个用户在特定时间以 root 身份登录并运行了什么命令,
sudo
可解决此问题。
81、使用nmap命令可以确定远程系统的哪些信息?
可以确定远程系统开放的端口、运行的软件、操作系统等信息
还能发现子网中哪些主机处于“活动”状态(即响应
ping
)
82、描述使用 SSH 在系统之间进行基于密钥认证的过程。
生成公钥
:通过
ssh-keygen
生成公钥,公钥位于
~/.ssh/id_dsa.pub
。
传输公钥
:将公钥传输到远程机器,由于是公钥,无需特殊安全措施。
放置公钥
:在远程机器上,将公钥添加到
~/.ssh/authorized_keys2
文件末尾。
认证登录
:拥有对应私钥的用户可以无需密码登录到该远程账户。
83、描述如何使用gpg加密文件。
下面是给定的【文本内容】:
假设要加密名为
chapter24.odt
的文件,以便只有名为 Andy Oram 的用户可以使用它,可使用以下命令:
$ gpg -e -u "James Stanger" -r "Andy Oram" chapter24.odt
加密后的文件名为
chapter24.odt.gpg
。
84、在 /etc/sudoers 文件中创建一个条目,允许你的用户账户以 root 身份运行任何命令。通过 sudo 运行一些命令并查看 /var/log/messages 文件。你会看到哪些条目?在多管理员环境中这有什么用处?
## 创建条目
在 `/etc/sudoers` 文件中添加以下内容:
your_username ALL=(ALL) ALL
> 请将 `your_username` 替换为你的实际用户名。
运行命令后查看 `/var/log/messages` 文件,会看到记录了用户使用 `sudo` 执行命令的详细信息,如执行时间、用户名、执行的命令等。
在多管理员环境中,`sudo` 会详细记录每个管理员执行的命令,这样可以明确在特定时间是哪个管理员登录为 root 并执行了什么命令,便于追踪和审计操作,增强系统安全性和管理的透明度。
85、查看 /etc/shadow 文件。哪些用户账户没有密码?为什么它们没有密码?
以下是将给定文本内容调整为 Markdown 格式的结果:
`bin`、`daemon`、`adm` 和 `lp` 账户没有密码。这些账户是系统账户,用于运行系统进程和维护文件所有权,不需要交互式登录,所以账户被禁用了交互式登录,因此没有密码。
86、使用 chage 命令为你的账户设置密码有效期。
可以使用
chage
命令的不同选项来设置密码有效期,例如:
-d LASTDAY
设置自1970年1月1日起密码最后一次更改的天数
-E EXPIREDATE
设置用户账户在某一日期过期
-m MINDAYS
设置密码更改之间的最小天数
-M MAXDAYS
设置密码有效的最大天数
-W WARNDAYS
设置密码过期前系统开始警告用户的天数
示例
:若要强制用户
adamh
下次登录时更改密码,可使用命令:
# chage -d 0 adamh
87、运行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`)无限制
对用户设置比较有用的限制包括:
- 限制用户可创建的文件大小,避免占用过多磁盘空间
- 限制用户可运行的进程数量,防止用户过度消耗系统资源导致服务器性能下降
- 限制用户可打开的文件数量,避免用户打开过多文件耗尽系统资源
- 限制用户可使用的内存大小,防止用户程序消耗过多内存影响其他程序运行
88、当你输入命令名称时,哪个环境变量保存了shell搜索的所有目录列表?a. $LIST b. $VIEW c. $PATH d. $ENV e. 以上都不是
C
89、为什么用户应该使用 ssh 而不是 telnet?
SSH 简介
SSH 是过时的
telnet
命令的替代方案,主要用于对远程主机进行加密的 shell 会话。而
telnet
未提供加密功能,使用 SSH 能保障数据传输的安全性。