web-dev-qa-db-ja.com

スクリプト内でユーザーのパスワードを変更しても機能しない

理由により、スクリプトを使用してユーザーのパスワードをX分ごとにランダムなパスワードに変更したいと考えています。これはdebianマシンであり、次のスクリプトはルートのcrontabの@rebootを介して開始され、スクリプトが実行されています。 X分ごとに新しいパスワードがスクリプトで指定されたファイルに書き込まれますが、パスワードは変更されません。

#!/bin/bash
# change user's password to a random one on boot and every five minutes

while : ; do
    npasswd=$(pwgen 8 1)
    echo "$npasswd" > /root/current-user-passwd.txt
    usermod --password $(openssl passwd -1 "$npasswd") user
#   echo "$npasswd" | passwd user
#   usermod -p $(Perl -e "print crypt("$npasswd","Q4")") user
    sleep 300
done

3つの方法(他の2つは現在コメントアウトされています)をそれぞれ試しましたが、どれも機能しません。ただし、entireスクリプトをコピーしてターミナルに貼り付けるだけで実行すると、問題なく動作します。 cronで起動した場合、スクリプトでは機能しません。

ここで何が起こっているのか誰か知っていますか?
ところでecho -nも試しましたが、同じ結果が得られました。また、スクリプトの$npasswdを修正済みの値に設定して、同じ結果をテストしました。

明確にする必要があります:理由を説明する答えを本当に探していますこれは手動で機能しますが、スクリプトでは機能せず、パスワードを変更する別の方法ではありません。これらのメソッドは機能します。ただし、スクリプトがcronによって開始された場合は除きます。

上にset -o errexit -o nounset -o xtraceを付けたスクリプトの出力:

+ :
++ pwgen 8 1
+ npasswd=eiZeed5u
+ echo eiZeed5u
++ openssl passwd -1 eiZeed5u
+ usermod --password '$1$EYRCYJXm$5XkrVNxdrYRzxBmcRwuXm0' user
+ sleep 300

Cronの@rebootを介して起動した場合の上記の出力:

+ :
+ pwgen 8 1
+ npasswd=aizof5Ka
+ echo aizof5Ka
+ openssl passwd -1 aizof5Ka
+ usermod --password $1$KFrgibYH$e1dMUeF2AzTtSPExBjbXo1 user
/root/change-user-passwd.sh: 8: /root/change-user-passwd.sh: usermod: not found

@ l0b に感謝します。

1
confetti

によると: https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-Shell-script

echo "$npasswd" | passwd --stdin user

または

echo "user:$npasswd" | chpasswd

あなたのためになるでしょう.

3
minish