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

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

(SUDO_ASKPASS)选项sudo -A显然会导致 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

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

我使用的是 Kubuntu 12.04 64 位。

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

$ 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=

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

#!/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

答案1

我将其添加到我的 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 &

在这里找到它:

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 下工作。我仍在寻找完美的解决方案,但这暂时可以解决问题。

答案2

怎么样格克苏多

$ gksudo your_app_launcher.sh

它确实显示了一个用于安全输入管理员密码的图形对话框。

相关内容