デーモン(Oracle Grid Engine)をマシンに手動でインストールしようとしていますが、分離されたアカウントで実行したいと思います。ディレクトリサービスを使用して、OS Xのローカルマシンに「システム」アカウントを追加するための推奨される方法は何ですか?それらの多くは/ etc/passwd(_www
、_dovecot
など)が、そのファイルの上部にあるコメントは、シングルユーザーモード以外では使用されないことを示しています。
私は10.6で実行しており、特別なネットワークアカウント管理は必要ありません。私は、他のほぼすべてのUnixライクなOSのuseradd
に相当する単純なものを望んでいます。
dsclは、探しているコマンドです。
par からスクリプトを試したところ、いくつかの問題が見つかりました。そこで、特定のユーザーIDとOS X Mavericks(10.9)用に変更しました。
Mavericksの下のユーザーアカウントに追加されたいくつかの無関係なレコード(PasswordPolicyOptionsレコードとAuthenticationAuthorityレコード)があり、他の組み込みサービスユーザーアカウント(_wwwなど)を正しく模倣するために削除する必要があることがわかりました。
また、パスワードとRealNameレコードをグループアカウントに追加しました。
WSGIサービスアカウント専用のカスタムの1回限りのスクリプトを作成しました。更新されたスクリプトは次のとおりです。
#! /bin/bash
#
# Check that we are superuser (i.e. $(id -u) is zero)
if (( $(id -u) ))
then
echo "This script needs to run as root"
exit 1
fi
username_=wsgi
uid_=240
realname_="WSGI Daemon"
dscl . -create /Groups/_$username_
dscl . -create /Groups/_$username_ PrimaryGroupID $uid_
dscl . -create /Groups/_$username_ RecordName _$username_ $username_
dscl . -create /Groups/_$username_ RealName $realname_
dscl . -create /Groups/_$username_ Password \*
dscl . -create /Users/_$username_
dscl . -create /Users/_$username_ NFSHomeDirectory /xpt/local/Apache2/wsgi/api
dscl . -create /Users/_$username_ Password \*
dscl . -create /Users/_$username_ PrimaryGroupID $uid_
dscl . -create /Users/_$username_ RealName $realname_
dscl . -create /Users/_$username_ RecordName _$username_ $username_
dscl . -create /Users/_$username_ UniqueID $uid_
dscl . -create /Users/_$username_ UserShell /usr/bin/false
dscl . -delete /Users/_$username_ PasswordPolicyOptions
dscl . -delete /Users/_$username_ AuthenticationAuthority
このスクリプトを実行した後、/ etc/passwdファイルと/ etc/groupsファイルは更新されないことに注意してください。再起動時に更新されると思います。
編集:OS X Mavericks用に2014年1月9日に更新(Daveからの提案、ありがとう!)
これを行うためのbashスクリプトを作成しました。同じ未使用のgidを持つ、500(Mac OS Xではデーモンアカウントのuid)以下の最初の未使用のuidを使用します。
スクリプトをadd_system_user.sh
という名前のファイルに保存し、chmod 755 add_system_user.sh
で実行可能に設定します。
次に、parと呼ばれるデーモン/システムユーザーを追加するとします。このスクリプトは次のように実行します。
Sudo add_system_user.sh par
そして、par
(要求した名前)にエイリアスされ、一致するuidとgid(499など)を持つ_par
というシステムユーザーを取得します。
スクリプトは次のとおりです。
#!/bin/bash
if (( $(id -u) )) ; then
echo "This script needs to run as root"
exit 1
fi
if [[ -z "$1" ]] ; then
echo "Usage: $(basename $0) [username] [realname (optional)]"
exit 1
fi
username=$1
realname="${2:-$username}"
echo "Adding daemon user $username with real name \"$realname\""
for (( uid = 500;; --uid )) ; do
if ! id -u $uid &>/dev/null; then
if ! dscl /Local/Default -ls Groups gid | grep -q [^0-9]$uid\$ ; then
dscl /Local/Default -create Groups/_$username
dscl /Local/Default -create Groups/_$username Password \*
dscl /Local/Default -create Groups/_$username PrimaryGroupID $uid
dscl /Local/Default -create Groups/_$username RealName "$realname"
dscl /Local/Default -create Groups/_$username RecordName _$username $username
dscl /Local/Default -create Users/_$username
dscl /Local/Default -create Users/_$username NFSHomeDirectory /var/empty
dscl /Local/Default -create Users/_$username Password \*
dscl /Local/Default -create Users/_$username PrimaryGroupID $uid
dscl /Local/Default -create Users/_$username RealName "$realname"
dscl /Local/Default -create Users/_$username RecordName _$username $username
dscl /Local/Default -create Users/_$username UniqueID $uid
dscl /Local/Default -create Users/_$username UserShell /usr/bin/false
dscl /Local/Default -delete /Users/_$username AuthenticationAuthority
dscl /Local/Default -delete /Users/_$username PasswordPolicyOptions
break
fi
fi
done
echo -e "Created system user $username (uid/gid $uid):\n"
dscl /Local/Default -read Users/_$username
echo -e "\nYou can undo the creation of this user by issuing the following commands:\n"
echo "Sudo dscl /Local/Default -delete Users/_$username"
echo "Sudo dscl /Local/Default -delete Groups/_$username"
次に、Daveのスクリプトのバージョンを示します。これは、作成する前にユーザー/グループが存在するかどうかもチェックします。
#!/ bin/sh #Linux adduserコマンド #と同様のサービスアカウントユーザーを作成して、既存のユーザーとIDを表示しますtry: #dscl。 -readall/Users UniqueID | sort -nk 2 die(){ echo>&2 "$ @" exit 1 } echo "使用方法:Sudo $ 0 username uid realname" echo "ユーザー名はアンダースコアで始めてはいけません(スクリプトによって追加されます)" echo "ユーザーが存在せず、1000の範囲の空きID番号を取得します " echo"例:dscl。-readall/ Users UniqueID | sort -nk 2 " echo" " [ .____。 「このスクリプトはrootとして実行する必要があります」 ["$#" -eq 3] || die "エラー:3つの引数が必要です:ユーザー名、uid、実名" username _ = $ 1 uid _ = $ 2 実名_ = $ 3 nfs_homedir = "/var/tmp" user_Shell="/usr/bin/false" echo"ユーザー/グループが存在するかどうかを確認しています:\ c " check_uuid = `dscl。 -search/Users UniqueID $ uid _` check_upgid = `dscl。 -search/Users PrimaryGroupID $ uid _` check_urn = `dscl。 -search/Users RecordName _ $ username_` check_grn = `dscl。 -search/Groups RecordName _ $ username_` [$ {#check_uuid} = 0] || die "failed!\ nERROR:Non-unique User UniqueID:\ n\n`dscl .-read/Users/_ $ username_ RecordName PrimaryGroupID RealName`\n\n既存のユーザー/ IDを表示するには:dscl。-readall/ Users UniqueID | sort -nk 2 " [$ {#check_upgid} = 0] || die "failed!\ nエラー:非一意ユーザーPrimaryGroupID\n \n`dscl。-read/ Users/_ $ username_ RecordName PrimaryGroupID RealName`\n\n既存のユーザー/ IDを表示するには:dscl。-readall/ Users UniqueID | sort -nk 2 " [$ {#check_urn} = 0] || 「失敗しました!\ nエラー:一意でないユーザーRecordName\n\n`dscl。-read/Users/_ $ username_ RecordName PrimaryGroupID RealName`\n\n既存のユーザー/ IDを表示するには、次のコマンドを実行します:dscl。-readall/Users UniqueID | sort -nk 2 " [$ {#check_grn} = 0] || die "failed!\ nエラー:非一意のグループRecordName\n \n`dscl。-read/ Groups/_ $ username_ RecordName PrimaryGroupID RealName`\n\n既存のユーザー/ IDを表示するには:dscl。-readall/ Users UniqueID | sort -nk 2 " echo"準備完了です! " #echo"続行(y/n)? " #read input _ #["$ input_" = "y"] ||死ぬ "あなたが望むように..." echo "ユーザーの作成:\ c" dscl。 -create /Groups/_$username_ dscl。 -/ Groups/_ $ username_ PrimaryGroupID $ uid _ dsclを作成します。 -create/Groups/_ $ username_ RecordName _ $ username_ $ username _ dscl。 -/ Groups/_ $ username_ RealName "$ realname _" dsclを作成します。 -create/Groups/_ $ username_ Password\* dscl。 -/ Users/_ $ username _ dsclを作成します。 -/ Users/_ $ username_ NFSHomeDirectory $ nfs_homedir dsclを作成します。 -create/Users/_ $ username_ Password\* dscl。 -create/Users/_ $ username_ PrimaryGroupID $ uid _ dscl。 -create/Users/_ $ username_ RealName "$ realname _" dscl。 -create/Users/_ $ username_ RecordName _ $ username_ $ username _ dscl。 -create/Users/_ $ username_ UniqueID $ uid _ dscl。 -/ Users/_ $ username_ UserShell $ user_Shell dsclを作成します。 -delete/Users/_ $ username_ PasswordPolicyOptions dscl。 -/ Users/_ $ username_ AuthenticationAuthority echo "done!" を削除します。
およびユーザーを削除するスクリプト:
#!/ bin/sh #Linux userdelコマンドと同様にサービスユーザーを削除しますが、ファイルはそのまま残します #既存のユーザーとIDを表示するには: #dscl。 -readall/Users UniqueID | sort -nk 2 die(){ echo>&2 "$ @" exit 1 } #スーパーユーザーであることを確認します(つまり、$(id -u)がゼロです) [`id -u` -eq 0] || die "このスクリプトはrootとして実行する必要があります" ["$#" -eq 1] || 「エラー:ユーザー名引数が必要です!」 username _ = $ 1 dscl -/ Users/$ username _ dsclを削除します。 -delete/Groups/$ username_ echo "done!"
これは、dsclを使用してユーザーアカウントを作成する方法を説明する記事です。