2009-09-22 12 views
5

ローカルのUNIXユーザが渡したユーザ名とパスワードが正しいかどうかをシェルスクリプトでチェックしたいと思います。これを行う最も簡単な方法は何ですか?シェルスクリプトでunixのユーザ名とパスワードを確認する

グーグルで見つかったことは、 'expect'と 'su'を使用していて、 'su'が成功したかどうかどうか調べていたことだけでした。

+0

達成しようとしていることとスクリプトが行っていることの詳細を確認することができます。 –

答えて

4

これは私の問題を解決するために使用したスクリプトです。私は最初、Aaron Digullaによって釣り上げられた小さなc-programmを書こうとしましたが、それは非常に困難でした。

おそらく、このスクリプトは他の誰かにとって役に立ちます。

#!/bin/bash 
# 
# login.sh $USERNAME $PASSWORD 

#this script doesn't work if it is run as root, since then we don't have to specify a pw for 'su' 
if [ $(id -u) -eq 0 ]; then 
     echo "This script can't be run as root." 1>&2 
     exit 1 
fi 

if [ ! $# -eq 2 ]; then 
     echo "Wrong Number of Arguments (expected 2, got $#)" 1>&2 
     exit 1 
fi 

USERNAME=$1 
PASSWORD=$2 

# Setting the language to English for the expected "Password:" string, see http://askubuntu.com/a/264709/18014 
export LC_ALL=C 

#since we use expect inside a bash-script, we have to escape tcl-$. 
expect << EOF 
spawn su $USERNAME -c "exit" 
expect "Password:" 
send "$PASSWORD\r" 
#expect eof 

set wait_result [wait] 

# check if it is an OS error or a return code from our command 
# index 2 should be -1 for OS erro, 0 for command return code 
if {[lindex \$wait_result 2] == 0} { 
     exit [lindex \$wait_result 3] 
} 
else { 
     exit 1 
} 
EOF 
+0

スクリプトの先頭に 'export LC_ALL = C'を指定すると、デフォルト言語が異なるシステムで動作するようになります。文字列' Password: 'を期待しているので、このスクリプトの実行言語を英語に設定します。 http://askubuntu.com/a/264709/18014を参照してください。 –

9

ユーザ名とパスワードは/etc/shadowファイルに書き込まれています。 ちょうどそこからユーザーとパスワードのハッシュ(sedが役に立ちます)を取得し、自分のパスワードをハッシュして確認します。

ハッシュを生成するためにmkpasswdを使用します。 あなたのバージョンが使用している塩を調べてください。最新の影がとてもsha-512を使用している:

mkpasswd -m sha-512 password salt 

マンページがあり、多くのお手伝いをすることができます。

簡単には、phpとpam-autモジュールを使用することです。あなたはグループアクセスのpwdユーザー上でphieを調べることができます。

+1

このアプローチの実装の詳細:http://ubuntuforums.org/archive/index.php/t-1232715.html –

+0

ああ、いいですね。私はこのアプローチを数ヶ月前に自分自身で考え出すのに6時間を費やしています。このサイトは多くの助けになりました。 私はウェブ認証のためにこれが必要でしたので、最終的にphpのauth-pamモジュールを使用しました – Hayt

+0

PHPはどこですか? o – knittl

0

部分的にはユーザ名を確認することです。/ etcのpasswd/shadowファイルで定義されていますか? 次にsaltでパスワードMD5を計算します。ユーザーパスワードがSSL(または少なくとも一部のサーバーターミナルサービス)経由で送信されている場合。

あなたは実際に何が必要なのか分からないので、そのちょっとしたヒント。 "su"は主に認証目的のためです。

あなたが見るかもしれない他のトピックはkerberos/LDAPサービスですが、それは難題です。

+0

これはMD5ハッシュではなく、SHAです。 – bua

4

Linuxでは、pam_authenticate()という小さなCプログラムを書く必要があります。呼び出しがPAM_SUCCESSを返す場合、ログインとパスワードは正しいです。

関連する問題