定义ports变量时遇Permission Denied错误,但Bash脚本其余部分运行正常求助
问题分析与解决
核心错误原因
你遇到的Permission Denied是因为变量赋值语法错误。在Bash中,直接用变量=命令 参数的写法不会捕获命令输出,反而会被Shell错误解析:
- 脚本会将
ports变量赋值为字符串cat - 随后尝试执行
tempStager/ports.txt这个文件,但该文件没有可执行权限,因此触发权限错误 - 后续的管道和awk命令也完全不按预期工作
同样,ip=echo $* | awk 'NF{ print $NF }'也存在相同的语法问题。
修正后的脚本
#!/bin/bash # 创建临时目录存储初始扫描结果 mkdir tempStager # 执行指定参数的Nmap扫描并保存结果 echo beginning nmap scan nmap "$@" > tempStager/scan.txt echo basic nmap scan complete # 提取开放端口 cat tempStager/scan.txt | grep tcp | cut -d " " -f 1 | tr -d "/tcp" > tempStager/ports.txt sleep 2 # 用命令替换捕获awk输出,生成逗号分隔的端口列表 ports=$(awk '{printf "%s,",$0}' tempStager/ports.txt) # 移除最后一个多余的逗号,避免Nmap参数报错 ports=${ports%,} # 修正IP提取的命令替换语法 ip=$(echo "$@" | awk 'NF{ print $NF }') # 执行带-A参数的深度扫描 echo "" echo starting nmap scan with -A nmap -A -p"$ports" "$ip" # 清理临时目录 rm -r tempStager
额外优化建议
- 使用
"$@"替代$*:能正确处理包含空格或特殊字符的参数,避免参数拆分错误 - 变量引用加双引号:
"$ports"、"$ip"可以防止Shell对变量内容进行意外拆分 - 用
mktemp创建临时目录:更安全可靠,避免目录已存在的冲突,示例:# 替换原mkdir行 tempStager=$(mktemp -d) # 清理时用 rm -r "$tempStager"
内容的提问来源于stack exchange,提问作者cocomo
相关产品推荐
相关产品推荐

