เพิ่มบัญชีภูตใน OS X


9

ฉันกำลังพยายามติดตั้ง daemon (Oracle Grid Engine) ด้วยตนเองบนเครื่องของฉันและฉันต้องการให้ทำงานภายใต้บัญชีแยกต่างหาก วิธีที่ต้องการคือการใช้บริการไดเรกทอรีเพื่อเพิ่มบัญชี "ระบบ" ในเครื่องท้องถิ่นบน OS X คืออะไร? มีอยู่มากมายใน / etc / passwd ( _www,, _dovecotฯลฯ ) แต่ความคิดเห็นที่ด้านบนของไฟล์นั้นบอกว่าไม่ได้ใช้ยกเว้นในโหมดผู้ใช้คนเดียว

ฉันทำงานที่ 10.6 และไม่จำเป็นต้องมีการจัดการบัญชีเครือข่ายพิเศษใด ๆ ฉันหวังว่าจะมีอะไรที่เรียบง่าย - เทียบเท่าuseraddกับระบบปฏิบัติการ Unix เกือบทุกระบบ

คำตอบ:


3

dscl เป็นคำสั่งที่คุณกำลังมองหา


+1 เพราะนี่คือคำตอบที่ชัดเจน หากคุณต้องการ GUI คุณสามารถดาวน์โหลดเครื่องมือเซิร์ฟเวอร์และชี้ผู้จัดการเวิร์กกรุ๊ปไปที่เครื่องของคุณเองเพื่อทำสิ่งเดียวกัน ..
Johnnie Odom

12

ฉันลองใช้สคริปต์จากพาร์และพบปัญหาเล็กน้อย ดังนั้นฉันจึงแก้ไขมันสำหรับหมายเลขผู้ใช้เฉพาะหนึ่งและสำหรับ OS X Mavericks (10.9)

ฉันพบว่ามีการบันทึกเพิ่มเติมภายนอกสองสามบัญชีในบัญชีผู้ใช้ภายใต้ Mavericks - PasswordPolicyOptions และระเบียน AuthenticationAuthority - ซึ่งจำเป็นต้องลบออกเพื่อเลียนแบบบัญชีผู้ใช้บริการในตัวอื่น ๆ อย่างถูกต้อง (เช่น _www)

ฉันยังเพิ่มระเบียนรหัสผ่านและชื่อจริงลงในบัญชีกลุ่ม

ฉันสร้างที่กำหนดเองหนึ่งครั้งสคริปต์เพียงบัญชีบริการ 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

แก้ไข: อัปเดต 9 มกราคม 2014 สำหรับ OS X Mavericks (คำแนะนำจากเดฟขอบคุณ!)

ฉันเขียนสคริปต์ทุบตีเพื่อทำสิ่งนี้ มันจะใช้ uid ที่ไม่ได้ใช้ครั้งแรกซึ่งน้อยกว่าหรือเท่ากับ 500 (u ดีบัญชี daemon บน Mac OS X) ที่มี gid ที่ไม่ได้ใช้เหมือนกัน

บันทึกสคริปต์เพื่อไฟล์ชื่อและตั้งปฏิบัติการด้วยadd_system_user.shchmod 755 add_system_user.sh

แล้วสมมติว่าคุณต้องการที่จะเพิ่มผู้ใช้ภูต / ระบบที่เรียกว่าหุ้นที่ตราไว้ คุณจะเรียกใช้สคริปต์นี้เช่น:

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 / ดวลจุดโทษ
# สร้างบัญชีผู้ใช้บริการคล้ายกับคำสั่ง Linux adduser
# เพื่อดูผู้ใช้และรหัสลองใช้ที่มีอยู่:
# dscl -readall / Users UniqueID | sort -nk 2

ตาย () {
    echo> & 2 "$ @"
    ทางออก 1
}

echo "การใช้งาน: sudo $ 0 ชื่อผู้ใช้และชื่อจริง"
echo "หมายเหตุ: ชื่อผู้ใช้ไม่ควรเริ่มด้วยเครื่องหมายขีดล่าง (สคริปต์จะต่อท้าย)"
echo "ตรวจสอบว่าผู้ใช้ไม่มีอยู่และรับหมายเลข ID ฟรีในช่วง 1000"
echo "เช่นกับ dscl. -readall / Users UniqueID | sort -nk 2"
echo ""

# ตรวจสอบว่าเราเป็น superuser (เช่น $ (id -u) เป็นศูนย์)
[`id -u` -eq 0] || ตาย "สคริปต์นี้ต้องทำงานเป็นรูท"

["$ #" -eq 3] || ตาย "ข้อผิดพลาด: ต้องการ 3 อาร์กิวเมนต์: ชื่อผู้ใช้ uid และชื่อจริง"

ชื่อผู้ใช้ _ = $ 1
UID _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "ตรวจสอบว่ามีผู้ใช้ / กลุ่มอยู่หรือไม่: \ c"

check_uuid = `dscl - การค้นหา / ผู้ใช้ UniqueID $ uid_`
check_upgid = `dscl - การค้นหา / ผู้ใช้ PrimaryGroupID $ uid_`
check_urn = `dscl -search / Users RecordName _ $ username_`
check_grn = `dscl -search / Groups RecordName _ $ username_`


[$ {# check_uuid} = 0] || ตาย "ล้มเหลว! \ nERROR: ผู้ใช้ที่ไม่ซ้ำกัน UniqueID: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n เพื่อดูผู้ใช้ที่มีอยู่ / รหัสที่เรียกใช้: dscl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || ตาย "ล้มเหลว! \ nERROR: ผู้ใช้ที่ไม่ซ้ำ PrimaryGroupID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n หากต้องการดูผู้ใช้ที่มีอยู่ / รหัสที่ทำงาน: dscl. -readall / Users UniqueID | จัดเรียง -nk 2 "
[$ {# check_urn} = 0] || ตาย "ล้มเหลว! \ nERROR: ชื่อผู้ใช้ที่ไม่ซ้ำกัน \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n เพื่อดูผู้ใช้ที่มีอยู่ / รหัสที่ทำงาน: dscl. -readall / Users UniqueID | จัดเรียง -nk 2 "
[$ {# check_grn} = 0] || ตาย "ล้มเหลว! \ nERROR: กลุ่ม RecordName ที่ไม่ซ้ำกัน \ n \ n`dscl. - อ่าน / กลุ่ม / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ n เพื่อดูผู้ใช้ที่มีอยู่ / รหัสที่ทำงาน: dscl. -readall / Users UniqueID | จัดเรียง -nk 2 "

echo "เราไปได้ดี!"

# echo "ทำต่อ (y / n)?"
# อ่านอินพุต _
# ["$ input_" = "y"] || ตาย "ตามที่คุณต้องการ ... "

echo "กำลังสร้างผู้ใช้: \ c"

dscl -create / Groups / _ $ ชื่อผู้ใช้ _
dscl -create / Groups / _ $ username_ PrimaryGroupID $ uid_
dscl -create / Groups / _ $ username_ RecordName _ $ username_ $ username_
dscl -create / Groups / _ $ username_ RealName "$ realname_"
dscl - สร้าง / กลุ่ม / _ $ ชื่อผู้ใช้รหัสผ่าน \ *

dscl - สร้าง / ผู้ใช้ / _ $ ชื่อผู้ใช้ _
dscl -create / Users / _ $ username_ NFSHomeDirectory $ nfs_homedir
dscl - สร้าง / ผู้ใช้ / _ $ ชื่อผู้ใช้ _ รหัสผ่าน \ *
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 -delete / Users / _ $ username_ PasswordPolicyOptions
dscl -delete / Users / _ $ username_ AuthenticationAuthority

echo "เสร็จสิ้น!"

และสคริปต์เพื่อลบผู้ใช้:

#! / bin / ดวลจุดโทษ
# ลบผู้ใช้บริการคล้ายกับคำสั่ง Linux userdel แต่ปล่อยให้ไฟล์ยังคงอยู่
# เพื่อดูผู้ใช้และรหัสลองใช้ที่มีอยู่:
# dscl -readall / Users UniqueID | sort -nk 2

ตาย () {
    echo> & 2 "$ @"
    ทางออก 1
}

# ตรวจสอบว่าเราเป็น superuser (เช่น $ (id -u) เป็นศูนย์)
[`id -u` -eq 0] || ตาย "สคริปต์นี้ต้องทำงานเป็นรูท"
["$ #" -eq 1] || ตาย "ข้อผิดพลาด: ต้องระบุอาร์กิวเมนต์ของชื่อผู้ใช้!"

ชื่อผู้ใช้ _ = $ 1

dscl -delete / Users / $ username_
dscl -delete / Groups / $ username_

echo "เสร็จสิ้น!"

คุณเป็นนักมายากลขอบคุณมาก! ทำงานได้ใน macOS 10.13
Dmitry Verkhoturov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.