![使用命令重启网络,无需输入密码](https://linux22.com/image/1129508/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E9%87%8D%E5%90%AF%E7%BD%91%E7%BB%9C%EF%BC%8C%E6%97%A0%E9%9C%80%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81.png)
我的戴尔笔记本电脑从“挂起”状态恢复时,无线网络多次消失。一旦我运行“sudo service network-manager restart”,它就会开始工作。
我想知道是否有一种方法可以在从暂停状态恢复时重新启动网络,并且仅在无线网络未启动时才重新启动!无需输入密码即可重新启动网络的最佳方法是什么?
我不想手动转到网络图标然后进行一些鼠标操作。我宁愿有一个可以设置为快捷方式的命令。我尝试创建一个包含内容“service network-manager restart”的 bash 可执行文件,并在可执行文件上设置 setuid,并赋予 root 所有权,但这样做没有用。
我有 Ubuntu 14.04 Trusty OS。
答案1
您可以进行更改以sudoers
允许您的用户帐户无需密码即可执行必要的命令。
警告:请务必不要在sudoers
不知道其用途的情况下删除任何内容!您可能会失去所有管理员权限。
- 打开
sudo visudo
在标题为“命令别名规范”添加
Cmnd_Alias NETWORK = /usr/sbin/service network-manager restart
NETWORK
只是一组命令的别名。如果您愿意,可以给它起一个不同的名字!在文件末尾附加语句
user_name ALL = (ALL) NOPASSWD: NETWORK
在其中,用您的用户帐户替换
user_name
。同时NETWORK
用您为别名指定的任何名称替换。也可以不使用别名,而直接用命令替换它,但我更喜欢这种方式。我发现它使事情更有条理。保存文件并退出编辑器。检查
sudo -l
您现在是否确实可以发出该命令。
您仍然需要在命令前面加上sudo
,但系统将不再提示您输入密码。
答案2
另一种可能性是使用网络管理器的命令行界面(它不像重新启动守护进程那么“强大”,但对我来说是有效的)。在这种情况下,操作与您与小程序交互完全相同,因此您不需要任何特权。
要重新启动 wifi 接口,请使用以下代码:
nmcli nm wifi off
sleep 5
nmcli nm wifi on
我遇到了类似的网络掉线问题(我的情况是路由器故障),所以我使用了这个脚本添加到初创企业职位:
#!/bin/bash
PINGTEST=192.168.1.1 # my router, change here. google.com should work anytime ;-)
while /bin/true; do
if ! [ "$(ping -c 1 $PINGTEST)" ]; then
echo "Warning: connection lost at $(date) -- restart" 1>&2
nmcli nm wifi off
sleep 5
nmcli nm wifi on
sleep 60
if ! [ "$(ping -c 1 $PINGTEST)" ]; then
echo "Waiting for connection going up at $(date)" 1>&2
sleep 60
else
echo "Connection on at $(date)" 1>&2
fi
# else
# echo "Connection OK on $(date)" 1>&2
fi
sleep 60
done
它每分钟检查一次连接,如果不成功,它就会重新启动 wifi。
如果这还不够,你可能不得不使用更强大的武器,比如启动/停止网络管理器。即使这样有时我也失败了,我不得不求助于卸载(sudo rmmod
)然后重新加载(sudo modprobe
)wifi 卡驱动程序模块。
答案3
您应该能够添加类似这样的内容:
YourUserName ALL=NOPASSWD: service network-manager restart
到您的 /etc/sudoers 文件并能够使用您的脚本重新启动网络管理器。
答案4
在 Ubuntu MATE 20.10 上我使用:
nmcli n off
sleep 5
nmcli n on
以下是我在连续 6 次 ping 路由器失败后监控和重新启动网络的“一行程序”(有时连接在几次尝试失败后会自行恢复):
cc=0; date; echo "monitoring network connection"; while true ; do ( ! ping -c1 192.168.88.1 >/dev/null ) && { date; cc=$((cc+1)); echo "connection lost times: $cc"; } || { [ $cc -ne 0 ] && { date; echo "connection ok"; }; cc=0; }; [ $cc -gt 5 ] && { notify-send "network restarting"; nmcli n off; sleep 5; nmcli n on; cc=4; sleep 10; }; sleep 10; done
注意:这192.168.88.1
是我的路由器的 IP 地址。请根据您的需要进行修改(8.8.8.8
如果您不知道路由器 IP 地址,这应该足够了)。
注意:要了解路由器的 IP 地址,请参阅如何(仅)显示我的路由器的 IP 地址?(可以使用此脚本升级“单行”脚本以自动获取路由器地址)