shell学习-转自http://c.biancheng.net/cpp/shell/

本文详细介绍了Shell脚本的基础知识,包括变量定义、算术运算、文件判断、流程控制、函数与特殊变量等内容,并通过示例展示了如何在实际场景中应用这些概念。
1、Hello world

#!/bin/bash

echo "Hello World!"

**需要chmod +x  test01.sh //添加执行权限
运行时需要“./test01.sh”,才能执行。
2、读取输入

#!/bin/bash

# Author : net

echo "What is your name?"

read PERSON

echo "Hello, $PERSON"

//脚本使用 read 命令从 stdin 获取输入并赋值给 PERSON 变量,最后输出

3、变量定义

#!/bin/bash

your_name="mozhiyan"

#变量输出可以不加括号

echo $your_name

#已定义变量可以再次赋值

your_name="nashisha"

#readonly your_name 将变量置为只读

#也可以加,最好加上

echo ${your_name}

#循环

for skill in Ada Coffe Action Java Shell

do

    echo "I am good at ${skill}Script"

done

特殊变量列表
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


4、算术运算

#!/bin/bash #算术运算 a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi

注意:expr两边的符号只能是这样,if里边的括号,必须有空格,教训!!
5、关系运算

#!/bin/sh a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a is equal to b" else echo "$a = $b : a is not equal to b" fi if [ $a != $b ] then echo "$a != b : a is not equal to b" else echo "$a != $b : a is equal to b" fi if [ -z $a ] then echo "-z $a : string length is zero" else echo "-z $a : string length is not zero" fi if [ -n $a ] then echo "-n $a : string length is not zero" else echo "-n $a : string length is zero" fi if [ $a ] then echo "$a : string is not empty" else echo "$a : string is empty" fi


字符串运算符列表
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -z $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

布尔运算符列表
运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
关系运算符列表
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

6、文件判断
文件测试运算符列表
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

7、流程语句
if-else语句

if [ $a == $b ] then echo "a is equal to b" elif [ $a -gt $b ] then echo "a is greater than b" elif [ $a -lt $b ] then echo "a is less than b" else echo "None of the condition met" fi

if-else经常与test一起使用,与[]类似

num1=$[2*3]

num2=$[1+5] if test $[num1] -eq $[num2] then echo 'The two numbers are equal!' else echo 'The two numbers are not equal!' fi

while语句

while command do Statement(s) to be executed if command is true done

util语句,判断与while相反

until command do Statement(s) to be executed until command is true done


for语句

for 变量 in 列表 do command1 command2 ... commandN done

case语句

case 值 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command1 command2 command3 ;; esac

流程控制:break  continue

8、函数

#!/bin/bash # Define your function here Hello () { echo "Url is http://see.xidian.edu.cn/cpp/shell/" } # Invoke your function Hello

函数可以传参,类似与接收执行脚本接收参数。

带参数的函数示例: #!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the eleventh parameter is ${11} !" echo "The amount of the parameters is $# !" # 参数个数 echo "The string of the parameters is $* !" # 传递给函数的所有参数 } funWithParam 1 2 3 4 5 6 7 8 9 34 73




特殊变量说明:
$#传递给函数的参数个数。
$*显示所有传递给函数的参数。
$@与$*相同,但是略有区别,请查看 Shell特殊变量
$?函数的返回值。
$n获取指定参数,最好使用${n}

9、包含
Shell 中包含脚本可以使用:
. filename
source filename
两种方式的效果相同,简单起见,一般使用点号(.),但是注意点号(.)和文件名中间有一空格。
10、输出(入)重定向
???

(如有冒犯,请联系删除)
--来自 http://c.biancheng.net/cpp/shell/  感谢“C语言中文网”
我们可以编写一个 Python 脚本,完成以下任务: 1. **遍历所有提供的 URL**,请求每个网站并解析其 `<title>` 标签内容。 2. 找出标题为 `xgd` 的网站(或包含 `xgd`,根据实际情况判断)。 3. 对该目标网站进行**路径爆破**(目录扫描),使用你提供的常见路径列表。 4. 尝试访问发现的后台路径(如 `/admin/login`、`/login` 等),查看页面提示信息。 5. 根据返回内容中是否有登录表单或 flag 提示,提取专属 flag。 > 注意:题目说“按照系统提示信息登录系统获取属于你的专属flag”,说明可能无需真实账号,而是访问后页面直接显示 flag 或通过简单交互获得。 --- ### ✅ 完整 Python 实现如下: ```python import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import time # 目标 URL 列表 urls = [ "https://www.cnvd.org.cn", "https://www.cnblogs.com", "http://120.24.235.90:8000", "https://gchq.github.io", "https://forum.ywhack.com", "https://beian.miit.gov.cn", "http://178.234.43.253:9999", "http://196.39.56.86", "http://69.122.217.53:10001", "http://223.205.167.45:88", "http://5.23.99.34", "http://143.92.139.148", "http://176.110.126.165:81", "http://dnslog.cn", "https://www.iii.tsinghua.edu.cn", "https://www.nwpu.edu.cn", "https://www.php.cn", "https://c.biancheng.net", "http://117.72.16.110:8100", "http://153.35.192.98:8088", "http://8.148.238.196:8100", "https://dsqwx.aramark.cn", "http://194.65.116.40", "http://113.214.250.148:8080", "http://222.75.83.70:8086", "https://172.16.2.2:1443/" ] # 常见后台路径字典 common_paths = [ "/admin.php", "/admin/login", "/login", "/wp-admin", "/wplogin.php", "/manager", "/web.config", # 通常不是页面 "/backup", "/backups", "/logs", "/error_log", "/.git", "/.bak", "/.sql", "/.env" ] # 请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36" } # 忽略 HTTPS 验证错误(用于自签名证书,如 https://172.16.2.2:1443) requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) def get_title(url): try: # 设置超时和 SSL 验证忽略 response = requests.get(url, headers=headers, timeout=10, verify=False) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') title_tag = soup.find('title') title = title_tag.get_text(strip=True) if title_tag else "" print(f"[{url}] 标题: {title}") return title, response else: print(f"[{url}] 状态码: {response.status_code}") return "", None except Exception as e: print(f"[{url}] 请求失败: {e}") return "", None def scan_backend(base_url, session): print(f"[*] 正在对 {base_url} 进行路径爆破...") found_admin = None for path in common_paths: try: target_url = urljoin(base_url, path) response = session.get(target_url, timeout=5, verify=False) if response.status_code == 200: print(f"[+] 可能存在的后台路径: {target_url}") # 检查是否是登录页或含有 flag text = response.text.lower() if "login" in text or "username" in text or "password" in text: print(f"[*] 发现疑似登录页面: {target_url}") # 查找 flag4 if "flag4" in text: flag_line = [line for line in response.text.splitlines() if "flag4" in line.lower()] print(f"[!] 在登录页中发现 flag4: {''.join(flag_line)}") print("".join(flag_line).strip()) return True # 特殊处理:如果是压缩包或敏感文件,可尝试读取关键内容 if path.endswith(".env") and "flag" in text: print(f"[!] 在 .env 文件发现 flag4: {response.text[:300]}") print(response.text.strip()) return True found_admin = target_url # 记录第一个可用路径 except Exception as e: print(f"[!] 请求 {target_url} 失败: {e}") continue # 如果找到了后台但未直接发现 flag,则输出地址供进一步分析 if found_admin: print(f"[→] 推荐访问后台地址: {found_admin} 查看提示信息") return False # 继续其他逻辑或手动跟进 return False def main(): target_url = None session = requests.Session() session.headers.update(headers) session.verify = False # 支持不安全 HTTPS print("[*] 开始查找标题为 'xgd' 的网站...") for url in urls: title, response = get_title(url) if response and 'xgd' in title.lower(): print(f"[+] 找到目标网站!标题匹配 'xgd': {url} -> '{title}'") target_url = url break if not target_url: print("[-] 未找到标题包含 'xgd' 的网站。") return print(f"[*] 正在扫描目标后台路径: {target_url}") # 使用持久会话进行路径爆破 if scan_backend(target_url, session): return # 已输出 flag # 若未发现 flag,建议手动访问后台查看提示 print("[-] 后台已找到,但尚未发现 flag4,请检查页面提示或是否存在动态生成机制。") if __name__ == "__main__": main() ``` --- ### 📌 使用说明: #### ✅ 安装依赖: ```bash pip install requests beautifulsoup4 ``` #### 🔐 注意事项: - 脚本自动跳过 HTTPS 证书验证(适用于内网测试站点)。 - 若某个页面返回 `flag4:xxxxxx` 字样(即使隐藏在 HTML 注释中),可通过正则进一步提取: ```python import re flag_match = re.search(r'flag4:\s*[a-zA-Z0-9]+', response.text, re.I) if flag_match: print("flag4:" + flag_match.group().split(':')[-1]) ``` #### 💡 示例增强(自动提取 flag): 在 `scan_backend` 中添加: ```python import re flag_match = re.search(r'flag4\s*[::]\s*([a-zA-Z0-9]+)', response.text, re.I) if flag_match: print(f"flag4:{flag_match.group(1)}") return True ``` --- ### 🧩 补充思路: - 有些 CTF 题目会在响应头、JS 文件、注释中埋藏 flag。 - 若后台需要登录,尝试用户名 `admin` 密码留空,或查看源码是否有提示。 - 若发现 `/admin.php` 返回内容为 “Hello, your IP is allowed”,可能结合 IP 白名单判定用户身份并显示 flag。 --- ### ❓相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值