使用命令重启网络,无需输入密码

使用命令重启网络,无需输入密码

我的戴尔笔记本电脑从“挂起”状态恢复时,无线网络多次消失。一旦我运行“sudo service network-manager restart”,它就会开始工作。

我想知道是否有一种方法可以在从暂停状态恢复时重新启动网络,并且仅在无线网络未启动时才重新启动!无需输入密码即可重新启动网络的最佳方法是什么?

我不想手动转到网络图标然后进行一些鼠标操作。我宁愿有一个可以设置为快捷方式的命令。我尝试创建一个包含内容“service network-manager restart”的 bash 可执行文件,并在可执行文件上设置 setuid,并赋予 root 所有权,但这样做没有用。

我有 Ubuntu 14.04 Trusty OS。

答案1

您可以进行更改以sudoers允许您的用户帐户无需密码即可执行必要的命令。

警告:请务必不要在sudoers不知道其用途的情况下删除任何内容!您可能会失去所有管理员权限。

  1. 打开sudo visudo
  2. 在标题为“命令别名规范”添加

    Cmnd_Alias NETWORK = /usr/sbin/service network-manager restart
    

    NETWORK只是一组命令的别名。如果您愿意,可以给它起一个不同的名字!

  3. 在文件末尾附加语句

    user_name ALL = (ALL) NOPASSWD: NETWORK
    

    在其中,用您的用户帐户替换user_name。同时NETWORK用您为别名指定的任何名称替换。也可以不使用别名,而直接用命令替换它,但我更喜欢这种方式。我发现它使事情更有条理。

  4. 保存文件并退出编辑器。检查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 地址?(可以使用此脚本升级“单行”脚本以自动获取路由器地址)

相关内容