Shell 脚本速成
2019-12-03 18:33:25 Author: mp.weixin.qq.com(查看原文) 阅读量:78 收藏

这段时间快速把 Micropoor 的内网课程看完了一遍,里面出现了很多 Shell 脚本。

Shell 脚本有什么好处?

  1. 无需安装其他软件

  2. 适合任务自动化,擅长系统管理任务

通过 Shell 编程,大大提高渗透效率。

功能:启动 msfconsole

  1. vim start_msf.sh

  2. chmod +x start_msf.sh

  3. # 运行

  4. ./start_msf.sh

start_msf.sh 的具体内容:

  1. #!/bin/sh

  2. msfconsole

功能:输出一个变量名

  1. touch test.sh

  2. chmod +x test.sh

  3. # 运行

  4. ./test.sh

test.sh 的具体内容:

  1. #!/bin/sh

  2. name='变量名'

  3. echo $name

注意:=前后不能有空格,否则就会出现 ./test.sh: 2: name: not found这个错误,也就是说变量定义会失败。

有时候变量名可能会和其它文字混淆,如下代码:

  1. #!/bin/sh

  2. num=2

  3. echo "this is the $numnd"

上述脚本并不会输出 this is the 2nd,只会打印 this is the;这是由于 shell 会去搜索变量 numnd 的值,而实际上这个变量此时并没有值。

修改方法:用花括号圈定变量名:

  1. #!/bin/sh

  2. # 这是一个注释

  3. num=2

  4. echo "this is the ${num}nd"

注意 shell 脚本的注释是 #

for var in ….; do …. done

  1. #!/bin/sh

  2. for var in A B C; do

  3. echo "var is $var"

  4. done

注:sh 不支持 C 语言风格的 for 循环写法,所以下面的脚本一定要把 shell 指定为 bash。参考:shell脚本:Syntax error: Bad for loop variable错误解决方法

  1. #!/bin/bash

  2. for ((var=0;var<=3;var++)); do

  3. echo "var is $var"

  4. done

上面的脚本更 shellish 的写法是:

  1. #!/bin/bash

  2. for var in `seq 3`; do

  3. echo "var is $var"

  4. done

注意通过上面通过两个「`」引入了命令,直接使用命令执行的结果。

0x04 while 循环

语法:

  1. while condition

  2. do

  3. command

  4. done

测试命令

可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

通常用[]来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

  • [ -f "somefile" ]:判断是否是一个文件

  • [ -x "/bin/ls" ]:判断/bin/ls是否存在并有可执行权限

  • [ -n "$var" ]:判断$var变量是否有值

  • [ "$a" = "$b" ]:判断$a$b是否相等

示例代码:

  1. #!/bin/bash

  2. COUNTER=0

  3. while [ $COUNTER -lt 5 ]

  4. do

  5. COUNTER=$((COUNTER + 1))

  6. echo $COUNTER

  7. done

注意:

  1. [ 后和 ] 前要空格。参考:“[0: command not found” in Bash [duplicate]

  2. lt 即为 less than,小于。

语法:

  1. if ....; then

  2. ....

  3. elif ....; then

  4. ....

  5. else

  6. ....

  7. fi

$SHELL 变量:

注意:上面的 SHELL 必须大写。变量 $SHELL 包含了登录 shell 的名称。

  1. #!/bin/sh

  2. if [ "$SHELL" = "/bin/bash" ]; then

  3. echo "bash"

  4. else

  5. echo "your login shell is $SHELL"

  6. fi

注:再次注意 [] 前后的空格问题。不然结果可能出错。

函数的主要使用场景是代码复用。函数定义部分应该写在一个 Shell 脚本的开头。

  1. # 定义

  2. functionName()

  3. {

  4. body

  5. }

  6. # 调用

  7. functionName

无返回值函数:

  1. #!/bin/bash

  2. firstFunction(){

  3. echo "1 try!"

  4. }

  5. firstFunction

有返回值函数:

注:read var 命令:提示用户输入,并将输入内容赋值给变量 var

  1. #!/bin/bash

  2. funWithReturn(){

  3. echo "这个函数会对输入的两个数字进行相加运算..."

  4. echo "输入第一个数字: "

  5. read aNum

  6. echo "输入第二个数字: "

  7. read anotherNum

  8. echo "两个数字分别为 $aNum 和 $anotherNum !"

  9. return $(($aNum+$anotherNum))

  10. }

  11. funWithReturn

  12. echo "输入的两个数字之和为 $? !"

函数返回值在调用该函数后通过 $? 来获得。注意:$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数传参

在 Shell 脚本中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数……当 n >=10 时,需要使用 ${n} 来获取参数。

带参数的函数示例:

  1. #!/bin/bash

  2. # author:Snowming

  3. funWithParam(){

  4. echo "第一个参数为 $1 !"

  5. echo "第二个参数为 $2 !"

  6. echo "第十个参数为 $10 !"

  7. echo "第十个参数为 ${10} !"

  8. echo "第十一个参数为 ${11} !"

  9. echo "参数总数有 $# 个!"

  10. echo "作为一个字符串输出所有参数 $* !"

  11. }

  12. funWithParam 1 2 3 4 5 6 7 8 9 34 73

注意,$10 不能获取第十个参数,获取第十个参数需要 ${10}。当 n >=10 时,需要使用 ${n} 来获取参数。

另外,还有几个特殊字符用来处理参数:

先学这么多,就基本具备了写简单的 Shell 脚本的能力以及读懂别人的 shell 脚本的能力。

其实 Shell 脚本并不难,无非是多条 Linux 命令合到一起,加了一些控制语句、条件控制、变量等。

Shell 脚本语法坑多,以后想必会遇到不少问题。剩下的语法,也在实践中慢慢补充。

本文来自作者Snowming,文章仅供学习研究网络安全,不可用于非法用途,因为该文章而触犯中华人民共和国法律的,一切后果自己负责,作者和平台不承担任何责任。


文章来源: http://mp.weixin.qq.com/s?__biz=MzUyNTk1NDQ3Ng==&amp;mid=2247484800&amp;idx=3&amp;sn=d5a9a28b901b79c368a49e4a280fa9cb&amp;chksm=fa177943cd60f05574bdc512080be48813a218313229ca492a7ea0bd31b855440f48a0dbf7d0#rd
如有侵权请联系:admin#unsafe.sh