Joe*_*Joe 8 gui command-line bash sudo kubuntu
TL;DR:sudo从 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
Run Code Online (Sandbox Code Playgroud)
仍然说kde4。
我试过 sudo -A ls
它说
bigbird@sananda:~$ sudo -A ls
sudo: no askpass program specified, try setting SUDO_ASKPASS
Run Code Online (Sandbox Code Playgroud)
我转了几圈看着ksshaskpassand ssh-askpass,但都说它们不打算直接调用。
我没有做任何事情ssh。
对于 bash 脚本,我需要它以普通用户身份执行几乎所有操作,然后以 root 身份运行一两个命令。这些脚本通常从没有打开终端窗口的桌面图标启动(我不需要也不想要)。它们经常使用yad(如zenity或kdialog)与用户交互。
正如您所发现的,您可以将 -A 选项与 sudo 一起使用,但是您需要一种向 sudo 提供密码的 gui 方法。
您可以随心所欲地编写这样的工具,只要它在标准输出上将密码传回给 sudo。我使用了很久以前有人向我建议的一个简单的解决方案,它使用 kdialog,并且像所有简单的解决方案一样,从那时起它一直是我的首选。
所以为自己创建一个简单的 kdialog 脚本,比如这个
#!/bin/bash
kdialog --password "Password required to proceed"
Run Code Online (Sandbox Code Playgroud)
现在你像这样使用 sudo
#!/bin/bash
export SUDO_ASKPASS=<path to your kdialog script>
sudo -A foo
Run Code Online (Sandbox Code Playgroud)
如果您没有 kde,您当然可以使用您想要的任何语言作为 gui 密码提供程序
编辑:绕过 sudo passwd_tries 的解决方案
这样您就可以只要求输入一次密码(如您所愿),您可以在脚本中的一个变量中捕获密码,并使用 -S 开关将该变量直接传递给 sudo 命令。
这样做的好处是它忽略了 sudo passwd_tries 规则,并且仍然需要交互式密码输入,因此密码不会存储在脚本中。
PASSWD=$(kdialog --password "sudo password required")
echo $PASSWD | sudo -S foo
Run Code Online (Sandbox Code Playgroud)
也可以直接一行,如果脚本中不需要多个sudo命令,像这样
echo $(kdialog --password "sudo password required") | sudo -S foo
Run Code Online (Sandbox Code Playgroud)
当然,如果您想在所有脚本中使用标准的 kdialog 提示,您可以使用我们之前讨论过的自己的 kdialog 脚本来代替此处使用的 kdialog。
从我的 POV 绕过 sudo 的 passwd_tries 的问题是,如果密码错误,您的脚本将在 sudo 命令之后继续处理任何命令,因此如果 sudo 提升的命令对脚本的成功至关重要,那么您就会遇到问题。
需要注意的是,来自 kdialog(或替代方案,例如 zenity)的密码写在标准输出上,我之前应该提到过这一点,因此任何捕获 PID 标准输出的人都会看到您的密码。但是,您系统上的任何黑客都会做的远不止这些。