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


8

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

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

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

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

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

回答:


14

-Asudoのオプションを使用すると、パスワードの入力を要求されます(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はファイルを指す必要があるため、スクリプトでカプセル化する--password必要がありましたzenity。そのため、で必要なオプションでは機能しません。

上記は、コマンドラインから実行する場合、またはファイルマネージャーでスクリプトファイルをダブルクリックしてから(ターミナルで実行)を選択した場合は魅力のように機能しますが、(実行)を選択するか、.desktopファイルから起動しようsudoとすると、すべてが要求されますもう一度パスワードを入力します。


端末ウィンドウがまったく必要ない場合は、パスワードを変数に格納して、それをにパイプすることができsudo -Sます。おそらくセキュリティ上の懸念があるかもしれませんが、それはかなり安全だと思います(この回答に関するコメントを読んでください)。

スクリプトの最初に次の行を挿入します。

PASSWD="$(zenity --password --title=Authentication)\n"

のすべての出現箇所を次のものに置き換えますsudo <command>

echo -e $PASSWD | sudo -S <command>

ありがとうございました。それはとても興味深いです。ただし、これを使用すると、通常のsudoタイムアウト(15分など)が失われます。50を超えるsudoコマンドを含む私のスクリプトは、ユーザーのパスワードを50回以上要求します。私は少しググってみましたが、解決策が見つかりませんでした。知ってる?
MountainX

更新していただきありがとうございます。あなたが提案する代替案は、セキュリティ上の懸念のために私が除外したものですが、あなたが提供したリンクのコメントを読むことから、おそらく十分に安全だと思います。そしてそれは問題を解決する簡単な方法です。ありがとうございました。
MountainX

私のシステムでのテストはsudo -s(小文字s)ではなくsudo -S(大文字)でなければなりませんs
WinEunuuchs2Unix 2017年

0

これは、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回だけ要求されます。GUIから実行(ファイルマネージャーで.desktopまたは.shをクリック)sudo -Aすると、すべてパスワードが要求されます。私はこれを理解しようとします。
Eric Carvalho 2013年

回答を更新しました。
エリックCarvalho 2013年

エリック...問題の解決策を見つけましたか?
アンソニー

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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.