OS X에서 데몬 계정 추가


9

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

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

답변:


3

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


이것이 정답이므로 +1입니다. GUI를 원한다면 서버 툴을 다운로드하고 자신의 컴퓨터에서 Workgroup Manager가 동일한 작업을하도록 지시 할 수 있습니다.
Johnnie Odom

12

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 파일은 업데이트되지 않습니다. 재부팅 할 때 업데이트된다고 생각합니다.


1
고마워 데이브. Mavericks 검색을 사용하고 선택적인 실제 이름 매개 변수를 사용하도록 스크립트 (아래)를 업데이트했습니다.

11

편집 : 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"

이것은 10.9에서 나를 위해 잘 작동했습니다. 감사!
jbyler

2

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

osxdaily.com 기사


감사. 매뉴얼 페이지에는 사용할 수있는 명령이 나와 있지만 사용할 필드와 설정 방법에 대한 도움말은 제공하지 않습니다. 방금 다른 계정에서 구성을 복사하려고했지만 좋은 예입니다.
Tim Yates

숨겨진 시스템 계정의 경우 더 나은 예를 보려면 기존 시스템 계정을 살펴보십시오. 예를 들어 dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Users로컬 계정 목록을 얻습니다). 모든 속성을 설정할 필요는 없습니다. GeneratedUID는 임의로 생성되며 RecordType은 자동 메타 데이터입니다. 또한 대부분의 OS X 시스템 계정에는 밑줄로 시작하는 기본 계정 이름과 이전 버전과의 호환성을 위해 이름이없는 별칭이 있습니다. 밑줄 규칙을 사용하는 것이 좋지만 필요한 경우가 아니면 일반 별칭을 사용하지 마십시오.
Gordon Davisson

2

다음은 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_ 삭제

에코 "완료!"

당신은 마술사입니다, 고마워요! macOS 10.13에서 작동합니다.
Dmitry Verkhoturov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.