OS X에서 데몬 계정 추가 시스템에 “시스템”계정을 추가하기

컴퓨터에 데몬 (Oracle Grid Engine)을 수동으로 설치하려고하는데 격리 된 계정으로 실행하고 싶습니다. 디렉토리 서비스를 사용하여 OS X의 로컬 시스템에 “시스템”계정을 추가하기 위해 선호되는 방법은 무엇입니까? 그것들은 / etc / passwd ( _www, _dovecot등)에 많이 있지만 그 파일의 맨 위에있는 주석은 단일 사용자 모드를 제외하고는 사용되지 않는다고 말합니다.

10.6에서 실행 중이며 특별한 네트워크 계정 관리가 필요하지 않습니다. 나는 useradd거의 모든 다른 유닉스 계열 OS 와 동등한 간단한 것을 원합니다 .



답변

dscl은 찾고있는 명령입니다.


답변

par 에서 스크립트를 시도한 결과 몇 가지 문제가 발견되었습니다. 그래서 하나의 특정 사용자 ID와 OS X Mavericks (10.9)에 맞게 수정했습니다.

Mavericks 아래 사용자 계정에 PasswordPolicyOptions 및 AuthenticationAuthority 레코드와 같은 외부 레코드 두 개가 추가되어 다른 내장 서비스 사용자 계정 (_www 등)을 올바르게 모방하기 위해 제거해야한다는 것을 알았습니다.

또한 비밀번호 및 RealName 레코드를 그룹 계정에 추가했습니다.

WSGI 서비스 계정에 대해서만 사용자 지정 스크립트를 만들었습니다. 업데이트 된 스크립트는 다음과 같습니다.

#! /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 인 첫 번째 미사용 uid (Mac OS X의 데몬 계정 uid)를 사용합니다.

스크립트를 파일 이름으로 저장하고로 add_system_user.sh실행 파일을 설정하십시오 chmod 755 add_system_user.sh.

그런 다음 par 라는 데몬 / 시스템 사용자를 추가한다고 가정 해 봅시다 . 이 스크립트를 다음과 같이 실행합니다 :

sudo add_system_user.sh par

그리고 당신은 (당신이 요청한 이름으로 _par) 별칭 par이 있고 일치하는 uid와 gid (예를 들어 499 또는 무엇이든) 를 가진 시스템 사용자를 얻게 될 것 입니다.

스크립트는 다음과 같습니다.

#!/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"

답변

다음은 dscl을 사용하여 사용자 계정을 만드는 방법을 설명하는 기사입니다.

osxdaily.com 기사


답변

다음은 Dave의 스크립트 버전입니다.이 스크립트는 사용자 / 그룹을 작성하기 전에 존재하는지 확인합니다.

#! / bin / sh
# Linux adduser 명령과 유사한 서비스 계정 사용자를 만듭니다.
# 기존 사용자 및 ID를 보려면 다음을 시도하십시오.
# dscl. -readall / Users UniqueID | 정렬 -nk 2

죽어 () {
    echo> & 2 "$ @"
    1 번 출구
}

echo "사용법 : sudo $ 0 username uid realname"
echo "주의 사항 : 사용자 이름은 밑줄로 시작해서는 안됩니다 (스크립트로 추가됩니다)"
echo "사용자가 존재하지 않는지 확인하고 1000 범위에서 무료 ID 번호를 얻습니다"
echo "예 : dscl. -readall / Users UniqueID | sort -nk 2"
에코 ""

# 수퍼 유저인지 확인합니다 (예 : $ (id -u)가 0 임)
[`id -u` -eq 0] || "이 스크립트는 루트로 실행해야합니다"

[ "$ #"-eq 3] || "오류 : 3 개의 인수가 필요합니다 : username, uid 및 realname"

username _ = $ 1
uid _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "사용자 / 그룹이 있는지 확인 : \ c"

check_uuid =`dscl. -search / Users 고유 ID $ uid_`
check_upgid =`dscl. -search / Users 기본 그룹 ID $ uid_`
check_urn =`dscl. -search / Users RecordName _ $ 사용자 이름 _`
check_grn =`dscl. -search / Groups 레코드 이름 _ $ username_`


[$ {# check_uuid} = 0] || "실패했습니다! \ n 오류 : 고유하지 않은 사용자 UniqueID : \ n \ n`dscl .-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n 기존 사용자 / ID를 보려면 dscl을 실행하십시오. -readall / Users UniqueID | 정렬 -nk 2 "
[$ {# check_upgid} = 0] || "실패했습니다! \ n 오류 : 고유하지 않은 사용자 PrimaryGroupID \ n \ n`dscl .-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n 기존 사용자 / ID를 보려면 dscl을 실행하십시오. -readall / Users UniqueID | 정렬 -nk 2 "
[$ {# check_urn} = 0] || "실패했습니다! \ n 오류 : 고유하지 않은 사용자 RecordName \ n \ n`dscl .-read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n 기존 사용자 / ID를 보려면 dscl을 실행하십시오. -readall / Users UniqueID | 정렬 -nk 2 "
[$ {# check_grn} = 0] || "실패했습니다! \ n 오류 : 고유하지 않은 그룹 RecordName \ n \ n`dscl .-read / Groups / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n 기존 사용자 / ID를 보려면 dscl을 실행하십시오. -readall / Users UniqueID | 정렬 -nk 2 "

에코 "우리는 잘가요!"

# echo "계속 (y / n)?"
# input_ 읽기
# [ "$ input_"= "y"] || "원하는대로 죽어라 ..."

echo "사용자 생성 : \ c"

dscl. -/ 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. -/ 사용자 / _ $ 사용자 이름 _ 만들기
dscl. -create / 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. -create / Users / _ $ username_ UserShell $ user_shell
dscl. -삭제 / Users / _ $ username_ PasswordPolicyOptions
dscl. -삭제 / Users / _ $ username_ AuthenticationAuthority

에코 "완료!"

그리고 사용자를 삭제하는 스크립트 :

#! / bin / sh
# Linux userdel 명령과 유사한 서비스 사용자 삭제, 파일은 그대로 유지
# 기존 사용자 및 ID를 보려면 다음을 시도하십시오.
# dscl. -readall / Users UniqueID | 정렬 -nk 2

죽어 () {
    echo> & 2 "$ @"
    1 번 출구
}

# 수퍼 유저인지 확인합니다 (예 : $ (id -u)가 0 임)
[`id -u` -eq 0] || "이 스크립트는 루트로 실행해야합니다"
[ "$ #"-eq 1] || "오류 : 사용자 이름 인수가 필요합니다!"

username _ = $ 1

dscl. -/ 사용자 / $ 사용자 이름 _ 삭제
dscl. -/ Groups / $ username_ 삭제

에코 "완료!"