当前位置: 首页 > news >正文

红队-shell编程篇(上)

声明

通过学习 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,做出的文章如涉及侵权马上删除文章

笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负

一、建立Shell文件

1. Shell简介

Shell是一种命令行界面,用于用户与操作系统进行交互。它也是一种脚本语言,允许用户编写程序自动执行一系列命令。

Linux系统中常见的Shell类型包括bash、sh、dash等,其中bash是最常用的Shell之一。

2.建立一个1.sh文件

vim 1.sh

可以利用 #! /bin/bash,#! /bin/dash,#! /bin/sh

ls -l “路径” 是查看权限的 

这三种其实不管用哪种脚本解释器最后调用的还是这个dash


比如ls -l bin/sh 发现调用的还是dash

比如我们用 echo longyu.com 保存退出

运行一下 ./1.sh


就会输出 longyu.com (在复现的时候记得给予1.sh权限)

如果出现权限不足的情况时 如图 rw可读权限
使用指令:chmod u+x 8.sh 

这里使用的是777 然后直接 ./8.sh文件即可

3.sh

vim 2.sh

直接编辑模式输入 echo baidu.com
默认是没有权限的

但是我们利用 sh 2.sh
照样执行成功 bash 2.sh 或者 dash 2.sh 一样成功,因为他们都是脚本解释器,自带权限


我们执行脚本是在当前目录下执行的,如果你的脚本在别的目录
你就要去到那个目录,或者指定好对应路径

4.source

利用source 2.sh 执行和sh命令差不多
只不过这个命令就是对颜色加深标注了

比如我们重编辑一下这个文件


直接把ls命令放到2.sh里面去 sh 2.sh 可以看见直接输出了当前目录下的 2.sh颜色加深了
这个例子就是给大家说明一下这个shell脚本如何在这个里面进行一个执行

二,变量

1.变量声明和定义

举例 定义一个name变量,name="xiaoyu"
再利用 echo $name 打印出来,这就是简单的变量声明

比如 age="27"   echo $age 打印出来的 27

我们来写复杂点,比如说 echo my name is $name,and my age is $age years old


然后就直接打印出了 姓名 和年纪

一般来说加双引号和不加效果是一样的
echo "my name is $name,and my age is $age years old"


加单引号效果是不一样的
echo 'my name is $name,and my age is $age years old'


你会发现他并没有把变量赋值打印出来,而是直接把变量写进来了
区别就是不加或者双引号可以输出变量,但是加入单引号他会把变量当字符串输出出来

2.变量拼接

echo "my name is $name,and my age is $ageyears old"


这个例子中 years与age之间没有空格 所以打印出来为空
因为变量没有事先定义 所以为空


解决办法 将变量用双引号括起来它就会做一个区分
echo "my name is $name,and my age is "$age"years old"


那么除了""还能用什么呢 用{}也可以
echo "my name is $name,and my age is {$age}years old"

这样输出的变量会将输出内容利用花括号框起来


上面讲的全部是临时的一个变量,变量是由数字,字符串下划线组成,
但是不能以数字开头 例如9name,这种是不行的

变量中间最好不要有空格 比如说wanhao

如果非要用这种可以加个下划线 wan_hao="wanhao" 这种

我们怎么查看我们定义的变量呢比如说利用set命令,
比如说set | grep name,怎么删除变量呢我们使用 unset name
再次查看set | grep name就发现没有了

3.常见变量

echo $HOME(家目录 root用户)
/root

Windows中环境变量在path下添加

echo $HOME(家目录 root用户)
/root 

which --a ls (通过这个命令查看ls命令脚本所在路径)

再看看 echo $PATH 这么一个环境变量


usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sin:/bin:/usr/local/games:/usr/games
查看输出结果 存在/usr/bin 目录 就是当我们执行ls它会帮我们找到对应得目录做一个执行,也就是Is得完整路径应该是 /usr/bin/ls 脚本

(1)方法一

根据刚刚的说法
那我们能不能把我们1.sh脚本:直接写到/usr/bin/目录下,然后在kali终端直接输出呢
就是把脚本直接放入已经定义好的路径当中去
mv 1.sh /usr/bin


(2)方法二

那么我们也可以把/root/这个目录直接添加到环境变量中去让整个目录的文件都可以直接执行
export PATH=/root:PATH
echo $PATH (查看环境变量中root目录是否被添加)


export: 是一个用于设置环境变量的关键字,使得设置的变量可以在当前 shell 以及由该 shell 启动的子进程中生效。

PATH: 这是一个非常重要的环境变量,它定义了系统在哪些目录下去寻找可执行程序。当你在命令行输入一个命令(如ls、cat等)时,系统会根据PATH环境变量所指定的目录顺序去查找对应的可执行文件,找到后就执行它。

/root:PATH: 这里是在重新定义PATH的值。它将/root目录添加到了原有的PATH变量值的最前面(假设原有的PATH值存储在变量PATH中,这里通过:PATH的形式保留了原来的值并添加了新的部分)。这样做的结果是,当系统去查找可执行程序时,会先在/root目录下查找,然后再按照原来PATH所指定的其他目录顺序查找。

4.永久变量

刚刚的export只是设置了临时变量,那么我们只有把它写入到配置文件当中才能永久生效
vi .bashrc
export PATH=/root:PATH

source /usr/bin/ .bashrc

source (变量生效 或者重启生效)
新开一个窗口查看变量 1.sh 是否生效

5.字符串相关的操作

假设我们想知道一个字符串的长度,比如我们想解析一个字符串的长度我们如何进行实现?
比如 name="wanhao" age=27 然后我们通过echo"my name is$name,and i am $age years old" 打印完整字符串


str="hello word"
echo ${#tstr}

012345 6个字符
echo ${str:0:6}

三、脚本程序传递参数

脚本如下:

echo 执行的文件名是: $0
echo 第一个参数是: $1
echo 传递的参数作为一个字符串显示: $*
echo 传递的参数独立作为每个字符串显示: $@
echo 传递到脚本的参数个数是: $#
echo 最后命令的退出状态: $?
echo 脚本运行的当前进程ID是: $$

可以向脚本程序传递一个或多个参数,脚本出的$1,里面的数字是可以依次递增的,比如$1,$2,$3等等,其中的$0(比较特殊表示文件名称)

那么好 我们利用 vim 写入脚本3.sh,再利用sh 3.sh执行文件,我们看看执行结果:
执行的文件名是:3.sh


上面显示第一个参数为空,因为我们没有给它指定任何一个参数,我们给他指定一个参数name,sh 3.sh name

然后第一个参数就为name
那么假设我们加入第二个,第三个参数,修改脚本


vim 3.sh
指定参数名分别为 sh 3.sh 1 2 3

由此得出 参数传递一般为
$n (n表示数字 可递增)
$* 就是将参数当作统一的字符串显示出来,
$@ 是将每个字符串当作独立的字符串显示,这也是$*和$@的区别
$# 代表参数的个数
$? 是查看命令执行状态的,如果显示为0,那么命令就是正常执行的,其他数字就是出错了
$$ 就是查看脚本当前进程id的

四、shell编程中进行数学运算

1.数学运算

shell编程在数学运算的时候是相当麻烦的,python中的数学运算可能很简单

在shell编程中 利用expr进行运算
expr 7+18 回显 7+18 那么该怎么运算呢 expr 7 + 18 这样写就行了 7(空格)+(空格)18


以上方法适用于加法减法


如果用乘法就会报错
expr 20 \* 10 (乘法是用\* python直接*就行了 要用\进行转义)


那么如果是除法就有两种方法 一种是 /取整数,%取余数
expr 20 / 10
expr 20 % 10

2.混合运算

expr 5 + 10 \* 7 (shell会按照先乘除后加减运算)


expr ( 5 + 10 \) \* 7


如果有括号这样直接运算就会报错,括号也要进行转义
expr \* 2

3.运算与变量结合

num=`expr 5 + 6`
echo $num

http://www.lryc.cn/news/516995.html

相关文章:

  • 电子价签会是零售界的下一个主流?【新立电子】
  • 5 分布式ID
  • SpringBoot | @Autowired 和 @Resource 的区别及原理分析
  • 『SQLite』解释执行(Explain)
  • 0基础学前端-----CSS DAY12
  • (概率论)无偏估计
  • Minio-Linux-安装
  • 利用Java爬取1688商品详情API接口:技术与应用指南
  • 基于MATLAB的汽车热管理模型构建
  • LRU(1)
  • VSCode 使用鼠标滚轮控制字体
  • 数据库(3)--针对列的CRUD操作
  • 【Linux】记录一下考RHCE的学习过程(七)
  • 【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机
  • 使用hardhat进行合约测试
  • 基于生成式对抗网络(GAN)的前沿研究与应用
  • Apache zookeeper集群搭建
  • cmake使用记录
  • nginx http反向代理
  • 实数的奥秘:柯西序列深度解析
  • 信息系统管理师试题-人力资源
  • 补偿电阻对ota零极点的影响
  • UVM: uvm_sequence
  • 编译技术实验三之编译器的构造和设计
  • 数据挖掘——数据预处理
  • ECharts饼图下钻
  • 【RK3568笔记】Android修改开机动画
  • 嵌入式技术之Linux(Ubuntu) 一
  • 代码随想录day39 动态规划7
  • ESP32-S3模组上实现低功耗(5)