Armbian Ubuntu22开机登录前运行网络检测脚本失败求助
我在搭载Armbian Ubuntu22系统的Orange thin设备上,想要实现开机登录前自动运行网络检测脚本:脚本检测设备是否联网,未联网则打开armbian-config修改网络设置。脚本单独运行正常,但多种开机启动配置方式都没效果。
已尝试的配置方法
创建脚本文件:
执行命令:sudo nano /usr/share/check_network.sh
脚本内容:#!/bin/bash ping -c 1 google.com if [ $? -ne 0 ]; then echo "configure your network" | bash -c "read; armbian-config" fi已添加执行权限:
chmod +x /usr/share/check_network.sh配置lightdm.conf:
执行命令:sudo nano /etc/lightdm/lightdm.conf
修改内容:[Seat:*] display-setup-script=/usr/share/check_network.sh修改slick-greeter.desktop:
执行命令:sudo nano /usr/share/xgreeters/slick-greeter.desktop
修改内容:Exec=/bin/bash /usr/share/check_network.sh配置rc.local:
执行命令:sudo nano /etc/rc.local
添加内容:/usr/share/check_network.sh添加用户自启动项:
执行命令:sudo nano /home/mydevice/.config/autostart/check_network.desktop
文件内容:[Desktop Entry] Type=Application Exec=sudo /usr/share/check_network.sh StartupNotify=false
问题原因分析
- rc.local时机不对:rc.local在系统启动早期运行,此时X服务还未启动,
armbian-config作为图形界面工具无法正常运行。 - lightdm的display-setup-script限制:该脚本用于配置显示参数,运行时未加载桌面交互组件,
read命令和armbian-config无法获取输入焦点。 - 修改slick-greeter的Exec会替换登录界面:直接修改greeter执行命令会导致原登录界面无法启动,脚本运行后无后续登录流程,逻辑无法触发。
- 用户自启动项时机太晚:
.config/autostart内程序在登录后才运行,不符合「登录前」需求;且sudo需要密码,无交互环境下会执行失败。
可行解决方案
方法1:使用Lightdm的greeter-setup-script(推荐)
Lightdm的greeter-setup-script专门用于登录界面加载前运行脚本,此时图形环境已就绪:
修改lightdm配置:
sudo nano /etc/lightdm/lightdm.conf在
[Seat:*]段添加:greeter-setup-script=/usr/share/check_network.sh若之前设置过
display-setup-script可保留,但优先级低于此配置。修正脚本逻辑:
原脚本的read命令在greeter环境下无法接收输入,且armbian-config需root权限,修改脚本为:#!/bin/bash # 改用国内域名避免解析问题 ping -c 1 -W 2 baidu.com > /dev/null 2>&1 if [ $? -ne 0 ]; then sudo armbian-config fi配置免sudo权限:
sudo visudo添加一行:
ALL ALL=(ALL) NOPASSWD: /usr/sbin/armbian-config保存退出后,脚本可无密码运行
sudo armbian-config。重启Lightdm生效:
sudo systemctl restart lightdm
方法2:使用systemd服务(适配命令行登录场景)
若设备需命令行登录,可创建systemd服务,在图形界面启动前运行:
创建服务文件:
sudo nano /etc/systemd/system/check-network.service内容:
[Unit] Description=Pre-login Network Check After=network.target multi-user.target Before=graphical.target [Service] Type=oneshot ConditionPathExists=/usr/bin/startx ExecStart=/usr/share/check_network.sh # 允许交互,适配armbian-config的图形界面 StandardInput=tty StandardOutput=tty StandardError=tty TTYPath=/dev/tty1 [Install] WantedBy=graphical.target启用服务:
sudo systemctl daemon-reload sudo systemctl enable check-network.service同样需要修改脚本并配置免sudo权限(同方法1)。
内容的提问来源于stack exchange,提问作者Kareem Aldarwish

