質問

私の質問は簡単です。

ファイルのコンテンツを表示せずにLinuxのHTPassWDファイルに保存されているパスワードをユーザーに変更できるようにする方法や、ユーザーが他のパスワードを変更できるようにする方法は?

SSHとSpecialEyが設計したユーザーを使用してそのジョブを行うためにスクリプトを作成しようとしましたが、それは今ではリードしています。

助けてください。 Debianサーバー「Lenny」を使用しています。

役に立ちましたか?

解決

アパッチ htpasswd ファイルはシャドウ機能をサポートしていません。そのため、パスワードファイルから遠ざけるために、ユーザーがWebサーバーにアクセスするのを防ぐ必要があります。したがって、唯一のソリューションは、SSHベースのアプローチまたはその他のリモートソリューションです。次の説明では、ユーザーが古いパスワードを知っている場合にのみ、パスワードを変更するためにSSHコマンドスクリプトを書き込む方法について説明します。主な問題は、Apacheがパスワードを確認するためのコマンドラインツールを提供しないことです。 htpasswd ファイル。しかし、これは手作業で行うことができます。

次の説明は、Webサーバーユーザーが www-data そして、ユーザーのホームディレクトリはそうです /var/www.

まず、Webサーバーユーザーが作成できるHTPassWDファイルを作成する必要があります。

# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd

次に、すべてのユーザーのキーをに追加する必要があります authorized_keys Webサーバーユーザーのファイル。各行を次のようにプレフィックスする必要があります command オプション。

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host

ユーザーがキーに接続するたびに .htpasswd.sh 実行されます。ユーザーには、Webサーバーへのシェルアクセスがありません。

これは、パスワードを変更するスクリプトです。

#! /bin/bash

HTPASSWD=/var/www/.htpasswd

die () { echo "$*" >&2 ; exit 1 ; }

read -p 'Enter user name: ' USER
read -s -p 'Old password: ' OLDPW ; echo
read -s -p 'New password: ' NEWPW0 ; echo
read -s -p 'Re-type new password: ' NEWPW1 ; echo

if LINE=$(grep ^"$USER": "$HTPASSWD")
then
    echo "$LINE" | sed 's/.*:\(..\)\(.\+\)/\1 \2/' | { 
        read SALT CRYPT
        if [[ "$SALT$CRYPT" = $(echo "$OLDPW" | mkpasswd -sS "$SALT") ]] ; then
            if [ "$NEWPW0" != "$NEWPW1" ] ; then
                die "Password verification error!"
            fi
            PWS=$(grep -v ^"$USER:" "$HTPASSWD")
            {
                echo "$PWS"
                echo -n "$USER:"
                echo "$NEWPW0" | mkpasswd -s
            } > "$HTPASSWD"
            echo "Updating password for user $USER."
        else
            die "Password verification error!"
        fi
    }
else
    die "Password verification error!"
fi

トリッキーな部分は、パスワード検証です。古い塩を読み、古い塩で古いパスワードを暗号化することによって行われます。結果は、の古い暗号化されたパスワードと比較されます htpasswd ファイル。

これで、ユーザーはパスワードを変更するためにWebサーバーに接続できます。

$ ssh www-data@localhost
Enter user name: szi
Old password: 
New password: 
Re-type new password: 
Updating password for user szi.
Connection to localhost closed.

誰もが自分のパスワードのみを変更することができ、他のユーザーの暗号化されたパスワードには誰もアクセスできません。このソリューションには、オリジナルの使用に関する追加の利点があります htpasswd パスワードがコマンドライン引数として使用されないため、シェルスクリプトのプログラム。これは不可能です htpasswd, 、stdinのようにパスワードを読み取れないので mkpasswd.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top