Skip to content

Commit

Permalink
update 2022年01月 3日 15:31:52
Browse files Browse the repository at this point in the history
  • Loading branch information
No-Github committed Jan 3, 2022
1 parent 267adbb commit 27236f1
Show file tree
Hide file tree
Showing 27 changed files with 844 additions and 157 deletions.
4 changes: 2 additions & 2 deletions 1earn/Develop/正则/regex.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
- https://tool.oschina.net/regex

- **正则分析**
- https://regex101.com/
- https://regexr.com/
- https://regexper.com/
- https://ihateregex.io/
- https://www.sojson.com/regex/generate
- https://regex101.com/
- https://regexr.com/
- https://jex.im/regulex/#!flags=

**表达式资源**
Expand Down
1 change: 1 addition & 0 deletions 1earn/Integrated/Linux/Power-Linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -4487,6 +4487,7 @@ tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/Applications/Go
export GOBIN=$GOROOT/bin
source $HOME/.profile
source ~/.bash_profile
# $GOPATH 可以包含多个工作目录,取决于你的个人情况.如果你设置了多个工作目录,那么当你在之后使用 go get (远程包安装命令) 时远程包将会被安装在第一个目录下.
Expand Down
7 changes: 7 additions & 0 deletions 1earn/Integrated/Linux/Secure-Linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,13 @@ cp /root/bin/ls /bin/ # 把 ls 命令复制到 /bin/ 目录,修复文件丢失
**系统日志**
- 内容见 [日志](./笔记/日志.md)

对于日志文件的保护
```bash
chattr +a xxx
chattr +a -R xxx # 递归式增加a权限
# a选项为append (追加) only ,即给日志文件加上a权限后,将只可以追加,不可以删除和修改之前的内容。
```

**web日志**
- 内容见 [取证](../../Security/BlueTeam/取证.md#中间件服务器程序日志) 中间件服务器程序日志部分

Expand Down
110 changes: 108 additions & 2 deletions 1earn/Integrated/Linux/Speed-Linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ bash xxx.sh # 运行 xxx.sh 脚本
```bash
set
env
printenv

cat /proc/1/environ
cat /proc/$PID/environ
Expand Down Expand Up @@ -209,6 +210,76 @@ set PATH (你想要加入的路径) $PATH
souce ~/.config/fish/config.fish
```

**特殊变量**

bash 存在一些特殊变量,这些变量的值由shell提供,用户不能进行赋值。
```bash
$? # 为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是0,表示上一个命令执行成功;如果是非零,上一个命令执行失败。
$$ # 为当前shell的进程ID。
$_ # 为上一个命令的最后一个参数。
$! # 为最后一个后台执行的异步命令的进程ID。
$0 # 为当前shell的名称(在命令行直接执行时)或者脚本名(在脚本中执行时)。
$- # 为当前shell的启动参数。
$@$# # $#表示脚本的参数数量,$@表示脚本的参数值。
```

**变量的默认值**

bash提供四个特殊语法,跟变量的默认值有关,目的是保证变量不为空。
```
{varname:-wore}
如果变量varname存在且不为空,则返回它的值,否则返回word。它的目的是返回一个默认值,比如${count:-0}表示变量count不存在时返回0。
```
```
{varname:=word}
如果变量varname存在且不为空,则返回它的值,否则将它设为word,并且返回word。它的目的是设置变量的默认值,比如${count:=0}表示变量count不存在时返回0,且将count设为0。
```
```
{varname:?message}
如果变量varname存在且不为空,则返回它的值,否则打印出varname: message,并中断脚本的执行。如果省略了message,则输出默认的信息“parameter null or not set.”。它的目的是防止变量未定义,比如${count:?"undefined!"}
表示变量count未定义时就中断执行,抛出错误,返回给定的报错信息undefined!。
```
```
{carnage:+word}
如果变量名存在且不为空,则返回word,否则返回空值。它的目的是测试变量是否存在,比如${count:+1}表示变量count存在时返回1(表示true),否则返回空值。
```

例如
```bash
filename=${1:?"filename missing."}

# 1 表示脚本的第一个参数。如果该参数不存在,就退出脚本并报错。
```

**declare**

declare 命令可以声明一些特殊类型的变量,为变量设置一些限制,比如声明只读类型的变量和整数类型的变量。

declare 命令如果用在函数中,声明的变量只在函数内部有效,等同于 local 命令。不带任何参数时,declare 命令输出当前环境的所有变量,包括函数在内,等同于不带有任何参数的 set 命令。

```
declare -i aaaaaa=1 bbbbbb=2
declare -i result
result=aaaaaa+bbbbbb
echo $result
```

**readonly**

readonly 命令等同于 declare -r,用来声明只读变量,不能改变变量值,也不能 unset 变量。

```bash
-f # 声明的变量为函数名。
-p # 打印出所有的只读变量。
-a # 声明的变量为数组
```

```bash
readonly foo=1
foo=2
echo $?
```

---

## 符号
Expand Down Expand Up @@ -472,6 +543,7 @@ cd # 切换工作目录
```bash
ls # 查看目录下文件
ls -a # 查看目录隐藏文件
ls -lah # 查看的内容更新详细

pwd # 以绝对路径的方式显示用户当前工作目录
pwd -P # 目录链接时,显示实际路径而非 link 路径
Expand Down Expand Up @@ -769,6 +841,35 @@ Ctrl-K Q # 退出
Ctrl-K H # 查看帮助
```

**split**

`对文件进行分割`

```bash
# 按文件大小切割
split -b 2M test # 把 test 文件分割成若干个小文件,每个文件大小为 2M

# 按文件行数切割
split -l 100 test out_ # 把 numfile 文件切割成若干文件,每个文件 100 行, 并且新生成的文件名字前缀为 "out_"

# 按文件数量切割
split -d -n 5 test # 是把 test 文件切割成 5 个小文件
```

**fallocate**

```bash
fallocate -l 10G allocatefile # 创建一个 10G 大小的文件
```

**truncate**

`缩小或者扩展文件至指定大小`

```bash
truncate -s 1G testfile
```

### 比较

- diff
Expand Down Expand Up @@ -884,6 +985,11 @@ ln file1 file2
tar -jcvf FileName.tar.bz DirName # 压缩
```

- .tar.bz2
```bash
tar -jxvf test.tar.bz2 # 解压
```

- .gz
```bash
gunzip FileName.gz # 解压1
Expand Down Expand Up @@ -1046,8 +1152,8 @@ fuser -v 22/tcp # 查询进程使用的文件和网络套接字

**路由表**
```bash
route # 查看路由表
ip route # 显示核心路由表
route # 显示/操作IP路由表
ip route # 显示/操纵路由,设备,策略路由和隧道
ip neigh # 显示邻居表
```

Expand Down
3 changes: 3 additions & 0 deletions 1earn/Integrated/Linux/实验/ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

---

## 配置文件

sshd 配置文件是 : /etc/ssh/sshd_config

```bash
Expand Down Expand Up @@ -99,3 +101,4 @@ UsePAM yes # 是否使用 PAM 模块认证
## Source & Reference

- https://blog.51cto.com/xujpxm/1717862
- https://www.agwa.name/blog/post/ssh_signatures
88 changes: 88 additions & 0 deletions 1earn/Integrated/Linux/笔记/shell编程.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
- [10分钟学会Bash调试](https://mp.weixin.qq.com/s/MQjqu55BN6LqSsIAvevRQA)
- [如何并发执行Linux命令](https://mp.weixin.qq.com/s/L3u2e-GKl_yL3saJMMFazA)
- [终于知道 Shell 中单引号双引号的区别了](https://mp.weixin.qq.com/s/tyHIlRsg1rYjw-E_h-C2rA)
- [Bash编程基础知识](https://mp.weixin.qq.com/s/tSWnoO3IAET3C7iYY7ns6Q)

---

Expand Down Expand Up @@ -1015,6 +1016,8 @@ fi
至少有一个文件存在!
```

---

## 流程控制

和 Java、PHP 等语言不一样,sh 的流程控制不可为空,如(以下为 PHP 流程控制写法):
Expand Down Expand Up @@ -1511,6 +1514,8 @@ funWithParam 1 2 3 4 5 6 7 8 9 34 73
- `$-` 显示 Shell 使用的当前选项,与 set 命令功能相同。
- `$?` 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误。
---
## 输入输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到你的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
Expand Down Expand Up @@ -1718,9 +1723,92 @@ vim test.sh
bash -xv test.sh
```
**trap**
trap命令用来在 Bash 脚本中响应系统信号。
最常见的系统信号就是 SIGINT(中断),即按 Ctrl + C 所产生的信号。trap命令的-l参数,可以列出所有的系统信号。
```
trap -l
```
“动作”是一个 Bash 命令,“信号”常用的有以下几个:
```
HUP:编号1,脚本与所在的终端脱离联系。
INT:编号2,用户按下 Ctrl + C,意图让脚本终止运行。
QUIT:编号3,用户按下 Ctrl + 斜杠,意图退出脚本。
KILL:编号9,该信号用于杀死进程。
TERM:编号15,这是kill命令发出的默认信号。
EXIT:编号0,这不是系统信号,而是 Bash 脚本特有的信号,不管什么情况,只要退出脚本就会产生。
```
trap命令响应EXIT信号的写法如下
```bash
trap 'rm -f "$TMPFILE"' EXIT
# 脚本遇到EXIT信号时,就会执行rm -f "$TMPFILE"
```
trap 命令的常见使用场景,就是在 Bash 脚本中指定退出时执行的清理命令。
```bash
trap 'rm -f "$TMPFILE"' EXIT
TMPFILE=$(mktemp) || exit 1
ls /etc > $TMPFILE
if grep -qi "kernel" $TMPFILE; then
echo 'find'
fi
# 不管是脚本正常执行结束,还是用户按 Ctrl + C 终止,都会产生EXIT信号,从而触发删除临时文件。
```
注意,trap 命令必须放在脚本的开头。否则,它上方的任何命令导致脚本退出,都不会被它捕获。
如果 trap 需要触发多条命令,可以封装一个 Bash 函数。
```bash
function egress {
command1
command2
command3
}
trap egress EXIT
```
---
## 错误处理
如果脚本里面有运行失败的命令(返回值非0),bash默认会继续执行后面的命令。
实际开发中,如果某个命令失败,往往需要脚本停止执行,防止错误累积。
```bash
command || exit 1
# 只要command有非零返回值,脚本就会停止执行。
```
如果停止执行之前需要完成多个操作,就要采用以下写法:
```bash
# 写法一
command || { echo "command failed"; exit 1; }
# 写法二
if ! command; then echo "command failed"; exit 1; fi
# 写法三
command
if [ "$?" -ne 0 ]; then echo "command failed"; exit 1; fi
```
另外,除了停止执行,还有一种情况。如果两个命令有继承关系,只有第一个命令成功了,才能继续执行第二个命令,那么就要采用下面的写法。
```bash
command1 && command2
```
---
## Source & Reference
- [Shell脚本编程30分钟入门](https://github.com/qinjx/30min_guides/blob/master/shell.md)
- [Shell 教程](https://www.runoob.com/linux/linux-shell.html)
- [Bash编程基础知识](https://mp.weixin.qq.com/s/tSWnoO3IAET3C7iYY7ns6Q)
Loading

0 comments on commit 27236f1

Please sign in to comment.