web-dev-qa-db-ja.com

GUIのみを使用してユーザーがbashスクリプトのパスワードを入力できるようにする適切な方法(ターミナルは非表示)

ユーザーとの対話専用にkdialogを使用するbashスクリプトを作成しました。 「.desktop」ファイルから起動されるため、ユーザーには端末が表示されません。 GUIアプリのように100%見えます (単なるbashスクリプトですが)。 KDE(Kubuntu 12.04)でのみ実行されます。

私の唯一の問題は、 パスワード入力を安全に処理する と便利です。満足のいく解決策が見つかりません。

このスクリプトは、designedであり、通常のユーザーとして実行し、Sudoコマンドが最初に必要になったときにパスワードを要求するように設計されていました。このようにして、Sudo権限を必要としないほとんどのコマンドは、通常のユーザーとして実行されます。何が起こるか(スクリプトが端末から実行されるとき)は、ユーザーが一度パスワードの入力を求められ、デフォルトのSudoタイムアウトにより、ユーザーに再度プロンプトを表示せずに、追加のSudoコマンドを含むスクリプトが終了します。これは、GUIの背後で実行したときにも動作するようにする方法です。

主な問題は、kdesudoを使用してスクリプトを起動することです。これは標準のGUI方法であり、スクリプト全体がルートユーザーによって実行されることを意味します。そのため、ファイルの所有権はルートユーザーに割り当てられ、パスの~/に依存することはできず、他の多くのものは理想的ではありません。 rootユーザーとしてスクリプト全体を実行することは、非常に不十分なソリューションであり、悪い習慣だと思います。

Rootとしてスクリプト全体を実行せずに、ユーザーがGUIを介して一度だけSudoパスワードを入力できるようにするためのアイデアに感謝します。ありがとう。

7
MountainX

-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>
12
Eric Carvalho

これは、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
0
MountainX

次のスクリプトは、コマンドライン、デスクトップファイル、またはダブルクリックで機能し、パスワードの入力を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}
0
Sadi