我刚刚安装了 Alpine linux,一切都像我希望的那样顺利,除了无线网络(XFCE 的电源按钮和重新启动按钮呈灰色,但这与这里无关)。
我不会是使用计算机的人,它唯一需要做的两件事就是连接到无线网络并通过浏览器访问互联网。但因为使用这台计算机的人完全不懂技术,所以我真的不能告诉他们这样做这个(alpine linux无线连接指南)每次他们改变网络时;只要看到终端就会吓坏他们。所以我需要给他们一个 GUI。
我尝试着寻找 Alpine linux 的网络管理器 GUI。我真正需要的是像Wicd这样的东西,但我只在Alpine的测试存储库中找到了connman和networkmanager,但是它们都无法正确启动,我怀疑即使我设法学习如何创建,我也可以让wicd自己工作APKBUILD 并按时编译..
所以我最终在放弃之前想也许我可以用脚本创建一些东西。我的意思是我需要它做的就是 alpine linux wiki 上的无线连接指南中所说的,如 sudo。
刚跑
iwlist wlan0 scanning
查找 ESSID 并整齐地列出它们,可能是按信号强度排序的。选择一个后,将显示密码提示,要求输入密码。在那之后...
iwconfig wlan0 essid MyNet #set SSID
wpa_passphrase PASSPHRASE > wpa.conf #set Passphrase
wpa_supplicant -Dwext -iwlan0 -c ./wpa.conf #Connect
这样就可以了。我可以自己找出检查连接性和自动提示等的方法,但我首先需要知道是否可以在不编写完整的 GTK 或 Qt 程序的情况下完成此操作。
我想使用 Zenity 之类的脚本快速轻松地完成此操作,可以吗?有人能给我举个例子吗?谢谢。
(顺便说一句,Alpine 附带 ASH,而不是 BASH,如果我能在 ASH 中编写脚本那就最好了,但如果不是,我不介意使用 BASH 或 Python)
答案1
胡闹之后用了几个小时我设法使用 zenity 和一些 sudoers 更改来烹饪一些像样的东西。我将一步一步地说明我是如何做到这一切的,以防其他人陷入在 Linux 发行版上的丑陋境地,该发行版只有过时的无线网络软件(如无线工具),而没有任何简单的方法来获取已知的 GUI,如 wicd...
依赖项:
ash(or bash), sudo, zenity, awk, wget, ping, wpa_supplicant, wireless-tools (ip, iwlist, iwconfig, wpa_passphrase)
它还可选地取决于通知发送(这些实例可以很容易地替换为zenity——通知尽管)
首先,我必须设置 sudoers 文件以允许我/所有用户运行一些特定命令,这是一行(请注意,我使用的是 alpine linux,您可能拥有与我相同的程序,但它们的可执行文件可能位于在不同的地方,先找到每个的正确路径)
您会在那里看到一个奇怪的命令(wpa_restart),我们稍后将创建该文件。
在 sudoers(visudo) 中:
ALL ALL=(ALL) NOPASSWD: /usr/sbin/iwlist, /usr/sbin/iwconfig, /sbin/ip /sbin/wpa_restart
在继续之前,让我们将 wpa_supplicant 设置为在启动时启动(Open-RC 用户;systemd 用户将需要以 systemd 方式执行此操作)
rc-update add wpa_supplicant boot
执行此操作后登录作为根用户(或使用苏)并运行以下命令:
echo > /etc/wpa_supplicant/wpa_supplicant.conf
chmod +777 /etc/wpa_supplicant/wpa_supplicant.conf
chmod -r /etc/wpa_supplicant/wpa_supplicant.conf
echo > /usr/sbin/wireless_gui
chmod +x /usr/sbin/wireless_gui
echo > /usr/sbin/wireless_check
chmod +x /usr/sbin/wireless_check
echo > /sbin/wpa_restart
chmod +x /sbin/wpa_restart
接下来让我们用一些脚本实际填充这些文件......
/sbin/wpa_restart (这仅适用于 open-rc,systemd 用户将需要不同的东西,此文件用于重新启动 wpa_supplicant 例如,如果您在连接之间切换,或者如果您的连接失败并且需要重新连接等):
#!/bin/ash
rc-service wpa_supplicant restart
/usr/sbin/wireless_check(检查连接,如果没有则启动 ssid 选择 GUI):
#!/bin/ash
wget -q -s http://google.com
if [[ $? -eq 0 ]]; then
eth=$(ifconfig eth0 | grep inet addr)
if [ $eth !=" " ];then
SSID=$(iwconfig wlan0 | grep ESSID | cut -d: -f2 )
notify-send "Connected to Wireless Network" "$SSID"
else
notify-send "Connected Via Ethernet" ""
fi
else
/usr/sbin/wireless_gui
fi
/usr/sbin/wireless_gui (主要内容):
#!/bin/ash
sudo ip link set wlan0 up
ssid=$(sudo iwlist wlan0 scanning | awk -F: 'BEGIN{ printf "zenity --list --text \"Available Networks\" --list --column ESSID --column Security --column Signal "; }/Quality/{ split($0,x,"="); Quality = int(x[2]*100/70+.5); }/Encryption/{ Encryption = $2; }/ESSID/{ ESSID = $2; printf "%s \"%s\" \"%s%%\" \\\n", ESSID, Encryption, Quality}' |sh);
if [ $ssid !=" " ]; then
zenity --warning --text "Failed to select network!"
else
$1="30"
echo $1
sudo ip link set wlan0 down
sudo iwconfig wlan0 essid $ssid
wpa_passphrase $ssid > /etc/wpa_supplicant/wpa_supplicant.conf $(zenity --password --title "Secured Network")
sudo ip link set wlan0 up
sudo wpa_restart
sleep 2
success=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error)
if [ $success = "error" ]; then
echo $success
zenity --question --title "Wrong Password" --text "Retry?"
while [[ $? -eq 0 ]]; do
wpa_passphrase $ssid > /etc/wpa_supplicant/wpa_supplicant.conf $(zenity --password --title "Secured Network")
sudo wpa_restart
sleep 2
success=$(ping -q -w 1 -c 1 `ip r | grep default | cut -d ' ' -f 3` > /dev/null && echo ok || echo error)
if [ $success = "error" ]; then
zenity --question --title "Wrong Password" --text "Retry?"
else
notify-send "Connected to Wireless Network" "$ssid"
break
fi
done
else
notify-send "Connected to Wireless Network" "$ssid"
fi
fi
这就是我所说的利用你所拥有的:)
现在退出 root/su 提示符,运行无线图形用户界面作为用户一次,看看是否一切正常,然后就完成了。
如果它不起作用,唯一可能出错的是你没有 ash(将 #!/bin/ash 替换为 #!/bin/bash 来修复),你在 sudoers 中的路径之一是错误的,您忘记了 chmod 命令之一,您的无线接口不称为 wlan0(使用如果配置或者ip链接找出来,然后将所有提到的 wlan0 重命名为您的接口的名称),或者当然,您缺少依赖项。
理想的设置方式应该是无线检查每次登录桌面环境时都会运行。它会检查互联网连接,如果已连接,则会发出通知,然后启动无线图形用户界面如果你不是。无线 GUI 将扫描并列出所有附近的 ESSID,您选择一个,然后输入密码。如果连接失败,它会询问您是否要重试输入密码,直到您成功或拒绝为止。
如果您不想安装网络管理器,或者您(像我一样)不能安装,那么这是一个非常好的解决方案。