今日まで完全に機能していたこのスクリプトはありました。データベースからユーザーを作成するとランダムな結果が得られます
私はLinuxユーザーの作成を自動化しようとしています。私はこれを好きです:
my $sql = 'SELECT id FROM users WHERE updated = 0';
my $sth = $dbh->prepare($sql);
$sth->execute();
#
while (my @row = $sth->fetchrow_array) {
#print $row[0],"\n";
my @chars = ('0' .. '9', 'A' .. 'F');
my $len = 12;
my $hash;
while ($len--) {
$hash .= $chars[ rand @chars ]
}
system("/usr/sbin/useradd -g mygroup -d /home/newusers/$hash -s /sbin/nologin $hash");
system("echo $hash:$hash | /usr/sbin/chpasswd");
my $sql_hash_update =
"UPDATE users SET hash = '"
. $hash
. "', updated = 1 WHERE id = '"
. $row[0]
. "'";
my $sth_hash_update = $dbh->prepare($sql_hash_update);
$sth_hash_update->execute();
}
これは完璧に1週間働いています。これは、1分ごとにcrontabで実行されます。
これでディレクトリを上書きし、所有者を何らかの種類の乱数として追加します。
フォルダが作成されAEB7F3BDED52は(存在)::/ホーム/ AEB7F3BDED52フォルダの
所有者:652350688667は(ない
例:
は一度実行:
ユーザーが作成しました実際にユーザとして存在する)
2回実行:作成
ユーザー:AD1B583F6062(存在)を作成
フォルダ:フォルダの/ホーム/ AD1B583F6062
所有者:1013(存在しない)
そして、そうです。このランダムな挙動は以前には起こりませんでした。私は干渉がないことを確認するために他のすべてのスクリプトを停止しました。それはここでしか起こらない。結果のランダム性のために私は無知です。どんな助けもありがとう。
EDIT:スクリプトをリセットした後、再び動作します。
まず、SQLのプレースホルダを使用し、ループの外側で 'prepare'を移動します。ループの中で '@ chars'を字句的にする必要もありません。変化しません。次に、 'system'呼び出しを' print'で置き換えて、何が起きているのかを見てください。 – simbabque
@simbabque: '@ chars'はループの外に出ることができますが、' $ len'ではありません。 – Borodin
@Borodinはい、私はしばらく忘れていました。しかし、これは '$ hash = $ chars [rand @chars] for 1 .. $ len'に書き換えられ、変更されません。 – simbabque