写这篇文章的原因有二,一是因为接触CTF的二进制类型题目后,经常会听到个词叫“getshell”,意为“获取shell”;二是前一段时间,在区块链的课程实验中,用go语言实现raft算法(解决分布式一致性问题的一个算法),在运行测试脚本的时候,我照常用命令“sh ./run.sh”来运行脚本,结果是报错,搞得我一头雾水,于是我决定好好学习一下这个Linux中的shell脚本。
什么是shell
shell是一个复杂的交互式程序,基本上用户一登录进终端,它就在运行了。它为用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的途径,它允许你输入文本命令,然后解释命令,并在内核中执行。
在图形化桌面出现之前,与Unix系统进行交互的唯一方式就是借助由shell提供的文本命令行界面(command line interface,CLI)。CLI只能接受文本输入,也只能显示出文本和基本的图形输出。现在都是通过图形化的终端(Terminal)访问CLI。下图是deepin的终端,还是比较美观的。
Linux上可用的shell其实有好几种,不同shell有不同的特性。执行“cat /etc/shells”可查看系统支持的shell,Linux中其它常见shell还有ash、korn、tcsh和zsh等。下图所列全都是shell程序的绝对路径。大多数发行版Linux系统默认的shell是bash shell:
shell脚本
将多个shell命令放入文件中作为程序执行,这些文件被称作shell脚本。通常shell脚本的第一行内容是“#!/bin/bash"或者"#!/bin/sh"或者其它,意思就是指定运行该脚本的shell程序。
getshell
这下终于明白些了,getshell其实就是运行系统的shell程序,从而可以执行程序或访问文件。
"./xxx.sh"与"sh xxx.sh"的区别
用"sh xxx.sh"其实就相当于用"/bin/sh"程序执行shell脚本,由于与bash shell语法的差异,理所当然就会报错。使用"./xxx.sh"来执行脚本,其实就是在用脚本文件中第一行指定的shell来执行脚本,也就可以顺利执行了。