Cron任务执行Shell脚本生成空文件问题求助
crontab执行Shell扫描脚本生成空文件的解决方法
问题原因分析
你的脚本在命令行正常但crontab执行出空文件,主要踩了这几个坑:
- crontab环境PATH受限:默认PATH仅包含
/usr/bin:/bin,如果依赖命令不在这个路径里会直接执行失败;且非交互式环境下,shell的默认配置不会加载,可能导致命令调用异常。 - sudo需要交互验证:crontab是后台无交互环境,执行sudo时会触发密码请求,但无人输入,导致nmap根本没运行,后续过滤步骤自然没有内容,生成空文件。
- 重复扫描的冗余与不一致:脚本里调用了两次
network-scan,不仅浪费扫描资源,两次扫描的结果还可能不一致,导致IP和MAC文件不匹配。 - 工作目录不明确:crontab默认在用户主目录执行脚本,生成的临时文件位置可能和你预期不符,后续合并操作容易出错。
修正后的脚本
先解决sudo免密问题:用visudo编辑sudoers文件,添加一行(替换成你的用户名):
your_username ALL=(ALL) NOPASSWD: /usr/bin/nmap
然后修改脚本如下:
#!/bin/bash # 替换成你的脚本实际存放路径,确保所有文件生成在指定目录 SCRIPT_DIR="/home/your_username/scripts" # 如果切换目录失败直接退出,避免后续操作出错 cd "$SCRIPT_DIR" || exit 1 # 更可靠的本地IP获取方式,避免hostname -I在非交互式环境失效 IPADDRESS=$(ip addr show | grep inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 | head -n1) # 用绝对路径调用命令,彻底规避PATH问题 NMAP="/usr/bin/nmap" SUDO="/usr/bin/sudo" network-scan(){ # 更严谨的参数非空判断 if [ -n "$1" ]; then "$SUDO" "$NMAP" -sn "$1" else "$SUDO" "$NMAP" -sn 192.168.1.0-255 fi } # 只执行一次扫描,结果存临时文件,避免重复扫描的冗余和不一致 SCAN_TEMP=$(mktemp) network-scan > "$SCAN_TEMP" # 从临时文件提取IP地址,优化正则表达式匹配更准确 grep -i 'Nmap scan report' "$SCAN_TEMP" | \ sed -e 's/ /\n/g' -e 's/[()]//g' | \ grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v "$IPADDRESS" > ip_addresses # 提取MAC地址 grep -i 'MAC Address:' "$SCAN_TEMP" | \ awk '{print $3}' > mac_addresses # 合并IP和MAC到带时间戳的结果文件 paste ip_addresses mac_addresses | \ column -s $'\t' -t > "scan_$(date +%d-%m-%Y_%H:%M:%S)" # 清理临时文件 rm "$SCAN_TEMP" echo "扫描结果文件已创建在$SCRIPT_DIR目录下" exit 0
crontab配置注意事项
- 给脚本添加执行权限:
chmod +x /home/your_username/scripts/your_script.sh - 编辑crontab定时任务:
添加定时规则,比如每天凌晨2点执行:crontab -e0 2 * * * /bin/bash /home/your_username/scripts/your_script.sh - 排查执行错误:查看crontab日志,Debian/Ubuntu系统用:
CentOS/RHEL系统用:grep CRON /var/log/sysloggrep CRON /var/log/messages
内容的提问来源于stack exchange,提问作者Darryl Akre-Tchakre
相关产品推荐
相关产品推荐

