bash 用于在 macOS 上切换隐身模式的脚本

bash script for switch stealth mode on macos

为了解决特定问题,我正在尝试使用 bash

macos 上为 stealth mode 进行切换

部分代码如下:

STEALTH_STATUS=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode)
if [ "$STEALTH_STATUS" = "Stealth mode enabled" ]; then
    /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode off
else
    /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
fi

一切看起来都很好(对吧?),但它不起作用。对于调试,我将对条件的反应更改为 TrueFalse:

STEALTH_STATUS=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode)
if [ "$STEALTH_STATUS" = "Stealth mode enabled" ]; then
    echo "True"
else
    echo "False"
fi

(如果我们使用 $STEALTH_STATUS 而没有 ",我们会得到一个错误 line 2: [: too many arguments

并且在执行这段代码的时候,总是得到False,这说明执行函数设置$STEALTH_STATUS的结果不等于"Stealth mode enabled"

但是如果我们运行shell中的命令,我们可以确保模式现在是启用的

$ /usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode
> Stealth mode enabled 

再检查一次以确保

STEALTH_STATUS=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode)
STRING="Stealth mode enabled"

echo $STEALTH_STATUS
echo $STRING

if [ "$STEALTH_STATUS" = "$STRING" ]; then
    echo "True"
else
    echo "False"
fi

我们得到了...

> Stealth mode enabled
> Stealth mode enabled
> False

有人能解释一下我错在哪里吗?

来自 STEALTH_STATUS=$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode) 的响应包含尾随空格,因此您的 if 检查失败。您可以通过检查字符串的长度来查看它。修剪空白的一种机制是通过管道传输到 xargs。

这是您的脚本的修改版本:

#!/bin/bash

current_status="$(/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode | xargs)"
enabled="Stealth mode enabled"

echo "${current_status} length: ${#current_status}"
echo "${enabled} length: ${#enabled}"

if [ "$current_status" = "$enabled" ]; then
    echo "True"
else
    echo "False"
fi

输出:

$ ./script 
Stealth mode enabled length: 20
Stealth mode enabled length: 20
True

没有管道到 xargs 的输出:

$ ./script 
Stealth mode enabled  length: 21
Stealth mode enabled length: 20
False

(请注意,根据 bash 脚本最佳实践,您可能还想避免使用 all-caps 作为变量名)