一篇文章带你看懂Shell 脚本,从零基础到精通,收藏这篇就够了!

一. Shell 脚本:渗透测试的“玩具”还是运维自动化的“核弹”?

Shell,这玩意儿,你说它是啥?一个古老的命令行界面?还是个能把运维工程师从重复劳动中解放出来的脚本引擎?在网络安全圈,对 Shell 的看法更是两极分化。有人觉得它就是个“玩具”,搞渗透测试时偶尔用用;但也有人把它当成“核弹”,在自动化安全运维中发挥巨大威力。

1. Shell 脚本:不仅仅是个命令行

别再把 Shell 脚本当成简单的命令行工具了!它其实是个迷你编程语言,能帮你把一连串的命令串起来,自动完成各种任务。

1. Shell 脚本这几块“砖”,你必须得懂

想玩转 Shell 脚本?先搞清楚这几个基本概念:

1.1 注释:给代码加点“人话”

# 井号开头的就是注释,给代码加点解释,方便自己和别人看懂。不然过几天回头看,鬼知道你写的是啥!

1.2 变量:装数据的“盒子”

= 等号给变量赋值,比如 IP="192.168.1.1"。记住,等号两边不能有空格!变量就像一个个盒子,可以装字符串、数字,甚至是数组。

1.3 控制结构:让脚本会“思考”

if...elseforwhile 这些就是控制结构,让脚本可以根据条件判断,或者重复执行某些操作。没有它们,脚本就只能一条路走到黑,太死板了。

1.4 函数:代码的“积木”

function_name() { ... } 定义函数,把常用的代码块封装起来,方便重复使用。就像搭积木一样,把一个个小功能组合成一个大应用。

1.5 输入输出重定向:数据流的“搬运工”

<>>> 这些符号,可以改变命令的输入输出方向,把数据从文件搬到命令,或者把命令的结果存到文件。

2. Shell 脚本“方言”大观:选哪个好?

Shell 也有很多种,就像各地的方言一样。常见的有:

2.1 Bash:Linux 界的“普通话”

Bash 是 Linux 和 macOS 的默认 Shell,也是最流行的。兼容 POSIX 标准,功能也比较全,用的人最多。

2.2 Zsh:程序员的“潮语”

Zsh 拥有强大的自动补全功能和插件支持,深受开发者喜爱。就像编程界的 "Oh My Zsh" 一样,谁用谁知道!

2.3 Ksh:老牌“贵族”

Ksh 结合了 C Shell 和 Bourne Shell 的特点,功能强大但相对小众。

2.4 Dash:轻量级“特种兵”

Dash 设计简洁高效,通常用作系统初始化时的 Shell。体积小,启动快,适合在资源有限的环境中使用。

3. Shell 脚本:网络安全领域的“十八般武艺”

Shell 脚本在网络安全领域应用广泛,比如:

3.1 系统安全巡检:自动化“体检”

定期检查系统配置、用户权限、安全漏洞等,及时发现安全隐患。

3.2 自动化渗透测试:效率“加速器”

编写脚本模拟攻击行为,快速发现目标系统的弱点。

3.3 日志分析:从“蛛丝马迹”中发现攻击

分析大量的日志文件,提取关键信息,追踪攻击者的行为。

3.4 应急响应:快速“止血”

在安全事件发生后,快速执行一系列操作,隔离受影响系统,阻止攻击扩散。

二. Shell 变量:网络安全工具箱里的“百宝箱”

1. 变量:存储安全信息的“容器”

Shell 变量,就像网络安全工具箱里的“百宝箱”,可以用来存储各种信息,比如 IP 地址、域名、用户名、密码等等。

2. 变量:安全脚本的“基石”

变量是 Shell 脚本的基石,掌握了变量的使用,才能编写出灵活、可维护的安全脚本。

3. 变量的定义与赋值:给“百宝箱”贴标签

给变量赋值的语法很简单:

MY_VAR="敏感信息"

注意,等号两边不能有空格!变量名通常用大写字母,用下划线分隔单词。

4. 引用变量:打开“百宝箱”

使用变量的值,需要在变量名前面加上美元符号 $

echo "敏感信息是:$MY_VAR"

5. 特殊变量:Shell 自带的“锦囊妙计”

Shell 还提供了一些特殊的预定义变量,比如:

  • $HOME:当前用户的主目录。
  • $USER:当前用户的用户名。
  • $PATH:可执行程序的搜索路径。
  • $PWD:当前工作目录。
  • $0:当前脚本的名称。

这些变量就像 Shell 自带的“锦囊妙计”,可以方便地获取系统信息。

6. 变量的作用域:谁能访问“百宝箱”?

Shell 变量的作用域通常是局部的,只在当前 Shell 进程及其子进程中可见。要想让变量在所有 Shell 进程中都可见,需要将其定义为环境变量。

7. 变量的“变形术”:高级用法

Shell 还支持变量的替换和扩展功能,比如:

  • ${VAR:-default}:如果变量 VAR 未定义或为空,则使用默认值。
  • ${VAR:=default}:如果变量 VAR 未定义或为空,则将其设置为默认值。
  • ${VAR:?message}:如果变量 VAR 未定义或为空,则输出错误信息并退出脚本。
  • ${VAR:+value}:如果变量 VAR 已定义且不为空,则返回给定的值。

这些功能可以让你更灵活地处理变量和参数,编写更健壮的安全脚本。

8. 数组变量:批量管理安全信息

在 Bash 等 Shell 中,还支持数组变量,可以用来存储多个数据项。

IPS=("192.168.1.1" "192.168.1.2" "192.168.1.3")
echo ${IPS[0]}  # 输出第一个 IP
echo ${IPS[@]}  # 输出所有 IP

数组变量可以方便地批量管理 IP 地址、域名等安全信息。

三. Shell 脚本参数传递:让安全脚本“动”起来

1. 脚本需要参数?就像黑客需要“武器”

Shell 脚本要处理各种安全任务,参数就像黑客手中的“武器”,让脚本能够根据不同的情况执行不同的操作。

2. Shell 脚本的“武器库”:参数变量

Shell 使用特定的变量来获取传递给脚本的参数:

  • $0:脚本本身的名称。
  • $1, $2, ..., $n:传递给脚本的第 1 个、第 2 个,直到第 n 个参数。
  • $@:所有参数的列表。
  • $#:参数的个数。

3. 简单示例:参数传递“初体验”

#!/bin/bash

echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "所有参数: $@"
echo "参数个数: $#"

执行 ./example.sh 192.168.1.1 80,输出:

脚本名称: ./example.sh
第一个参数: 192.168.1.1
第二个参数: 80
所有参数: 192.168.1.1 80
参数个数: 2

4. 参数处理“进阶技巧”

  • 选项参数: 使用 getopts 处理 -f filename 这种形式的参数。
  • 空格和引号: 参数包含空格或引号,用双引号括起来 "argument with spaces"
  • 默认值和验证: 使用条件语句设置默认值或验证参数的有效性。

5. 实战演练:参数传递在安全领域的应用

  • 批量扫描: 传递 IP 地址列表,批量扫描目标主机的端口。
  • 漏洞利用: 传递漏洞编号和目标 IP,自动化执行漏洞利用脚本。
  • 日志分析: 传递日志文件路径和关键词,快速提取关键信息。

四. Shell 数组:安全工具的“集结号”

1. 数组:批量管理安全目标的“利器”

Shell 数组可以存储多个数据项,方便批量管理安全目标,比如 IP 地址、域名、URL 等。

2. 数组的定义和赋值:创建安全目标的“清单”

IPS=("192.168.1.1" "192.168.1.2" "192.168.1.3")
PORTS[0]="80"
PORTS[1]="443"

3. 访问数组元素:从“清单”中提取目标

echo ${IPS[0]}  # 输出第一个 IP
echo ${PORTS[1]} # 输出第二个端口

4. 获取所有元素:一次性查看所有目标

echo ${IPS[@]}  # 输出所有 IP
echo ${PORTS[*]} # 输出所有端口

5. 获取数组长度:掌握目标的“数量”

echo ${#IPS[@]}  # 输出 IP 数量
echo ${#PORTS[*]} # 输出端口数量

6. 遍历数组:逐个处理安全目标

for ip in "${IPS[@]}"
do
    nmap $ip
done

7. 数组操作:灵活调整安全目标“清单”

  • 添加元素:IPS+=("192.168.1.4")
  • 删除元素:unset IPS[0]

8. 安全实战:数组的应用场景

  • 配置文件处理: 读取和管理多个配置项。
  • 日志数据处理: 分析和过滤多行日志数据。
  • 系统管理任务: 管理多个文件或目录路径。

五. Shell 运算符:安全脚本的“计算器”和“比较器”

1. 运算符:安全脚本的“计算器”

Shell 运算符可以进行数学运算、逻辑判断和字符串处理,让安全脚本能够进行各种复杂的计算和判断。

2. 算术运算符:加减乘除,安全计算的基础

a=10
b=20
echo $((a + b))  # 输出:30
echo $((b - a))  # 输出:10
echo $((a * b))  # 输出:200
echo $((b / a))  # 输出:2
echo $((b % a))  # 输出:0

3. 逻辑运算符:真真假假,安全判断的依据

a=10
b=20
if [ $a -eq $b ]
then
  echo "a 等于 b"
else
  echo "a 不等于 b"
fi

4. 字符串运算符:文本处理,安全分析的帮手

str1="hello"
str2="world"
if [ $str1 = $str2 ]
then
  echo "字符串相等"
else
  echo "字符串不相等"
fi

5. 赋值运算符:变量赋值,安全信息的存储

var="hello"
echo $var  # 输出:hello

6. 其他运算符:逻辑与、逻辑或、命令替换

  • &&:逻辑与
  • ||:逻辑或
  • `:命令替换
  • $():命令替换(另一种形式)

7. 使用注意事项:变量引用、条件判断

  • 变量引用:使用双引号将变量括起来,避免空格和特殊字符导致的意外行为。
  • 条件判断:使用方括号或双括号包裹表达式,注意空格的使用。

六. Shell 命令:安全脚本的“指令集”

1. Shell echo 命令:打印安全信息

echo 命令用于在终端输出文本或变量内容,是安全脚本中常用的信息输出工具。

1.1 基本用法
echo "Hello, World!"  # 输出:Hello, World!
1.2 常用选项
  • -e:启用转义字符解释。
  • -n:禁止输出结尾添加换行符。
  • -E:禁用转义字符解释(默认选项)。
1.3 输出变量内容
name="Alice"
echo "Hello, $name!"  # 输出:Hello, Alice!
1.4 结合其他命令输出
echo "Today is $(date)"  # 输出当前日期时间
1.5 安全应用
  • 脚本输出:输出提示信息、调试信息。
  • 文本处理:插入文本、拼接字符串。
  • 日志记录:输出日志信息到日志文件中。
1.6 高级用法
  • 颜色输出:使用 ANSI 转义序列输出彩色文本。
  • Here 文档:使用 << 语法输出多行文本。
1.7 使用注意事项
  • 引号问题:使用引号括起来字符串,避免特殊字符造成的误解释。
  • 转义字符:使用 -e 选项启用转义字符解释。
  • 换行符:使用 -n 选项禁止输出结尾添加换行符。

2. Shell printf 命令:格式化安全信息

printf 命令用于格式化输出文本和变量,提供更多的控制选项。

2.1 基本语法
printf FORMAT [ARGUMENT]...
2.2 基本用法
printf "Hello, world!
"
2.3 格式化输出
  • %s:输出字符串。
  • %d, %i:输出十进制整数。
  • %f:输出浮点数。
  • %c:输出字符。
  • %x, %X:输出十六进制数(小写或大写)。
2.4 控制输出宽度和精度
  • %10s:输出字符串,总宽度为 10 个字符。
  • %.2f:输出浮点数,保留 2 位小数。
2.5 转义序列

支持转义序列输出特殊字符。

2.6 安全应用
  • 格式化输出:生成表格、报告等。
  • 调试和日志:输出变量的值和调试信息。
  • Shell 脚本中的输出:与其他命令组合使用生成特定格式的输出。
2.7 使用注意事项
  • 变量和转义:确保变量的值不包含引号或特殊字符,或者适当进行转义。
  • 格式控制符的正确使用:使用正确的格式控制符避免输出意外结果或错误。
2.8 与 echo 的比较
  • printf:更灵活和精确的输出控制。
  • echo:更简单直观。

3. Shell test 命令:测试安全条件

test 命令用于检查文件类型和比较值,是安全脚本中常用的条件判断工具。

3.1 基本用法
test 条件
[ 条件 ]
3.2 常见条件
  • 检查文件是否存在:-e filename
  • 检查文件是否是普通文件:-f filename
  • 检查文件是否是目录:-d directory
  • 字符串比较:"hello" = "hello"
  • 数值比较:1 -eq 1
3.3 常见选项
  • 文件属性检查:-e, -f, -d, -s
  • 字符串比较:=, !=
  • 数值比较:-eq, -ne, -gt, -lt
3.4 安全应用
  • 条件语句:判断条件是否满足。
  • 循环控制:控制循环的执行次数或条件。
  • 脚本中的函数:判断参数是否合法或者满足特定条件。
3.5 使用注意事项
  • 空格问题:操作符和参数之间需要有空格。
  • 字符串比较注意引号:使用双引号括起来字符串。

7 Shell 流程控制:安全脚本的“指挥棒”

7.1 条件判断:安全策略的“决策者”

条件判断通过 if...else 结构实现,根据条件的真假执行不同的命令或代码块。

7.1.1 基本语法
if [ condition ]; then
    # 如果条件成立执行的命令
else
    # 如果条件不成立执行的命令
fi

示例

port=80
if [ $port -eq 80 ]; then
    echo "HTTP 端口"
else
    echo "非 HTTP 端口"
fi
7.1.2 多条件判断

使用 elif 实现多个条件的判断。

ip="192.168.1.1"
if [ $ip = "127.0.0.1" ]; then
    echo "本地主机"
elif [ $ip = "192.168.1.1" ]; then
    echo "内网主机"
else
    echo "外网主机"
fi

7.2 逻辑运算符:安全判断的“连接器”

  • -a:逻辑与
  • -o:逻辑或
  • !:逻辑非

7.3 循环:安全任务的“自动化执行器”

循环结构包括 forwhileuntil 循环,用于重复执行一段代码。

7.4 for 循环

for var in list
do
    # 执行的命令
done

示例

ports=(80 443 8080)
for port in ${ports[@]}
do
    nmap -p $port 192.168.1.1
done

7.5 while 循环

while [ condition ]
do
    # 执行的命令
done

示例

count=1
while [ $count -le 5 ]
do
    echo "扫描第 $count 个 IP"
    ((count++))
done

7.6 until 循环

until [ condition ]
do
    # 执行的命令
done

示例

num=0
until [ $num -ge 5 ]
do
    echo "Number is $num"
    ((num++))
done

7.7 安全应用

  • 文件处理:根据文件是否存在或者其属性进行不同的操作。
  • 数据处理:循环处理数据集合或者根据条件筛选数据。
  • 系统管理:根据系统状态执行不同的操作,如服务启停、日志清理等。

8 Shell 函数:安全脚本的“模块化工具箱”

8.1 基本语法

function_name() {
    # 函数体(命令序列)
}

或者

function function_name {
    # 函数体(命令序列)
}

示例

#!/bin/bash

# 定义一个简单的函数
check_port() {
    nmap -p $1 $2
}

# 调用函数
check_port 80 192.168.1.1

8.2 函数参数

函数可以通过特殊变量 $1, $2, $3 等来访问参数。

8.3 返回值处理

通过 return 语句返回退出状态码,或者通过修改全局变量或输出结果来实现。

8.4 安全应用

  • 代码复用:将重复执行的任务封装成函数。
  • 模块化开发:将大型任务分解成多个函数。
  • 错误处理:封装常见的错误处理逻辑为函数。

8.5 使用注意事项

  • 局部变量:使用 local 关键字声明局部变量。
  • 参数处理:谨慎处理参数,避免因为参数未定义或为空导致的意外行为。

9 Shell 输入/输出重定向:安全信息的“搬运工”

9.1 标准输入、标准输出和标准错误

  • 标准输入(stdin):默认从键盘接收输入。
  • 标准输出(stdout):默认输出到屏幕。
  • 标准错误(stderr):默认输出到屏幕,用于错误消息。

9.2 输出重定向

将命令的标准输出发送到文件。

command > output_file

9.3 追加重定向

将输出追加到文件末尾。

command >> output_file

9.4 输入重定向

从文件读取输入。

command < input_file

9.5 重定向标准错误

将错误消息重定向到文件。

command 2> error_file

9.6 合并标准输出和标准错误

command > output_file 2>&1

9.7 /dev/null 设备

丢弃输出。

command > /dev/null

9.8 管道操作

将一个命令的输出作为另一个命令的输入。

ls -l | wc -l

9.9 安全应用

  • 日志处理:将应用程序的输出重定向到日志文件中。
  • 自动化任务:将命令的输出静默或者记录到特定的文件中。
  • 错误处理:将错误消息记录到文件以便后续分析。

10 Shell 文件包含:安全配置的“模块化管理”

10.1 基本用法

使用 source 或者 . 命令来实现文件包含。

source filename
. filename

10.2 使用注意事项

  • 路径问题:注意文件的路径。
  • 变量共享:被包含的文件中定义的变量会成为包含文件的一部分。
  • 权限:被包含的文件需要具有执行权限。

10.3 安全应用

  • 函数库:将一组相关的函数放在一个文件中,并通过文件包含来复用这些函数。
  • 配置文件:将配置信息单独放在一个文件中,通过文件包含来加载这些配置信息。
  • 模块化开发:将大型脚本分解成多个模块,通过文件包含来组装这些模块。

10.4 使用文件包含处理配置文件

#!/bin/bash
# 包含配置文件
source config.sh
# 使用配置信息
echo "Connecting to $HOST:$PORT with username $USERNAME"

请注意,这只是一个示例,实际应用中需要根据具体情况进行调整。

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值