sudo
TL;DR:从 shell 脚本中生成图形的正确新方法是什么?
挥舞:
我刚刚从 kubuntu 16.04 升级到 18.04,我正在做正常的分类。
kdesudo
在 18.04 中消失(未维护)。
我在带有 GUI i/o 的 bash 脚本中经常使用它。
一些帖子说使用kdesu
- 这似乎很奇怪。我似乎记得它与有效用户或类似的东西混淆了。
那没有安装在我的PATH中。
我在
bigbird@sananda:~/pq$ ls -l /etc/alternatives/kdesu
rwxrwxrwx 1 root root 41 Aug 19 03:23 /etc/alternatives/kdesu ->
/usr/lib/kde4/libexec/kdesu-distrib/kdesu
仍然说kde4。
我试过了sudo -A ls
它说
bigbird@sananda:~$ sudo -A ls
sudo: no askpass program specified, try setting SUDO_ASKPASS
我在几个圈子里看着ksshaskpass
and ssh-askpass
,但都说不打算直接调用它们。
我没有对ssh
.
对于以普通用户身份执行几乎所有操作然后以 root 身份运行一两个命令的 bash 脚本,我需要它。这些脚本通常从没有打开终端窗口的桌面图标启动(我不需要或不想要一个。)它们经常使用yad
(喜欢zenity
或kdialog
)与用户交互。
正如您所发现的,您可以将 -A 选项与 sudo 一起使用,但您需要一种 gui 方法来为 sudo 提供密码。
您可以随心所欲地编写这样的工具,只要它将密码传递回标准输出上的 sudo。我使用了很久以前有人向我建议的一个简单的解决方案,它使用了 kdialog,并且像所有简单的解决方案一样,从那时起它一直是我的首选。
所以为自己创建一个简单的 kdialog 脚本,比如这个
现在你像这样使用 sudo
如果您没有 kde,您当然可以为您的 gui 密码提供程序使用任何您想要的语言
编辑:绕过 sudo passwd_tries 的解决方案
这样您就可以只要求输入一次密码(如您所愿),您可以在脚本中的变量中捕获密码,然后使用 -S 开关将该变量直接传递给 sudo 命令。
这样做的好处是它忽略了 sudo passwd_tries 规则,并且仍然需要交互式密码输入,因此密码不会存储在脚本中。
如果脚本中不需要多个 sudo 命令,也可以直接在一行上执行,像这样
当然,如果您想在所有脚本中使用标准的 kdialog 提示符,您可以使用我们之前讨论过的您自己的 kdialog 脚本来代替此处使用的 kdialog。
从我的 POV 绕过 sudo 的 passwd_tries 的问题是,如果您输入错误的密码,您的脚本将继续处理 sudo 命令之后的任何命令,因此如果 sudo 提升命令对脚本的成功至关重要,那么您就会遇到问题。
需要注意的是,来自 kdialog(或诸如 zenity 之类的替代方法)的密码是写在标准输出上的,这是我之前应该提到的,因此任何捕获 PID 标准输出的人都会看到您的密码。但是,您系统上的任何黑客都会做的远不止这些。
你有没有尝试过
pkexec
不仅是 kdesudo,而且也
gksu
被弃用了。这些变化至少有点烦人。看来我们现在打算采用的方法是使用admin://
前缀,例如,如果您kdesudo gedit /etc/default/grub
现在习惯使用前缀,那么gedit admin:///etc/default/grub
如果我放弃 16.04 以获得“新的和改进的”版本,这肯定需要一些时间来适应。另一种可能的解决方案是简单地在终端中启动脚本。
来源:https ://www.linuxupprising.com/2018/04/gksu-removed-from-ubuntu-heres.html
我刚刚在这里找到了一些答案。
它的要点是:
目前,一种解决方法是查找
kdesu
系统上的安装位置你可以做的
然后为
kdesudo
to$HOME/.bashrc
或者,如果你使用它, 为 to 添加一个别名$HOME/.bash_aliases
。别名是
确保将路径调整为
kdesu
您在上述步骤中找到的路径。这不适用于 KDE 下的某些程序,因为
当他们这样做时,他们会禁用直接提升,因为(如果它工作正常)你不再需要它了。当程序需要执行特权操作时,它只要求输入密码。这将如何在脚本中发挥作用还有待观察。