web-dev-qa-db-ja.com

OSXにデーモンアカウントを追加する

デーモン(Oracle Grid Engine)をマシンに手動でインストールしようとしていますが、分離されたアカウントで実行したいと思います。ディレクトリサービスを使用して、OS Xのローカルマシンに「システム」アカウントを追加するための推奨される方法は何ですか?それらの多くは/ etc/passwd(_www_dovecotなど)が、そのファイルの上部にあるコメントは、シングルユーザーモード以外では使用されないことを示しています。

私は10.6で実行しており、特別なネットワークアカウント管理は必要ありません。私は、他のほぼすべてのUnixライクなOSのuseraddに相当する単純なものを望んでいます。

9
Tim Yates

dsclは、探しているコマンドです。

3
Sven

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ファイルは更新されないことに注意してください。再起動時に更新されると思います。

12
Dave Hein

編集: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"
11
par

次に、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!" 
2
Alex Popov

これは、dsclを使用してユーザーアカウントを作成する方法を説明する記事です。

osxdaily.comの記事

2
Joe Block