エンジニアブログ

エンジニアブログ

OSX でコンソールからユーザーを作成する

logo2.gif やまかわ 2011年01月31日

こんにちは山川です。
今日はOSXのコネタです。


最近私はVirtualBox上のLinuxで開発環境を構築し、開発ディレクトリをNFSでanonymousでexportしてMacからmountした上で、Carbon Emacs+cperl-mode他諸々適当に拾ってきた.emacs上で開発する、というスタイルにしています。
これはかなり快適で満足度が高い感じなのですが一点問題があり、OSXからmount先をlsするとファイルの所有者が65534:65534という風に素のGIDとUIDが見えてしまい、なんとなくキモいことになっていました。

 -rwxr-xr-x 1 65534 65534 405 1 31 11:11 mt-add-notify.cgi
 -rwxr-xr-x 1 65534 65534 394 1 31 11:11 mt-atom.cgi
 -rwxr-xr-x 1 65534 65534 20004 1 31 11:11 mt-check.cgi
 -rwxr-xr-x 1 65534 65534 403 1 31 11:11 mt-comments.cgi
 -rw-r--r-- 1 65534 65534 1647 1 31 11:11 mt-config.cgi-original

実用上問題ないのでしばらく放置していたのですが、だんだん気になってきたのでここらでnfsnobodyを作ってみようと思ったもののどうやらadduserとかそのたぐいのコマンドはOSXには存在しないようです。

とりあえずまあUnix的に考えて/etc/passwdを見てみると、標準ではもちろんnfsnobodyユーザーは居ません。また以下のような文面が頭に入っています。

## 
# User Database 
# 
# Note that this file is consulted directly only when the system is running 
# in single-user mode. At other times this information is provided by 
# Open Directory.
# 
# This file will not be consulted for authentication unless the BSD local node 
# is enabled via /Applications/Utilities/Directory Utility.app 
# 
# See the DirectoryService(8) man page for additional information about 
# Open Directory. 
##

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false


なんか/etc/passwdは使われないみたいです。んーそういえばOpen Directoryなるものでユーザー管理されてたなーというのをここで思い出します。で、ここで書かれている /Applications/Utilities/Directory Utility.appを実行しようと試みてみますがそんなものは存在しませんといわれます。ということでググってServer Faultのトピックを拾ってみたところ、dsclというやつでいけるみたいです。ふむふむ。というわけで以下を実行してみます。

 


sudo dscl . -create /Users/nfsnobody
sudo dscl . -create /Users/nfsnobody UserShell /sbin/nologin
sudo dscl . -create /Users/nfsnobody RealName "NFS anonymous user"
sudo dscl . -create /Users/nfsnobody UniqueID 65534
sudo dscl . -create /Users/nfsnobody PrimaryGroupID 65534
sudo dscl . -create /Groups/nfsnobody
sudo dscl . -create /Groups/nfsnobody PrimaryGroupID 65534
sudo dscl . -create /Groups/nfsnobody RealName "NFS anonymous group."


sudo は必要かどうかわかりませんがとりあえずつけましたが、どうやらこれで問題なくlsの結果でUIDのところがnfsnobodyに見えるようになりました。

 

-rwxr-xr-x 1 nfsnobody nfsnobody 405 1 31 11:11 mt-add-notify.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 394 1 31 11:11 mt-atom.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 20004 1 31 11:11 mt-check.cgi
-rwxr-xr-x 1 nfsnobody nfsnobody 403 1 31 11:11 mt-comments.cgi
-rw-r--r-- 1 nfsnobody nfsnobody 1647 1 31 11:11 mt-config.cgi-original


ちなみに以下のような感じで現在のOpenDirecotryのエントリを見ることができます。

 

# ユーザー一覧
$ dscl . -list /Users
# ユーザー情報取得
$ dscl . -read /Users/nfsnobody


ついでになりますが、Linux上でNFSでexportする際、以下のようにしないとうまいことOSXからmountできません。これはOSXがNFS mount時に1024番より上のポートを利用するためみたいです。mount時にオプションを指定すればinsecureは必要ないみたいですが、とりあえずこれで動かしています。あと、UIDやGIDをあわせるのが面倒だったのでクライアントからのアクセスがすべてnfsnobodyとして扱われるようにall_squashを利用しています。

 

	# /etc/exports
	/opt/www 192.168.0.0/255.255.0.0(rw,sync,insecure,all_squash)


今回はNFSを使ってみましたが、sshfsとかでも良かったかなーという気もしなくもありません