컴퓨터에 데몬 (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을 사용하여 사용자 계정을 만드는 방법을 설명하는 기사입니다.
답변
다음은 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_ 삭제 에코 "완료!"