深入探索脚本编程与系统安全基础
1. 条件表达式的运用
脚本语言支持多种条件表达式,这些表达式能让脚本根据特定条件(通常是变量的值)执行不同操作。其中,
if
是常用的使用条件表达式的命令,它能让系统依据条件的真假执行两种不同操作。
if
关键字后的条件表达式放在方括号内,形式多样。例如:
-
-f file
:当文件存在且为普通文件时为真。
-
-s file
:当文件存在且大小大于 0 时为真。
-
string1 == string2
:当两个字符串值相同时为真。
条件表达式还可以用逻辑与(
&&
)和逻辑或(
||
)运算符组合。使用
&&
时,运算符两边都为真,整个条件才为真;使用
||
时,只要运算符一边为真,整个条件就为真。
以下是一个示例代码片段:
if [ -s /tmp/tempstuff ]
then
echo “/tmp/tempstuff found; aborting!”
exit
fi
此代码片段会在
/tmp/tempstuff
文件存在时使脚本退出。
then
关键字标志着仅在条件为真时执行的一系列命令的开始,
fi
标志着
if
块的结束。
条件表达式还可以使用
test
关键字替代方括号:
if test -s /tmp/tempstuff
也可以将命令的返回值作为条件来测试:
if [ command ]
then
additional-commands
fi
在这个例子中,只有当
command
成功完成时,
additional-commands
才会运行。
2. 条件表达式的扩展
条件表达式可以通过
else
子句进行扩展:
if [ conditional-expression ]
then
commands
else
other-commands
fi
这种形式的代码会根据
conditional-expression
的计算结果,执行
commands
或
other-commands
。
当可能有多个结果时,嵌套多个
if/then/else
子句会变得很繁琐,此时可以使用
case
语句:
case word in
pattern1) command(s);;
pattern2) command(s);;
...
esac
word
通常是一个变量,每个
pattern
是该变量的一个可能值。模式可以像文件名一样使用通配符扩展。每个命令集必须以双分号(
;;
)结尾,
case
语句以
esac
结尾。执行时,
bash
会执行与
word
匹配的第一个模式相关的命令,然后跳转到
esac
语句后的行。如果没有模式匹配,
case
语句内的代码不会执行。若要设置默认条件,可以使用
*
作为最后一个模式。
3. 循环的使用
条件表达式有时会在循环中使用。循环结构能让脚本重复执行同一任务,直到特定条件满足(或不满足)。
例如,以下脚本会播放目录中所有的
.wav
音频文件:
#!/bin/bash
for d in `ls *.wav`; do
aplay $d
done
for
循环会为
ls *.wav
生成的列表中的每个项目执行一次。每个项目(文件名)会依次赋值给
$d
变量,并传递给
aplay
命令。
seq
命令在创建
for
循环时很有用,它能生成从第一个参数到最后一个参数的数字列表。例如,
seq 1 10
会生成 10 行,每行一个 1 到 10 之间的数字。可以使用
for x in
seq 1 10
` 让循环执行 10 次,每次迭代时
x` 的值递增。
另一种循环是
while
循环,只要条件为真就会执行,基本形式如下:
while [ condition ]
do
commands
done
until
循环形式类似,但只要条件为假就会继续执行,直到条件变为真。
4. 函数的使用
函数是脚本中执行特定子任务的部分,可以通过名称从脚本的其他部分调用。函数的定义方式是在函数名后加括号,并将组成函数的行用花括号括起来:
myfn() {
commands
}
function
关键字可以可选地放在函数名前。函数可以像普通的内部或外部命令一样通过名称调用。
函数有助于创建模块化脚本。例如,一个需要执行多个不同计算的脚本,可以将每个计算放在一个函数中,然后按顺序调用这些函数。以下是一个示例脚本:
#!/bin/bash
doit() {
cp $1 $2
}
function check() {
if [ -s $2 ]
then
echo “Target file exists! Exiting!”
exit
fi
}
check $1 $2
doit $1 $2
这个脚本会复制文件,但如果目标文件已存在,会输出错误信息并退出。
5. 设置脚本的退出值
通常,脚本的返回值与脚本调用的最后一个命令相同,即返回
$?
。可以使用
exit
命令控制退出值或在任何时候退出脚本。不带任何选项使用
exit
会立即终止脚本,返回通常的退出值
$?
。如果传递一个 0 到 255 之间的数值给
exit
,脚本会终止并返回该指定值作为脚本自己的退出值。
例如,可以设置一个变量
$termcause
来跟踪脚本终止的原因:
exit $termcause
6. 理解基本安全
Linux 是多用户操作系统,它提供账户功能,让多个用户共享一台计算机,同时也能让系统管理员跟踪资源使用情况。与账户相关的是组,组是账户的集合,可以被赋予特殊权限。
7. 理解账户
账户能让多个用户共享计算机而互不干扰,还能帮助系统管理员跟踪资源使用和违规行为。账户的一些特性可以帮助识别账户及其相关的文件和资源,了解这些特性有助于解决账户相关问题和管理计算机用户。
8. 账户特性的理解
大多数账户特性在
/etc/passwd
文件中定义,该文件由冒号分隔的行组成,每行定义一个账户。例如:
rich:x:1003:100:Rich Blum:/home/rich:/bin/bash
各字段信息如下:
| 字段 | 说明 |
| ---- | ---- |
| 用户名 | 账户最相关的特征,多数 Linux 账户用户名由小写字母和数字组成,部分系统允许下划线、破折号和结尾的美元符号。 |
| 密码 | 通常用户账户需要密码登录,大多数系统账户禁止直接登录,因此没有密码。
/etc/passwd
文件中的密码字段通常为
x
,表示密码存储在
/etc/shadow
文件中。 |
| UID | 计算机使用用户标识号来跟踪账户,
UID
从 0 开始(
root
账户),多数发行版中用户账户的
UID
从 1000 及以上开始,较低的号码保留给系统账户。 |
| GID | 账户与一个或多个组相关联,每个账户通过组标识号直接关联到一个主组。 |
| 注释字段 | 通常保存用户的全名,但也可以保存其他信息。 |
| 主目录 | 用户账户和部分系统账户有主目录,是账户的“大本营”。使用波浪号(
~
)可以方便地访问用户主目录。 |
| 默认 shell | 每个账户关联一个默认 shell,Linux 中通常是 Bash,但用户可以更改。多数非
root
系统账户将默认 shell 设置为
/usr/sbin/nologin
或
/sbin/nologin
以增强安全性。 |
9.
/etc/shadow
文件
如今,密码存储在
/etc/shadow
文件中,普通用户无法读取该文件。一个典型的
/etc/shadow
条目如下:
rich:$1$E/moFkeT5UnTQ3KqZUoA4Fl2tPUoIc:16860:5:30:14:-1:-1:
各字段含义如下:
| 字段 | 说明 |
| ---- | ---- |
| 用户名 | 每行以用户名开头,通过用户名将该文件的条目与
/etc/passwd
文件中的条目关联。 |
| 密码 | 密码以加盐哈希的形式存储,与实际密码无明显相似之处。星号(
*
)或感叹号(
!
)表示账户无密码(即账户被锁定)。 |
| 上次密码更改日期 | 表示上次更改密码的日期,以自 1970 年 1 月 1 日以来的天数存储。 |
| 允许更改的天数 | 表示在允许更改密码之前需要等待的天数,用于防止用户频繁更改密码。 |
| 需要更改的天数 | 表示自上次更改密码后,再次需要更改密码的天数。 |
| 密码过期警告天数 | 如果系统配置为使密码过期,可以设置在密码过期日期临近时警告用户。 |
| 过期与停用之间的天数 | Linux 允许账户过期和完全停用之间有一个间隔。过期的账户要么不能使用,要么登录后需要立即更改密码。停用的账户密码会被擦除,需要系统管理员重新激活才能使用。值为 -1 表示此功能禁用。 |
| 过期日期 | 表示账户将过期的日期,以自 1970 年 1 月 1 日以来的天数表示。值为 -1 表示此功能禁用。 |
| 特殊标志 | 保留供将来使用,通常不使用或包含无意义的值。 |
10. 账户管理的要点
需要注意的是,账户不是像程序二进制文件那样的单一实体,账户信息分散在多个配置文件中,如
/etc/passwd
、
/etc/shadow
、
/etc/group
等,用户文件可能存储在主目录或其他地方。因此,管理账户可能需要维护多个文件,为此存在各种实用工具来帮助创建、管理和删除账户。
综上所述,掌握脚本编程中的条件表达式、循环、函数和退出值设置,以及理解系统安全中的账户和组的概念,对于 Linux 用户和管理员来说至关重要。这些知识能帮助他们更好地管理系统、简化任务和保障系统安全。
深入探索脚本编程与系统安全基础
11. 脚本编程与系统安全的综合应用
在实际的系统管理和操作中,脚本编程和系统安全知识常常相互结合,发挥出强大的作用。例如,我们可以编写一个脚本来检查系统中账户的安全性。
以下是一个简单的脚本示例,用于检查
/etc/passwd
文件中所有用户的默认 shell 是否为安全的:
#!/bin/bash
while IFS=: read -r username password uid gid comment home shell; do
if [ "$shell" != "/bin/bash" ] && [ "$shell" != "/usr/sbin/nologin" ] && [ "$shell" != "/sbin/nologin" ]; then
echo "用户 $username 的默认 shell $shell 可能不安全。"
fi
done < /etc/passwd
这个脚本的执行流程如下:
1. 使用
while
循环逐行读取
/etc/passwd
文件。
2. 使用
IFS=:
来指定字段分隔符为冒号。
3. 对于每一行,将各个字段分别赋值给
username
、
password
、
uid
等变量。
4. 检查
shell
变量的值是否为安全的 shell,如果不是,则输出警告信息。
12. 系统安全的重要性及保障措施
系统安全是 Linux 系统管理中至关重要的一环。由于 Linux 是多用户操作系统,多个用户共享同一台计算机,因此保障系统安全可以防止用户之间的干扰和数据泄露等问题。
为了保障系统安全,可以采取以下措施:
-
合理设置账户权限
:根据用户的工作职责和需求,为不同的账户分配不同的权限。例如,普通用户只需要基本的操作权限,而系统管理员则需要更高的权限来执行系统管理任务。
-
定期更新系统和软件
:及时更新系统和软件可以修复已知的安全漏洞,提高系统的安全性。
-
使用防火墙
:防火墙可以阻止未经授权的网络访问,保护系统免受外部攻击。
-
监控系统日志
:定期查看系统日志可以及时发现异常行为和安全事件,采取相应的措施进行处理。
13. 账户管理工具的使用
为了方便账户的创建、管理和删除,Linux 系统提供了许多实用工具。以下是一些常用的账户管理工具及其使用方法:
| 工具 | 功能 | 使用示例 |
| ---- | ---- | ---- |
|
useradd
| 创建新用户账户 |
useradd -m -s /bin/bash newuser
:创建一个名为
newuser
的新用户,同时创建主目录,并将默认 shell 设置为
/bin/bash
。 |
|
usermod
| 修改用户账户信息 |
usermod -l newname oldname
:将用户
oldname
的用户名改为
newname
。 |
|
userdel
| 删除用户账户 |
userdel -r olduser
:删除用户
olduser
及其主目录。 |
|
passwd
| 设置或修改用户密码 |
passwd username
:为用户
username
设置或修改密码。 |
14. 脚本编程的优化与拓展
在编写脚本时,除了掌握基本的条件表达式、循环和函数等知识外,还可以进行一些优化和拓展,以提高脚本的性能和功能。
例如,可以使用函数来封装一些常用的操作,提高代码的复用性。以下是一个封装了文件复制和检查目标文件是否存在功能的脚本:
#!/bin/bash
# 复制文件函数
copy_file() {
cp $1 $2
if [ $? -eq 0 ]; then
echo "文件 $1 成功复制到 $2。"
else
echo "文件复制失败。"
fi
}
# 检查目标文件是否存在函数
check_target_file() {
if [ -s $2 ]; then
echo "目标文件 $2 已存在!退出。"
exit
fi
}
# 主程序
check_target_file $1 $2
copy_file $1 $2
这个脚本将文件复制和检查目标文件是否存在的功能分别封装在两个函数中,提高了代码的可读性和复用性。
15. 系统安全的风险评估与应对
为了确保系统的安全性,需要定期进行风险评估,及时发现潜在的安全风险,并采取相应的措施进行应对。
风险评估可以从以下几个方面进行:
-
账户安全
:检查账户的密码强度、权限设置等是否合理。
-
网络安全
:检查防火墙设置、网络服务的开放情况等是否存在安全隐患。
-
软件安全
:检查系统和软件是否及时更新,是否存在已知的安全漏洞。
根据风险评估的结果,可以采取以下应对措施:
-
加强账户安全
:要求用户设置强密码,定期更换密码,限制账户的登录权限等。
-
优化网络安全
:调整防火墙规则,关闭不必要的网络服务,加强网络访问控制等。
-
更新软件
:及时更新系统和软件,修复已知的安全漏洞。
16. 总结与展望
脚本编程和系统安全是 Linux 系统管理中两个重要的方面。通过掌握脚本编程的基本技能,如条件表达式、循环、函数和退出值设置等,可以编写高效、实用的脚本,简化系统管理任务,提高工作效率。同时,理解系统安全的基本概念,如账户、组、权限等,以及采取相应的保障措施,可以确保系统的安全性和稳定性。
在未来的系统管理工作中,随着技术的不断发展和应用场景的不断变化,脚本编程和系统安全的重要性将更加凸显。我们需要不断学习和掌握新的知识和技能,以应对日益复杂的系统管理挑战。同时,也需要加强安全意识,定期进行系统安全检查和维护,确保系统的安全运行。
以下是一个简单的 mermaid 流程图,展示了一个基本的系统安全检查流程:
graph TD;
A[开始] --> B[检查账户安全];
B --> C{账户安全是否达标};
C -- 是 --> D[检查网络安全];
C -- 否 --> E[加强账户安全];
E --> B;
D --> F{网络安全是否达标};
F -- 是 --> G[检查软件安全];
F -- 否 --> H[优化网络安全];
H --> D;
G --> I{软件安全是否达标};
I -- 是 --> J[结束];
I -- 否 --> K[更新软件];
K --> G;
通过以上的学习和实践,相信大家对脚本编程和系统安全有了更深入的理解和掌握。在实际工作中,我们可以将这些知识应用到具体的场景中,为系统的稳定运行和安全保障贡献自己的力量。
超级会员免费看
5万+

被折叠的 条评论
为什么被折叠?



