我目前正在使用一款需要管理员权限的 VPN 应用程序,并且我已将该应用程序添加到自动启动中。但是,每次登录时,我都会被要求输入密码以授予此应用程序的权限,这对我来说非常多余,因为我只是使用相同的密码登录。
有什么办法可以让这个应用程序自动启动而无需输入密码?我已经尝试过发出自动启动命令sudo airvpn
,但这导致应用程序根本无法打开。
需要澄清的是,我并不是想在启动时运行命令,而是想在登录时运行命令。这个问题是相关的,但是,我尝试添加exec airvpn
到/etc/rc.local
,但登录时什么也没有发生。
答案1
如果您正在运行图形程序,也许您应该避免使用sudo
,因为它只能通过终端窗口询问您的密码,这对图形程序来说并不好。(除非您从终端启动上述程序。)我曾经推荐gksu
或gksudo
,但遗憾的是这两个程序都已停用,并且在 Ubutnu 的最新版本中不再可用。您可以改用 policykit 以 root 身份运行程序pkexec airvpn
。这也需要密码,但可以使用图形弹出窗口提示输入密码,因此不依赖于在终端中输入的密码。
如果您不想每次都输入密码,这里有一些关于如何以 root 身份执行程序而无需输入密码的提示。
设置用户标识
如果airvpn
可执行文件是二进制文件(而不是文本文件),则应该能够使用 chmod 命令更改文件权限以激活 setuid 模式,这意味着它将始终以拥有它的用户身份运行。 (要确保用户是 root,请运行sudo chroot $(which airvpn)
。)这不需要密码,也不需要您执行以下任何步骤。 但是,它将要求您运行以下命令:sudo chmod u+s $(which airvpn)
。 但是,此技巧不适用于文本文件(python 程序、shell 脚本等)。 此外,如果您更新此文件,则可能必须再次执行此操作。 下次更新时再执行一次。 再一次……
制作sudo
配置文件
顺便说一句,sudo
(以及扩展名gksudo
和gksu
,它们都使用与相同的配置sudo
)和 policykit(可以使用以 root 身份执行程序pkexec
)都可以被编程为运行程序而无需输入密码。我不知道如何使用 policykit 做到这一点,但我可以教你如何使用来实现这一点sudo
。在继续之前,你应该在后台运行一个 root shell,以防出现问题。(您可能完全失去使用的能力sudo
,见下文)。在目录中创建一个文本文件/etc/sudoers.d
。你可以随便叫它什么,只要它没有字符.
,也不以字符结尾~
。
在继续之前,我应该提醒你,你需要知道airvpn
可执行文件的路径。如果你进入which airvpn
终端,它会告诉你这个文件在哪里。假设它是/usr/bin/airvpn
,你可以输入:
%admin ALL = NOPASSWD:/usr/bin/airvpn
并将其保存在/etc/sudoers.d
目录中。使用命令chmod
将文件权限设置为 0440 可能是一个好主意。您可以通过运行 (以 root 身份) 来执行此操作chmod 0440 file
,将“file”替换为新创建文件的名称。
现在,打开新的终端,并通过运行 来测试这个新配置sudo airvpn
。(“new”一词之所以以粗体显示,是因为sudo
如果您已经在现有终端中执行了命令,可能不会要求您输入密码sudo
,即使您尚未成功配置sudo
以避免要求您输入密码。)如果您能够在新终端中执行此操作,则您已成功实现airvpn
无需密码执行。现在您所要做的就是将启动项更改为运行sudo airvpn
,然后就可以开始了。无论可执行文件是二进制文件还是文本文件,这都可以正常工作。此外,无论您更新此程序的频率如何,都只需要执行一次此操作。
哦不!它不起作用,现在 sudo 给我错误了!
如果出现问题,并且您无法以sudo
root 身份执行任何操作,则可以删除新创建的文件,并且 sudo 应该会像以前一样运行。(还记得我建议您保持 root shell 运行吗?您可能需要它来删除该文件。当然,您可以通过运行来执行 root shell pkexec su
,然后使用它来删除该文件。或者,如果 root 帐户有密码,su
也可以这样做。)
gksudo 替换
尽管 gksudo 可能已经过时了,但您还是有办法自己进行类似的替换。第一步,安装 ssh-askpass 包:sudo apt install ssh-askpass
。然后,创建一个 shell 脚本(使用您最喜欢的文本编辑器),内容如下:
#!/bin/sh
export SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass
exec sudo "$@"
您可以将其另存为gksudo
。现在,您需要使该脚本可执行,并将其复制到可以执行它的地方。您可以组合 heinstall
命令,这样您就可以同时执行这两件事:sudo install -o 0 -g 0 -m 0755 ./install /usr/local/sbin
。(如果您没有目录/usr/local/sbin
,您可能需要创建一个:sudo mkdir -p /usr/local/sbin
。)您可能还想运行rm install
,这样您就不会有无用的第二份副本。
现在您可以输入gksudo airvpn
,您将获得一个非终端提示符来输入您的密码。您可以重复使用它来制作应用程序启动器、启动项或其他任何内容。由于此脚本依赖于作为sudo
后端,因此您对 所做的任何配置sudo
也将在此处应用。因此,如果您的sudo
配置失败,这可能会成为一种后备方案 - 除非您无法使用 sudo 执行任何操作,在这种情况下您只能靠自己了。(例如,如果您的/etc/sudoers.d/*
文件因某种原因被删除。)