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
和ssh-askpass
,但都说它们不打算被直接调用。
我是不是做任何事ssh
。
我需要这个来执行 bash 脚本,这些脚本几乎可以以普通用户身份执行所有操作,然后以 root 身份运行一两个命令。这些脚本通常从没有打开终端窗口的桌面图标启动(我不需要也不想要终端窗口)。它们通常使用yad
(如zenity
或kdialog
)与用户交互。
答案1
正如您所发现的,您可以将 -A 选项与 sudo 一起使用,但您需要一种 gui 方法来向 sudo 提供密码。
您可以随心所欲地编写这样的工具,只要它在 stdout 上将密码传回 sudo 即可。我使用一种很久以前有人向我建议的简单解决方案,即使用 kdialog,并且像所有简单的解决方案一样,它一直是我的首选。
因此,请创建一个简单的 kdialog 脚本,例如这个
#!/bin/bash
kdialog --password "Password required to proceed"
现在你可以像这样使用 sudo 来使用它
#!/bin/bash
export SUDO_ASKPASS=<path to your kdialog script>
sudo -A foo
当然,如果你没有 kde,你可以使用任何你想要的语言作为你的 gui 密码提供程序
编辑:绕过 sudo passwd_tries 的解决方法
这样您就可以只询问一次密码(正如您想要做的那样),您可以将密码捕获到脚本中的变量中,然后使用 -S 开关将该变量直接传递给 sudo 命令。
这样做的好处是它忽略了 sudo passwd_tries 规则,但仍然需要交互式密码输入,因此密码不存储在脚本中。
PASSWD=$(kdialog --password "sudo password required")
echo $PASSWD | sudo -S foo
如果脚本中不需要多个 sudo 命令,您也可以直接在一行上执行此操作,如下所示
echo $(kdialog --password "sudo password required") | sudo -S foo
当然,如果您希望在所有脚本中都有标准的 kdialog 提示,您可以使用我们之前讨论过的您自己的 kdialog 脚本来代替这里的 kdialog。
从我的角度来看,绕过 sudo 的 passwd_tries 的问题在于,如果密码错误,脚本将继续处理 sudo 命令之后的任何命令,因此如果 sudo 提升的命令对于脚本的成功至关重要,那么您就会遇到问题。
需要注意的是,kdialog(或 zenity 等替代方案)的密码写在 stdout 上,这一点我之前应该提到过,因此任何捕获 PID 的 stdout 的人都会看到您的密码。但任何黑客入侵您的系统都会做更多的事情。
答案2
你有没有尝试过pkexec
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY gedit
答案3
不仅 kdesudo,而且也 gksu
被弃用了。这些变化至少有点烦人。看来我们现在应该采取的方法是利用前缀,admin://
例如,如果你以前使用前缀,那么kdesudo gedit /etc/default/grub
现在你会改为gedit admin:///etc/default/grub
如果我放弃 16.04 而使用“全新改进”版本,这肯定需要一些时间来适应。
另一个可能的解决方案是首先在终端启动脚本。
来源:https://www.linuxuprising.com/2018/04/gksu-removed-from-ubuntu-heres.html
答案4
我刚刚找到一些答案这里。
其要点如下:
目前,解决方法是找到kdesu
系统上的安装位置
你可以用
ls -l /etc/alternatives/kdesu
kdesudo
然后为$HOME/.bashrc
或 (如果使用的话) 添加别名$HOME/.bash_aliases
。
别名是
## Resurect kdesudo - this will probably fail eventually
alias kdesudo='/usr/lib/kde4/libexec/kdesu-distrib/kdesu'
确保将路径调整为kdesu
您在上一步中找到的路径。
这对于 KDE 下的一些程序不起作用,因为
KDE 开发人员正在研究 polkit 路线,以允许其他应用程序临时提升权限,就像他们已经为 Kate 所做的那样。—— GreyGeek
当他们这样做时,他们会禁用直接提升,因为(如果运行正常)你不再需要它。程序只会在需要执行特权操作时要求输入密码。这在脚本中如何工作还有待观察。