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

macOS ZSH脚本执行多命令报错:zsh: condition expected: sudo 求助

问题分析与解决方法

报错原因

  1. 条件语法错误:[[ ]]是ZSH的条件测试结构,仅支持字符串比较、文件属性判断等表达式,不能直接在内部执行命令。你试图把sudo tcpdump...放进[[ ]]里,ZSH无法识别这是有效条件,因此抛出condition expected: sudo错误。
  2. 逻辑结构错误:你用&&连接两个命令,但第一个tcpdump是持续运行的(不会自动退出),导致后面的if语句永远不会执行,完全不符合“持续检测+断连杀进程”的需求。
  3. 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

使用说明

  1. 将上述脚本保存为check_and_kill.zsh,修改TARGET_IP和PROCESS_NAME为实际值。
  2. 赋予脚本执行权限:chmod +x check_and_kill.zsh。
  3. 运行脚本:./check_and_kill.zsh(若用tcpdump方式,需确保用户已在sudoers中无需密码执行tcpdump)。

内容的提问来源于stack exchange,提问作者viper_88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:33:38