我正在使用命令nmcli c up id networkname在脚本中更改网络。从终端运行脚本时,脚本运行良好,但是从cron运行脚本时,出现错误:
Error: Connection activation failed: Not authorized to control networking.
Run Code Online (Sandbox Code Playgroud)
在网上搜索时,我发现了2011年有关此问题的错误报告:https : //bugs.launchpad.net/ubuntu/+source/network-manager/+bug/681708,但没有解决方案。
从终端而不是cron运行时,为什么脚本可以工作?如果可能的话,我想避免将此放在根目录中。
小智 7
@vidstige 描述的解决方案帮助我解决了这个问题。正如@partofthething 所评论的,问题是,如果/var/lib/polkit-1/localauthority/10-vendor.d/是存储 .pkla 的最佳位置。
看完后man pklocalauthority觉得不是。
/etc/polkit-1/localauthority 层次结构用于本地配置,/var/lib/polkit-1/localauthority 用于第 3 方软件包。
我们是否构建了第 3 方包?我想不是。
10-vendor.d 供操作系统供应商使用。
我们是操作系统供应商吗?我想不是。
我认为/etc/polkit-1/localauthority/50-local.d/.pkla 是更好的地方。
使用这种方式也解决了排序的问题:
50-local.d 被评估后 10-vendor.d/etc/polkit-1/localauthority/ 被评估后 /var/lib/polkit-1/localauthority(我会把这个写成评论,但 50 声望……)
决定是否授予对脚本的访问权限的守护程序称为polkitd。
要获取有关出了什么问题的信息,可以发出
nmcli general permissions
Run Code Online (Sandbox Code Playgroud)
它将列出与相关的一些权限nmcli。您会注意到,从cron运行并在登录时会给出不同的结果。
当前针对桌面使用的dists(例如Ubuntu和更多版本)使用Active alot权限,这意味着它将向登录到本地和活动X11会话的用户授予访问权限。
您也可以像这样在终端中运行polkitd
killall polkitd # first kill running polkitd
G_MESSAGES_DEBUG=all /usr/lib/policykit-1/polkitd
Run Code Online (Sandbox Code Playgroud)
这将使您了解polkitd正在进行的工作以及正在做出的决定。
在其中添加一个.pkla文件/var/lib/polkit-1/localauthority/10-vendor.d/,将其命名为x.pkla。Imortant:它需要按其他字典顺序排序,org.freedesktop.NetworkManager.pkla否则该文件将覆盖您的可爱文件。
放置类似这样的内容以向该adm组中的用户授予权限。您还可以授予特定用户等。
[Let adm group modify system settings for network]
Identity=unix-group:adm
Action=org.freedesktop.NetworkManager.settings.modify.system
ResultAny=yes
Run Code Online (Sandbox Code Playgroud)
如果您需要更多权限(例如启用/禁用wifi),则可能需要向该文件添加多个部分。