与えられたユーザー名が現在のシステムに存在するかどうか、どうやってシェルスクリプトで見つけることができますか?
/etc/passwd
と/etc/shadow
は不完全です。 OS Xのディレクトリサービス、または同様にActive Directoryと統合されたLinuxを検討してください。
そのために使用される最も基本的なツールの1つはおそらくid
です。
#!/bin/bash
if id "$1" >/dev/null 2>&1; then
echo "user exists"
else
echo "user does not exist"
fi
どれが生成されます
$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
getent
このコマンドは、/ etcファイルと、LDAP、AD、NIS /イエローページ、DNSなどのさまざまなリモートサービスによってバックアップできるデータベースのエントリを収集するように設計されています。
ユーザー名がパスワードネームサービスの1つによって認識されているかどうかを判断するには、単に実行します。
getent passwd username
これは、OSや実装によっては、グループ、ホスト、その他にも働きます。
finger
finger -m <username>
の出力を解析します。残念ながら、ユーザーが見つからなかった場合はエラーコードは表示されませんが、見つからなかった場合はエラー出力が書き込まれます。これまでのところ何の問題もありません。
finger -ms <username> 2>&1 1>/dev/null | wc -l
ユーザーが見つかった場合は0
を出力します(エラー出力がないため)。それ以外の場合は大きい数字を出力します。
chown
実行します(任意のユーザーとして、驚くほど):
T=$( mktemp -t foo.XXX ) ; chown <username> $T
root
として失敗した場合、アカウント名は無効です。
非root
ユーザーとして失敗した場合、ローカライズされた可能性のある出力を解析して操作が許可されていないまたは無効なユーザー(または同等のもの)を探します。確実にこれを行うには、事前にLANG
を設定してください。
/etc/passwd
などに頼りたいと思うでしょう(例えば、Shadowベースのシステムでは/etc/shadow
、話題にならないサイドノートでは、/etc/master.passwd
または他のそのようなファイルを使うかもしれません)。
/etc/passwd
は通常、ユーザーが存在するかどうかについての絶対的な権威のある決定として扱われます。このページで説明されている他の方法のいずれかを使用し、それらの他の方法が既存のユーザを指しているが/etc/passwd
が指していない場合、そのユーザは最も一般的な標準の定義でシステムに適切に存在しないと言えます。そのソフトウェアはおそらく信頼しているでしょう。
そうは言っても、私は別の方法で投げかけて、使用できる他のオプションをいくつか追加します。
ls -l /home | grep ^customUserName$<BR> echo $?
明らかに、 "customuserName"をチェックしたいユーザーの名前に置き換えてください。システムがそれを使用している場合は、/ homeを/ usersに置き換えます。特定のユーザーのホームディレクトリが作成されていない場合(つまり、ユーザーのテキスト行を/ etc/passwdにインポートした場合)、ホームディレクトリが作成されていない場合は、/ etc/passwd内のすべてのユーザーが検出されないことがあります。人がログインしない限り/できない限り作られる。