macOS ZSH脚本执行多命令报错:zsh: condition expected: sudo 求助
问题分析与解决方法
报错原因
- 条件语法错误:
[[ ]]是ZSH的条件测试结构,仅支持字符串比较、文件属性判断等表达式,不能直接在内部执行命令。你试图把sudo tcpdump...放进[[ ]]里,ZSH无法识别这是有效条件,因此抛出condition expected: sudo错误。 - 逻辑结构错误:你用
&&连接两个命令,但第一个tcpdump是持续运行的(不会自动退出),导致后面的if语句永远不会执行,完全不符合“持续检测+断连杀进程”的需求。 - if语句格式问题:原
if语句中then前缺少分号或换行,ZSH解析时会出现语法歧义。
正确实现思路
要实现“持续检测连接,断连则杀进程”,需要用循环周期性检查连接状态,而非依赖持续运行的tcpdump。推荐两种检查方式:
方式1:用tcpdump单次抓包检测(需sudo)
通过-c N参数让tcpdump抓取N个包后自动退出,再判断是否匹配到目标IP:
#!/usr/bin/env zsh # 配置参数 TARGET_IP="xx.xxx.xx.xx" PROCESS_NAME="nameoftheprocesstobekilled" CHECK_INTERVAL=10 # 检查间隔(秒) while true; do # 抓取3个包,重定向输出避免刷屏,判断是否匹配目标IP if! sudo tcpdump -n -k NP -c 3 "$TARGET_IP" >/dev/null 2>&1; then # 未检测到连接,强制终止进程 killall -9 "$PROCESS_NAME" # 若需要检测到断连后退出脚本,取消下面的注释 # break fi sleep "$CHECK_INTERVAL" done
方式2:用netstat检查已建立连接(无需sudo,更轻量)
直接检查系统中已建立的TCP连接,比tcpdump更高效:
#!/usr/bin/env zsh # 配置参数 TARGET_IP="xx.xxx.xx.xx" PROCESS_NAME="nameoftheprocesstobekilled" CHECK_INTERVAL=10 # 检查间隔(秒) while true; do # 检查是否存在与目标IP的ESTABLISHED状态连接 if! netstat -an | grep -q "ESTABLISHED.*$TARGET_IP"; then killall -9 "$PROCESS_NAME" # break fi sleep "$CHECK_INTERVAL" done
使用说明
- 将上述脚本保存为
check_and_kill.zsh,修改TARGET_IP和PROCESS_NAME为实际值。 - 赋予脚本执行权限:
chmod +x check_and_kill.zsh。 - 运行脚本:
./check_and_kill.zsh(若用tcpdump方式,需确保用户已在sudoers中无需密码执行tcpdump)。
内容的提问来源于stack exchange,提问作者viper_88
相关产品推荐
相关产品推荐

