在 bash 脚本中以图形方式询问密码并保留默认的 sudo 超时设置

Mou*_*inX 9 bash password gui sudo bash-script

sudo -A(SUDO_ASKPASS)选项显然原因sudo来失去的超时时间(例如,timestamp_timeout)设置。

我想使用 sudo -A 选项,但我想在 bash 脚本中保留默认超时(例如,在 Ubuntu 上为 15 分钟)。我想在 GUI 对话框中安全地询问用户密码,但我只想提示一次我的脚本(不是 50 次以上)。

此外,我不想以 root 用户身份运行我的整个脚本,因为我认为这是一个坏主意。此外,在这种情况下,由我的脚本创建的文件具有错误的所有权。

如果保留默认超时,则 sudo -A 选项对我有用。

从 sudo 手册:

选项:?A

通常,如果 sudo 需要密码,它会从用户的终端读取密码。如果指定了 ?A (askpass) 选项,则执行(可能是图形的)帮助程序来读取用户的密码并将密码输出到标准输出。如果设置了 SUDO_ASKPASS 环境变量,它会指定帮助程序的路径。否则,如果 /etc/sudo.conf 包含一行指定 askpass 程序,则将使用该值。例如:

# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass
Run Code Online (Sandbox Code Playgroud)

顺便说一句,kdesudo 也有同样的问题——每次调用它都需要密码,即使在同一脚本中只在一秒钟之后。

我正在使用 Kubuntu 12.04 64 位。

这是解决方案所有部分的完整工作示例。它由 bash 脚本、此处建议的“myaskpass”脚本和“.desktop”文件组成。整个事情应该是 100% GUI(根本没有终端交互),所以 .desktop 文件是必不可少的(afaik)。

$ cat myaskpass.sh 
#!/bin/bash
kdialog --password "Please enter your password: "
exit 0


$ cat askpasstest1.desktop 
#!/usr/bin/env xdg-open
[Desktop Entry]
Comment=SUDO_ASKPASS tester1
Exec=bash /home/user/test/askpasstest1.sh
GenericName=SUDO_ASKPASS tester1
Name=SUDO_ASKPASS tester1
NoDisplay=false
Path[$e]=
StartupNotify=true
Terminal=false
TerminalOptions=
Type=Application
Categories=Application;Utility;
X-KDE-SubstituteUID=false
X-KDE-Username=
Run Code Online (Sandbox Code Playgroud)

和测试脚本本身。使用此解决方案时,这将要求您输入两次密码。

#!/bin/bash

sudo -k
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass1
touch filemadeas_regularuser1
SUDO_ASKPASS="/home/user/test/myaskpass.sh" sudo -A touch filemadeas_askpass2
touch filemadeas_regularuser2
ls -la filemadeas* > /home/user/test/fma.log
kdialog --title "Files Created" --textbox /home/user/test/fma.log 640 480
sudo rm filemadeas_*
rm fma.log

exit 0
Run Code Online (Sandbox Code Playgroud)

Mou*_*inX 7

我将此添加到我的 bash 脚本中:

# ask for password up-front.
sudo -v
# Keep-alive: update existing sudo time stamp if set, otherwise do nothing.
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
Run Code Online (Sandbox Code Playgroud)

在这里找到它:

https://serverfault.com/questions/266039/temporarlly-increasing-sudos-timeout-for-the-duration-of-an-install-script

https://gist.github.com/cowboy/3118588

我使用另一个脚本来启动我的主脚本,并使用 .desktop 文件来启动该辅助脚本。这不是很简单,但可以使其 100% 使用 GUI。我仍在寻找完美的解决方案,但现在正在做的伎俩。