我发现了这种重新连接WIFI适配器的方法这个帖子。但是,在尝试实施之前,我想先弄清楚它是如何工作的。
- 转到
/etc/ifplugd/action.d/
并将文件重命名ifupdown
为ifupdown.original
.- 然后做:
cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
。- 最后:
sudo reboot
- 什么时候
/etc/ifplugd/action.d/ifupdown
叫? /etc/wpa_supplicant/ifupdown.sh
用外行人的话来说,这个脚本本质上是做什么的,对我来说它看起来相当复杂;以及它什么时候被调用。- 执行步骤 1 至 3 是否会导致任何其他不可预见的问题,从而阻止我的 WIFI 工作?我正在尝试通过 SSH 在 Raspberry PI 上实现此功能,而无需将键盘和显示器放置在难以到达的位置。
我尝试用谷歌搜索各种信息,但有点迷失了!
答案1
ifplugd 旨在检测以太网连接器的移除或重新连接。关联的目录 /etc/ifplugd/action.d/ 托管在插入(或移除)连接器时调用的脚本。
过程中的步骤 2 会导致在插入(或移除)连接器时(重新)协商 wpa 连接,并且假定连接是 WPA。您描述的重命名/复制过程将禁用在预先存在的 ifupdown 脚本中完成的任何预先存在的处理,这可能可以忽略不计。您可能会考虑通过将 /etc/wpa_supplicant/ifupdown.sh 添加到现有的 ifupdown 脚本(例如,在最后)来简单地调用 /etc/wpa_supplicant/ifupdown.sh,但这取决于了解现有脚本中已有的内容(这通常很简单)。
如果您只想在 wifi 连接断开时重新协商,而不是处理连接器的物理断开连接,您可以考虑使用以下方法:
https://raw.githubusercontent.com/dweeber/WiFi_Check/master/WiFi_Check
该脚本很强大,基本上是无害的,并且应该能够可靠地完成任务。
答案2
简洁版本
dudek 已经回答了;该目录用于告诉您的系统如何处理插入或拔出的内容的脚本。
请参阅“长版本”以尝试解释我如何理解相关脚本。基本上,在运行一些检查并加载一些外部函数之后,它会检查是否应该运行
start
命令序列,或者stop
,或者错误并退出。哦,是的,如果你以树莓派不太喜欢的方式接触网络配置,它很可能会阻止你进行远程访问。过去我在 RPi 上粗略地修改过网络配置,因此从全新安装开始会更简单。请谨慎考虑,将树莓派暂时移至本地易于登录的位置。
长版
在我的 RPi 上查看这个文件,它似乎有很好的注释,并且它不用于许多外部函数调用。但是您要求的是外行术语,所以我会尽力解释我如何开始理解这些类型的脚本,因为看起来您是像我一样的 RPi 用户(无头远程服务器设置)是的可能想检查一下我已经写在上面的内容RPi StackExchange用于自动重新连接到隐藏的 WiFi 网络,因为它可能还有其他对您的服务器要求有用的技巧。
为了帮助回答您的问题,这里有一些 shell 脚本语法解释;
在 shell~.sh
脚本中是常见的找到像这样定义的函数;
function_name () {
echo "doing stuff for function_name"
}
然后function_name
在脚本中通过后者调用,有时在其他函数中调用。函数、脚本文件和 if 语句只是要运行的命令列表。在函数的情况下,运行{
和之间的内容}
;在语句的情况下,运行和if
之间的内容;在实例中,在语句内有条件地使用或。then
fi
else
elif
if
对于我们正在剖析的文件,有一些名为 的函数do_start
,do_stop
以及其他文件中定义的一些函数...“这些其他函数定义在哪些文件中?”或“如何确定脚本 a 是否从文件 b 加载函数?”这是我们必须首先回答的两个问题。
48
在该行周围/etc/wpa_supplicant/ifdown.sh
有一个注释行(即以#
simble 开头的行;这些被脚本入侵者忽略......大多数情况下),并source functions
巧妙地标记了接下来几行的预期效果〜
# source functions
if [ -f /etc/wpa_supplicant/functions.sh ]; then
. /etc/wpa_supplicant/functions.sh
else
exit
fi
请注意,这是脚本行为的一个很好的示例;在假设文件存在之前检查文件是否存在。
第一位if [ -f
是检查定义的文件路径下的文件。如果存在,则通过路径定义的文件(命令的简写是,但我避免在脚本中使用它,因为它可能会被其他命令错误安装,但我已经离题)then
加载文件内容。接下来检查是否未找到该文件并退出并显示脚本状态。然后,如果第一个声明未通过,则该声明以关闭要采取的操作结束。或者换句话说,如果 /etc/wpa_supplicant/functions.sh 确实如此source
source
.
cp
else
exit 0
0
if
fi
不是存在则退出,否则加载这些函数并继续处理。这种双重检查是否存在值或文件的情况在整个脚本以及其他脚本中都会重复出现,-f
检查文件,-n
检查字符串长度,-x
不仅检查文件是否存在,还检查文件是否存在。如果运行脚本的用户对定义的文件具有可执行权限,则-s
检查文件是否为空,-n
检查字符串是否不为空或null
值,并比较语句=
中的字符串(或值) 。您还会在 Linux 上的 shell 和 bash 脚本中看到带有语句的if
其他内容,但那是另一天的事了。该脚本中还有其他if
elif
技巧除了if
语句外还使用||
“或”、&&
“与”、!
“非”等运算符就行了55
~
# quit if executables are not installed
if [ ! -x "$WPA_SUP_BIN" ] || [ ! -x "$WPA_CLI_BIN" ]; then
exit 0
fi
~ 简单地说,如果文件定义$WPA_SUP_BIN
为不是可执行文件或定义的文件$WPA_CLI_BIN
是不是可执行文件然后退出并显示状态0
而不进一步处理。这些一开始可能看起来很复杂,但是用更人性化的语法大声朗读它们可以在第一次学习时有所帮助,对于简单的,并且#
为复杂的添加注释在学习或稍后回到主题时确实很有帮助。
如果不确定文件中的内容,也应该检查内部来源的文件ifupdown.sh
。我建议nano /etc/wpa_supplicant/functions.sh
然后使用^w
或Ctrl+w
来搜索您想了解更多信息的函数名称。因为在任何调用此脚本的任务和functions.sh
大多数谜题的内容之间都会被发现。
现在事情开始寻找有点不同的“圆线”,135
其中case
语句开始,这些类型的语句具有一定的结构,我们可以使用它来帮助解码操作。
case $some_variable in
start)
echo "The word [start] was detected in \$some_variable"
;;
stop)
echo "The word [stop] was detected in \$some_variable"
;;
*)
echo "The word [$some_variable] was detected in \$some_variable but not understood"
;;
esac
在上面的示例中,与其他语句一样,我们本质上是在搜索定义的关键字case
的内容,即或,如果找到关键字,则发出在尾随和前置之间找到的命令,这些命令用于分隔对不同关键字采取的不同操作找到的话。请注意,在某些脚本中,您可能会在循环中找到这些语句,但这也是另一天的事了。$some_variable
start
stop
)
;;
case
for
对于脚本case
中的语句ifupdown.sh
,我们首先匹配变量中的start
或状态,并使用值来匹配是否应该调用命令序列stop
$MODE
$PHASE
pre-up
post-up
或者如果应该调用pre-down
或命令序列。post-down
如果两者都start
没有stop
检测到,则记录、打印错误,并退出脚本并显示1
错误状态。