ユーザーとの対話専用にkdialogを使用するbashスクリプトを作成しました。 「.desktop」ファイルから起動されるため、ユーザーには端末が表示されません。 GUIアプリのように100%見えます (単なるbashスクリプトですが)。 KDE(Kubuntu 12.04)でのみ実行されます。
私の唯一の問題は、 パスワード入力を安全に処理する と便利です。満足のいく解決策が見つかりません。
このスクリプトは、designedであり、通常のユーザーとして実行し、Sudoコマンドが最初に必要になったときにパスワードを要求するように設計されていました。このようにして、Sudo権限を必要としないほとんどのコマンドは、通常のユーザーとして実行されます。何が起こるか(スクリプトが端末から実行されるとき)は、ユーザーが一度パスワードの入力を求められ、デフォルトのSudoタイムアウトにより、ユーザーに再度プロンプトを表示せずに、追加のSudoコマンドを含むスクリプトが終了します。これは、GUIの背後で実行したときにも動作するようにする方法です。
主な問題は、kdesudo
を使用してスクリプトを起動することです。これは標準のGUI方法であり、スクリプト全体がルートユーザーによって実行されることを意味します。そのため、ファイルの所有権はルートユーザーに割り当てられ、パスの~/
に依存することはできず、他の多くのものは理想的ではありません。 rootユーザーとしてスクリプト全体を実行することは、非常に不十分なソリューションであり、悪い習慣だと思います。
Rootとしてスクリプト全体を実行せずに、ユーザーがGUIを介して一度だけSudoパスワードを入力できるようにするためのアイデアに感謝します。ありがとう。
-A
Sudoオプションを使用すると、パスワードを要求するヘルパープログラムを(Sudo_ASKPASS変数で)指定できます。
パスワードを要求するスクリプト(myaskpass.sh)を作成します。
#!/bin/bash
zenity --password --title=Authentication
次に、スクリプトの先頭に次の行を挿入します。
export Sudo_ASKPASS="/path/to/myaskpass.sh"
Sudo <command>
のすべての出現箇所を次のように置き換えます。
Sudo -A <command>
zenity
の代わりに、任意のパスワード要求プログラムを使用できます。 Sudo_ASKPASSはファイルを指す必要があるため、スクリプト内にカプセル化する必要がありました。したがって、zenity
で必要な--password
オプションでは機能しません。
コマンドラインから実行する場合、またはファイルマネージャーでスクリプトファイルをダブルクリックした後にターミナルで実行を選択した場合、上記は魅力のように機能しますが、 Runを選択するか、Sudo
がパスワードの入力を再度要求するたびに.desktopファイルから起動しようとします。
端末ウィンドウがまったく必要ない場合は、パスワードを変数に保存し、Sudo -S
にパイプできます。セキュリティ上の懸念があるかもしれませんが、かなり安全だと思います( この答え に関するコメントを読んでください)。
スクリプトの先頭に次の行を挿入します。
PASSWD="$(zenity --password --title=Authentication)\n"
Sudo <command>
のすべての出現箇所を次のように置き換えます。
echo -e $PASSWD | Sudo -S <command>
これは、Eric Carvalhoの優れた回答に基づいています。私が遭遇した問題について詳しく説明するために投稿しています。具体的には、これを使用すると、通常のSudoタイムアウト(15分など)が失われます。 50を超えるSudoコマンドを持つ私のスクリプトは、ユーザーのパスワードを50回以上要求するようになりました!
ソリューションのすべての部分の完全な動作例を次に示します。これは、bashスクリプト、Ericが提案した「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=
そして、テストスクリプト自体。これは、このソリューションを使用するときにパスワードを2回要求します。 (通常、デフォルトのSudoタイムアウトのために1回だけ要求されます。)
#!/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回だけ要求し、コマンドパターンSudo -Sp '' <your command here> <<<${Sudo_password}
はファイル内のどこでも複数回使用できます。
# get Sudo password
Sudo_password=$( gksudo --print-pass --message="Provide permission to make system changes: Type your password or press Cancel." -- : 2>/dev/null )
# check for null entry or cancellation
if [[ ${?} != 0 || -z ${Sudo_password} ]]
then
exit 4
fi
if ! Sudo -kSp '' [ 1 ] <<<${Sudo_password} 2>/dev/null
then
exit 4
fi
# command
Sudo -Sp '' gedit "/etc/hosts" <<<${Sudo_password}