0x00 前言

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

Shell 脚本有什么好处?

  1. 无需安装其他软件

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

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

0x01 第一个 shell 脚本

功能:启动 msfconsole

vim start_msf.sh

chmod +x start_msf.sh

# 运行

./start_msf.sh

start_msf.sh 的具体内容:

#!/bin/sh

msfconsole

0x02 引入变量

功能:输出一个变量名

touch test.sh

chmod +x test.sh

# 运行

./test.sh

test.sh 的具体内容:

#!/bin/sh

name='变量名'

echo $name

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

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

#!/bin/sh

num=2

echo "this is the $numnd"

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

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

#!/bin/sh

# 这是一个注释

num=2

echo "this is the ${num}nd"

注意 shell 脚本的注释是 #

0x03 for 循环

for var in ….; do …. done

#!/bin/sh

for var in A B C; do

echo "var is $var"

done

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

#!/bin/bash

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

echo "var is $var"

done

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

#!/bin/bash

for var in `seq 3`; do

echo "var is $var"

done

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

0x04 while 循环

语法:

while condition

do

command

done

测试命令

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

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

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

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

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

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

示例代码:

#!/bin/bash

COUNTER=0

while [ $COUNTER -lt 5 ]

do

COUNTER=$((COUNTER + 1))

echo $COUNTER

done

注意:

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

  2. lt 即为 less than,小于。

0x05 if 语句

语法:

if ....; then

....

elif ....; then

....

else

....

fi

$SHELL 变量:

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

#!/bin/sh

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

echo "bash"

else

echo "your login shell is $SHELL"

fi

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

0x06 函数

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

# 定义

functionName()

{

body

}

# 调用

functionName

无返回值函数:

#!/bin/bash

firstFunction(){

echo "1 try!"

}

firstFunction

有返回值函数:

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

#!/bin/bash

funWithReturn(){

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

echo "输入第一个数字: "

read aNum

echo "输入第二个数字: "

read anotherNum

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

return $(($aNum+$anotherNum))

}

funWithReturn

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

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

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

函数传参

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

带参数的函数示例:

#!/bin/bash

# author:Snowming

funWithParam(){

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

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

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

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

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

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

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

}

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

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

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

0x07 后记

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

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

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

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

shell两个时间字符串插值_Shell 脚本速成相关推荐

  1. java 时间字符串比较大小_java中如何比较两个时间字符串的大小

    思路: 先都转换成日期.然后再用毫秒数进行比较. 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDat ...

  2. shell 脚本比较字符串相等_shell脚本--逻辑判断与字符串比较

    涉及到比较和判断的时候,要注意 整数比较使用-lt,-gt,ge等比较运算符,详情参考:整数比较 文件测试使用 -d, -f, -x等运算发,详情参考:文件测试 逻辑判断使用    && ...

  3. shell学习之-sed用法解析_Shell脚本之sed的使用

    1.sed命令:主要作用是查找:新增 删除 和修改替换. user.txt daokr#cat user.txt ID Name Sex Age zhang M 19 wang G 20 cheng ...

  4. 比较两个时间字符串的大小

    现在有两个字符串,是从表单读取来的日期性,"2003-10-12"与"2003-10-21", 现在如何判断他们的大小. 如果不想再转为date类型比较 有一种 ...

  5. shell不允许输入空字符_shell脚本编程之控制脚本

    点蓝色字关注"CurryCoder的程序人生" 微信公众号:CurryCoder的程序人生 欢迎关注我,一起学习,一起进步! 1.引言 目前为止,运行脚本的唯一方式是以实时模式在命 ...

  6. 用shell将时间字符串与时间戳互转

    http://www.codelast.com/?p=775 在shell中,字符串转换为时间戳可以这样做: 1 date -d "2010-10-18 00:00:00" +%s ...

  7. shell sleep毫秒_Shell脚本之date、sleep、usleep命令

    1.1 date命令 date用于获取和设置操作系统的时间,还有hwclock是获取硬件时间. date有个选项"-d",可以用来描述获取什么时候的时间,描述的方式非常开放,但不能 ...

  8. shell编程范例之字符串操作[转]

    shell编程范例之字符串操作 下面是"在线新华字典"的解释: 字符串: 简称"串".有限字符的序列.数据元素为字符的线性表,是一种数据的逻辑结构.在计算机中可 ...

  9. Linux 命令行与shell编程 第10章 构建基本脚本

    本章内容 构建基本脚本 使用多个命令 创建shell脚本文件 现在我们已经介绍了Linux系统和命令行的基础知识,可以开始编程了.本章讨论编写shell脚本的基础知识.在开始编写自己的shell脚本大 ...

最新文章

  1. 使用selenium设置firefox不加载图片增加加载速度提高爬虫效率
  2. 在vs2012中用C#开发Android应用Xamarin环境搭建
  3. Sentinel 连接数据源
  4. C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP),多多宜善
  5. 20200225:最小路径和(leetcode64)
  6. 网络安全:教你五招服务器安全维护技巧
  7. php去掉文字空白换行,php去掉空格换行的方法
  8. java反射机制原理详解
  9. Android零基础入门第18节:EditText的属性和使用方法
  10. dwg格式转换pdf
  11. 软考软件设计师中级考试知识点(一)
  12. 编写MTK6737平台的GPIO驱动例程(一)
  13. mongodb时间差8小时,原因及解决方案
  14. 关于手册的页码和有效页清单 - LEP
  15. 基于android的校友帮平台系统
  16. win10升级win11操作
  17. 手机移动端首页广告栏滚动图片
  18. 鹰眸安全帽识别系统对施工现场管理水平的提升
  19. 迈入发展期的信创,更需夯实基础
  20. 青龙面板+Ninja的企业微信通知设置以及企业微信群消息转到微信方法

热门文章

  1. two sum python_Python | Leetcode 之 Two Sum
  2. 孙悟空!登上 Nature !
  3. 走心!北京语言大学教授毕业致辞:在人生的道路上,一定要把自己当回事儿...
  4. 喝酒划拳中的数学(附:摇号)
  5. 深度学习-自动并行计算
  6. Unity大密度建筑场景加载解决方案
  7. window 远程linux
  8. 基于SLS构建RDS审计合规监控
  9. Tair持久存储系列技术解读
  10. 10+知识图谱开放下载,让你的学习效率提升5倍! | “右脑”开发套餐