web-dev-qa-db-ja.com

bashスクリプトでグラフィカルにパスワードを要求し、デフォルトのSudoタイムアウト設定を保持する

Sudo -A(Sudo_ASKPASS)オプションを使用すると、Sudoがタイムアウト(timestamp_timeoutなど)設定を失うようです。

Sudo -Aオプションを使用したいが、bashスクリプトでデフォルトのタイムアウト(Ubuntuでは15分など)を保持したい。ユーザーのパスワードを安全かつGUIダイアログで要求したいのですが、スクリプトに対して1回だけプロンプトを表示したい(50回以上ではなく)。

さらに、スクリプト全体をrootユーザーとして実行したくありません。これは悪い考えだと思います。さらに、この場合、私のスクリプトによって作成されたファイルの所有権は正しくありません。

Sudo -Aオプションは、デフォルトのタイムアウトを保持している場合は機能します。

Sudoマニュアルから:

オプション:‑A

通常、Sudoがパスワードを必要とする場合、Sudoはユーザーの端末からそれを読み取ります。 ‑A(askpass)オプションを指定すると、(おそらくグラフィカルな)ヘルパープログラムが実行され、ユーザーのパスワードが読み取られ、パスワードが標準出力に出力されます。 Sudo_ASKPASS環境変数が設定されている場合は、ヘルパープログラムへのパスを指定します。それ以外の場合、/ etc/Sudo.confにaskpassプログラムを指定する行が含まれていれば、その値が使用されます。例えば:

# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass

ちなみに、kdesudoにも同じ問題があります。同じスクリプトで1秒後でも、呼び出されるたびにパスワードが必要です。

Kubuntu 12.04 64ビットを使用しています。

以下は、ソリューションのすべての部分の完全に機能する例です。これは、bashスクリプト、推奨される「myaskpass」スクリプト here 、および「.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=

そしてテストスクリプト自体。このソリューションを使用すると、パスワードを2回要求されます。

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

これを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で動作させることができます。私はまだ完璧な解決策を探していますが、今のところこれでうまくいきます。

7
MountainX

gksudoはどうですか?

$ gksudo your_app_launcher.sh

管理者パスワードを安全に入力するためのグラフィカルダイアログが表示されます。

1
woohoo