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
一切看起来都很好(对吧?),但它不起作用。对于调试,我将对条件的反应更改为 True
和 False
:
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 作为变量名)
为了解决特定问题,我正在尝试使用 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
一切看起来都很好(对吧?),但它不起作用。对于调试,我将对条件的反应更改为 True
和 False
:
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 作为变量名)