Creating Users and Groups on Leopard using dscl command

先日のエントリで、Mac OS X 10.5.xにおけるユーザーおよびグループの作成方法を紹介しました。

しかしながら、先日のエントリの手法は、Directory Serviceデータベース情報が納められているプロパティリストを直接改変する多少強引な方法であったと言えます。ローカルドメイン(ローカルシステムと考えてよいでしょう)のDirectory Serviceデータベース情報を扱う場合にのみ有効な方法であるとも言えるでしょう。


今回のエントリでは、dsclコマンドを用いてこれらユーザーおよびグループを作成する方法について記載します。dsclコマンドは、Mac OS X 10.5.xにおけるDirectory Serviceデータベース操作用のコマンドであり、Mac OS X 10.4.xまでのNetInfoデータベースを操作するniから始まるコマンド群(nicl、niload等々。以下ni*コマンドと表記)と同等の関係をなすものです。

今回のエントリでは、以前のエントリで作成した_dovecotユーザーと_dovecotグループを、dsclコマンドを用いて再度作成することを目指します。


ni*コマンドやNetInfoデータベースに馴染みのある方は、dsclコマンドも容易に理解出来るでしょう。例えば-listオプションを指定した以下のコマンドは、ローカルドメインの既存のユーザーを列挙します。

> dscl . -list /Users
_amavisd
_appowner
_appserver
_ard
_atsserver
       :
_xgridagent
_xgridcontroller
daemon
nobody
root


それぞれのノードの情報は、-readオプションを与えることによって問い合わせることが出来ます。以下は以前のエントリでも添付した、_postfixユーザーの情報です。

> dscl . -read /Users/_postfix
AppleMetaNodeLocation: /Local/Default
NFSHomeDirectory: /var/spool/postfix
Password: *
PrimaryGroupID: 27
RealName:
 Postfix Mail Server
RecordName: _postfix postfix
RecordType: dsRecTypeStandard:Users
UniqueID: 27
UserShell: /usr/bin/false

これらの情報は、Property List形式でも出力することが可能です。キーにノードのクラスが付記されるところ等、興味深いですね。

> dscl -plist . -read /Users/_postfix
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>dsAttrTypeStandard:AppleMetaNodeLocation</key>
	<array>
		<string>/Local/Default</string>
	</array>
	<key>dsAttrTypeStandard:NFSHomeDirectory</key>
	<array>
		<string>/var/spool/postfix</string>
	</array>
	<key>dsAttrTypeStandard:Password</key>
	<array>
		<string>*</string>
	</array>
	<key>dsAttrTypeStandard:PrimaryGroupID</key>
	<array>
		<string>27</string>
	</array>
	<key>dsAttrTypeStandard:RealName</key>
	<array>
		<string>Postfix Mail Server</string>
	</array>
	<key>dsAttrTypeStandard:RecordName</key>
	<array>
		<string>_postfix</string>
		<string>postfix</string>
	</array>
	<key>dsAttrTypeStandard:RecordType</key>
	<array>
		<string>dsRecTypeStandard:Users</string>
	</array>
	<key>dsAttrTypeStandard:UniqueID</key>
	<array>
		<string>27</string>
	</array>
	<key>dsAttrTypeStandard:UserShell</key>
	<array>
		<string>/usr/bin/false</string>
	</array>
</dict>
</plist>


プロパティの値を作成する場合は、-createオプションを指定します。値がすでに存在する場合、上書きします。

> sudo dscl . -create /Users/_dovecot realname 'Dovecot Mail Server'

値を複数指定した場合、配列としてプロパティを作成することも出来ます。

> sudo dscl . -create /Users/_dovecot name _dovecot dovecot

プロパティーのキーや値を追加、変更および削除する場合は、管理者権限が必要であることに注意してください。上記の例は、sudoによってroot権限を取得しています。多分に、ローカルドメインのDirectory Service情報の改変をする場合のみ有効でしょう。

また、ldapmodifyコマンドのように、ユーザー名を指定することも可能です。-uオプションにて、管理者権限を有するユーザー名を指定します。この場合、パスワードの入力を促されます。-Pオプションによってパスワードを予め指定することも可能です。

> dscl -u root . -create /Users/_dovecot name _dovecot dovecot
Password: (rootのパスワードを入力)
> dscl -u root -P root_password . -create /Users/_dovecot password '*'


プロパティーのキーや、プロパティーそのものを削除する場合は、-deleteオプションを指定します。

> sudo dscl . -delete /Users/_dovecot GeneratedUID
> sudo dscl . -delete /Groups/_dovecot

プロパティの値が配列を成している場合には、配列の要素を削除することが出来ます。

> sudo dscl . -delete /Users/_dovecot name _dovecot


さて、ここまでの知識を使って、_dovecotユーザーおよび_dovecotグループをdsclコマンドを用いて、作成してみます。


まず、以前のエントリで作成した、_dovecotユーザーおよび_dovecotグループを削除します。

> sudo dscl . -delete /Users/_dovecot
> sudo dscl . -delete /Groups/_dovecot

念のため、dsclコマンドを用いて、_dovecotユーザーおよび_dovecotグループが削除されたか確認します。-listオプションを指定したdsclコマンドの出力をgrepし、dovecotを含んだ行が出力されなければ、削除成功です。

> dscl . -list /Users  | grep dovecot
> dscl . -list /Groups | grep dovecot


続いて、dsclコマンドを用い、_dovecotユーザーを作成します。以前のエントリと同様に、Mac OS X 10.5のインストーラが作成した、_postfixユーザーの情報を参考にしています。_dovecotユーザーおよび_dovecotグループのuidおよびgidはそれぞれ、128とします*1

> sudo dscl . -create /Users/_dovecot gid 128
> sudo dscl . -create /Users/_dovecot home /usr/local/libexec/dovecot
> sudo dscl . -create /Users/_dovecot name _dovecot dovecot
> sudo dscl . -create /Users/_dovecot passwd '*'
> sudo dscl . -create /Users/_dovecot realname 'Dovecot Mail Server'
> sudo dscl . -create /Users/_dovecot shell /usr/bin/false
> sudo dscl . -create /Users/_dovecot uid 128

ここまでの段階で、_dovecotユーザーの情報を確認してみましょう。以下はdsclコマンドに-readオプションを指定した例です。

> dscl . -read /Users/_dovecot
AppleMetaNodeLocation: /Local/Default
GeneratedUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
NFSHomeDirectory: /usr/local/libexec/dovecot
Password: *
PrimaryGroupID: 128
RealName:
 Dovecot Mail Server
RecordName: _dovecot dovecot
RecordType: dsRecTypeStandard:Users
UniqueID: 128
UserShell: /usr/bin/false

ローカルドメインのDirectory Servicesデータベースに格納されたプロパティリストの実態は以下のようになりました。

> sudo cat /var/db/dslocal/nodes/Default/users/_dovecot.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>generateduid</key>
	<array>
		<string>XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX</string>
	</array>
	<key>gid</key>
	<array>
		<string>128</string>
	</array>
	<key>home</key>
	<array>
		<string>/usr/local/libexec/dovecot</string>
	</array>
	<key>name</key>
	<array>
		<string>_dovecot</string>
		<string>dovecot</string>
	</array>
	<key>passwd</key>
	<array>
		<string>*</string>
	</array>
	<key>realname</key>
	<array>
		<string>Dovecot Mail Server</string>
	</array>
	<key>shell</key>
	<array>
		<string>/usr/bin/false</string>
	</array>
	<key>uid</key>
	<array>
		<string>128</string>
	</array>
</dict>
</plist>

面白いことに、明示的に生成していないgenerateduidプロパティが追加されています。確認したところ、dsclコマンドを用いてノードを作成した直後、上記の例ではgidプロパティを作成した時点で、generateduid、gidおよびnameが作成されていました。


_postfixユーザーにはgenerateduidプロパティが存在しないので、削除します。

> sudo dscl . -delete /Users/_dovecot GeneratedUID


今一度dsclコマンドを用いて、プロパティが削除されたか否かを確認します。

> dscl . -read /Users/_dovecot
AppleMetaNodeLocation: /Local/Default
NFSHomeDirectory: /usr/local/libexec/dovecot
Password: *
PrimaryGroupID: 128
RealName:
 Dovecot Mail Server
RecordName: _dovecot dovecot
RecordType: dsRecTypeStandard:Users
UniqueID: 128
UserShell: /usr/bin/false


続いて、dsclコマンドを用い、_dovecotグループを作成します。_dovecotユーザーを作成した際と同様、Mac OS X 10.5のインストーラが作成した_postfixグループの情報を参考にします。

> sudo dscl . -create /Groups/_dovecot gid 128
> sudo dscl . -create /Groups/_dovecot name _dovecot dovecot
> sudo dscl . -create /Groups/_dovecot passwd '*'
> sudo dscl . -create /Groups/_dovecot realname 'Dovecot Mail Server'

ここまでの段階で、_dovecotユーザーの情報を確認してみましょう。

> dscl . -read /Groups/_dovecot
AppleMetaNodeLocation: /Local/Default
GeneratedUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Password: *
PrimaryGroupID: 128
RealName:
 Dovecot Mail Server
RecordName: _dovecot dovecot
RecordType: dsRecTypeStandard:Groups

以下はプロパティリストの実態になります。

> sudo cat /var/db/dslocal/nodes/Default/users/_dovecot.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>generateduid</key>
	<array>
		<string>B41AB216-B26E-4FEF-97E7-45F812F22F65</string>
	</array>
	<key>gid</key>
	<array>
		<string>128</string>
	</array>
	<key>name</key>
	<array>
		<string>_dovecot</string>
		<string>dovecot</string>
	</array>
	<key>passwd</key>
	<array>
		<string>*</string>
	</array>
	<key>realname</key>
	<array>
		<string>Dovecot Mail Server</string>
	</array>
</dict>
</plist>

以上でdsclコマンドを用いた_dovecotユーザーおよび_dovecotグループの作成は完了です。_postfixグループのプロパティに含まれるsmb_sidは生成されませんでしたが、今回はよしとしました。

まとめ

  • NetInfoは、Mac OS X 10.5.x Leopardにて、Directory Serviceとして置き換えられた
  • dsclコマンドを用いることによって、安全にDirectory Serviceデータベース情報を操作することが出来る
  • dsclコマンドを用いてユーザーおよびグループのノードを作成した場合、GeneratedUIDが自動的に作成される


先日のエントリでは、プロパティリストを直接改変した弊害か、システムのリブートが必要な場合もありましたが、dsclコマンドを用いてDirectory Serviceデータベース情報を操作した場合、システムに即時に反映されますし、なにより標準の手法を用いているという安心感があります。また、ni*コマンドを用いた場合に比べ、随分さくさくとプロパティを変更出来るなぁ、という印象を持ちました。

次のエントリではdvipngのビルドに関して、もしくは、VNC(Mac OS XではScreen Sharingと記載したほうが一般的なのでしょうか)に関して記載したいと思います。

*1:以前のエントリでも記載しましたが、この値に根拠はありません