You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:10:17