システム管理
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

ユーザパスワードの期限切れの通知

Bouze
時折のコントリビューター

ユーザパスワードの期限切れの通知

HP-UX 11.0 を使用しています。ユーザパスワードの有効期限を設定していますが、期限切れの警告をユーザにメールで通知する方法があるかどうか、ある場合には方法を知りたいのですが。

どなたかよい方法をご存じないですか?
2 件の返信
hazelwood
信頼あるコントリビューター

ユーザパスワードの期限切れの通知

OSの標準機能では、そのような設定はないと思います。

cronで定期的にチェックして、メール送信するしかないのではないでしょうか?

/etc/passwdや/tcbに保存されている有効期限を日付に変換するのが一苦労だとは思いますが。

他には、少々強引な方法ですが、passwdコマンドのwarpperスクリプトを作って、メールを送信するスクリプトをxx日後に実行するよう、atで登録するという方法もあるかと思います。

nadachi
レギュラーアドバイザー

ユーザパスワードの期限切れの通知

man 4 passwd には、

期間を表す文字列の最初の文字 M は、パスワードの有効な期間を週で表した

ときの最大値です。パスワードの有効期限を過ぎたユーザーがログインしよう

とすると、新しいパスワードを設定するように求められます。次の文字 m

は、パスワードが変更できるようになるまでに経過しなければならない期間を

週で表したときの最小値です。残りの2文字は、パスワードが最後に変更され

た週を定義します (ヌル文字列はゼロと等価です)。 M と m は、0から63の範

囲の値で、上に説明のある64の文字セットに相当します。

とありました。例えば、"o0dQ" みたいな文字列は、

getpwent()を使えば読めますが、この解読は大変でした。先頭の1文字は文字->数字の変換規則(これも man 4 passwd にある)をすればよいのですが、

3番目4番目の文字が"最後にパスワードを変更した週を表す" はず。3番目4番目を数字 (0..63) にして

3番目 * 64 + 4番目を計算したら意味のない大きな数になってしまいました。 4番目 * 64 + 3番目で

妥当な週番号に収まりました。で、

-------

#include

#include

#include

int

decode(ch)

int ch;

{

if (((int)'.' <= ch) && (ch <= (int)'9'))

return( (int)( ch - (int)'.') );

if (((int)'A' <= ch) && (ch <= (int)'Z'))

return( (int)( ch - (int)'A' + 12 ) );

if (((int)'a' <= ch) && (ch <= (int)'z'))

return( (int)(ch - (int)'a' + 38 ) );

return(-1);

}

main(argc, argv)

int argc;

char *argv[];

{

int nokori_w;

struct passwd *p;

char age;

time_t current_time;

int thisweek, age_max, last_modified;

nokori_w = atoi(argv);

current_time = time((time_t *)NULL);

thisweek = current_time / ( 7 * 24 * 60 * 60 );

setpwent();

while (( p = getpwent() ) != (struct passwd *)NULL) {

if (strlen(p->pw_age) != 0) {

strcpy(age, p->pw_age);

age_max = decode(age);

last_modified = 64 * decode(age)

+ decode(age);

if ((last_modified + age_max) < thisweek)

printf("passwd for user:%s has been expired\n",

p->pw_name);

else {

if ((last_modified + age_max)

< thisweek + nokori_w)

printf("passwd for name:%s will expire\n",

p->pw_name);

}

}

}

endpwent();

}

-------

こんな風にしてやれば、週単位ですが、passwdの

変更期限の切れたユーザーと、猶予期間が迫っているユーザーを/etc/passwdからみつけられそうです。

(もし、trusted systemにしている場合には、getprpwent()を使わないといけないはず。)

 これを元に、該当ユーザーにmailを送るような

cron ジョブを、例えば月曜日に実行するように仕掛けたらいかが?

(上のプログラムで、週の計算はあんまり厳密なものではありません。 "パスワードは木曜日の 00:00 GMT を週の始まりとみなします。" とありますから、

cronジョブはむしろ金曜の朝の実行が適当かも。)