Thêm tài khoản daemon trên OS X


9

Tôi đang cố gắng tự cài đặt một trình nền (Oracle Grid Engine) trên máy của mình và tôi muốn nó chạy trong một tài khoản bị cô lập. Cách ưa thích, sử dụng Dịch vụ thư mục, để thêm tài khoản "hệ thống" vào máy cục bộ trên OS X là gì? Rất nhiều trong số chúng tồn tại trong / etc / passwd ( _www, _dovecotv.v.), nhưng các bình luận ở đầu tập tin đó nói rằng nó không được sử dụng ngoại trừ trong chế độ một người dùng.

Tôi đang chạy vào ngày 10.6 và không yêu cầu quản lý tài khoản được kết nối mạng đặc biệt nào. Tôi hy vọng điều gì đó đơn giản - tương đương useraddvới gần như mọi hệ điều hành giống Unix khác.

Câu trả lời:


3

dscl là lệnh bạn đang tìm kiếm.


+1 vì đây là câu trả lời dứt khoát. Nếu bạn muốn có GUI, bạn có thể tải xuống Công cụ máy chủ và trỏ Trình quản lý nhóm làm việc vào máy của mình để thực hiện điều tương tự ..
Johnnie Odom

12

Tôi đã thử kịch bản từ mệnh , và tìm thấy một vài vấn đề. Vì vậy, tôi đã sửa đổi nó cho một userid cụ thể và cho OS X Mavericks (10.9).

Tôi thấy rằng có một vài bản ghi không liên quan được thêm vào tài khoản Người dùng trong Mavericks - một bản ghi PasswordPolicyOptions và một bản ghi xác thực - cần phải được xóa để bắt chước chính xác các tài khoản người dùng dịch vụ tích hợp khác (như _www).

Tôi cũng đã thêm các bản ghi Mật khẩu và RealName vào tài khoản Nhóm.

Tôi đã tạo một tập lệnh tùy chỉnh, một lần, chỉ dành cho tài khoản dịch vụ WSGI. Đây là kịch bản cập nhật.

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

Lưu ý rằng sau khi chạy tập lệnh này, các tập tin / etc / passwd và / etc / Groups không được cập nhật. Tôi tin rằng chúng được cập nhật khi khởi động lại.


1
Cảm ơn Dave. Tôi đã cập nhật tập lệnh của mình (bên dưới) để sử dụng các khám phá Mavericks của bạn và lấy tham số tên thật tùy chọn.
mệnh giá

11

EDIT: Cập nhật ngày 9 tháng 1 năm 2014 cho OS X Mavericks (đề xuất từ ​​Dave, cảm ơn!)

Tôi đã viết một kịch bản bash để làm điều này. Nó sẽ sử dụng uid chưa sử dụng đầu tiên nhỏ hơn hoặc bằng 500 (uids tài khoản daemon trên Mac OS X) cũng có một gid không sử dụng giống hệt nhau.

Lưu tập lệnh vào một tập tin có tên add_system_user.shvà thiết lập tập tin thực thi chmod 755 add_system_user.sh.

Sau đó, giả sử bạn muốn thêm một người dùng daemon / hệ thống được gọi là mệnh . Bạn sẽ chạy tập lệnh này như vậy:

sudo add_system_user.sh par

Và bạn sẽ nhận được một người dùng hệ thống được gọi _parlà bí danh par(tên bạn yêu cầu) và có một uid và gid phù hợp (ví dụ: 499 hoặc bất cứ thứ gì nó tìm thấy).

Đây là kịch bản:

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

Điều này làm việc tốt cho tôi vào ngày 10.9. Cảm ơn!
jbyler

2

Đây là một bài viết giải thích cách sử dụng dscl để tạo tài khoản người dùng.

bài viết osxd Daily.com


Cảm ơn. Các trang hướng dẫn cho bạn biết những lệnh nào bạn có thể sử dụng, nhưng không cung cấp cho bạn bất kỳ trợ giúp nào về các trường sẽ sử dụng và những gì để đặt chúng. Tôi vừa mới sao chép cấu hình từ một tài khoản khác, nhưng điều này cho một ví dụ tốt.
Tim Yates

Đối với tài khoản hệ thống ẩn, hãy xem một số tài khoản hệ thống hiện có để biết ví dụ tốt hơn. Ví dụ dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Userssẽ giúp bạn có một danh sách các tài khoản địa phương). Lưu ý rằng bạn không phải đặt tất cả các thuộc tính; GeneratedUID được tạo ngẫu nhiên và RecordType là siêu dữ liệu tự động. Ngoài ra, hầu hết các tài khoản hệ thống OS X đều có tên tài khoản chính bắt đầu bằng dấu gạch dưới và bí danh không có tên này để tương thích ngược; Tôi khuyên bạn nên sử dụng quy ước gạch dưới, nhưng đừng bận tâm với bí danh đơn giản trừ khi bạn cần.
Gordon Davisson

2

Đây là phiên bản tập lệnh của Dave, cũng kiểm tra xem người dùng / nhóm có tồn tại trước khi tạo tập lệnh này không:

#! / thùng / sh
# tạo người dùng tài khoản dịch vụ tương tự như lệnh adduser Linux
# để xem người dùng và id hiện tại thử:
# dscl. -readall / Người dùng UniqueID | sắp xếp -nk 2

chết () {
    tiếng vang> & 2 "$ @"
    thoát 1
}

echo "Cách sử dụng: sudo $ 0 tên người dùng uid realname"
echo "GHI CHÚ: tên người dùng không nên bắt đầu bằng dấu gạch dưới (nó sẽ được thêm vào bởi tập lệnh)"
echo "kiểm tra xem người dùng không tồn tại và nhận số ID miễn phí trong phạm vi 1000"
echo "ví dụ với dscl. -readall / Users UniqueID | sort -nk 2"
tiếng vang ""

# Kiểm tra xem chúng tôi có phải là siêu người dùng không (ví dụ $ (id -u) bằng 0)
[`id -u` -eq 0] || chết "Kịch bản này cần chạy như root"

["$ #" -eq 3] || chết "Lỗi: 3 đối số bắt buộc: tên người dùng, uid và tên thật"

tên người dùng _ = $ 1
uid _ = $ 2
tên thật _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Kiểm tra xem người dùng / nhóm có tồn tại không: \ c"

kiểm tra_uuid = `dscl. Tìm kiếm / Người dùng UniqueID $ uid_`
kiểm tra_upgid = `dscl. -tìm kiếm / Người dùng Chính GroupID $ uid_`
kiểm tra_urn = `dscl. Tìm kiếm / Người dùng RecordName _ $ username_`
kiểm tra_grn = `dscl. -tìm kiếm / Nhóm RecordName _ $ username_`


[$ {# Check_uuid} = 0] || chết "thất bại! \ nERROR: Người dùng duy nhất UniqueID: \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimarygroupID RealName` \ n \ nĐể xem người dùng / id hiện tại chạy: dscl. -readall / Users UniqueID | sắp xếp -nk 2 "
[$ {# Check_upgid} = 0] || chết "thất bại! \ nERROR: Người dùng không phải là duy nhất Sơ cấpIDID \ n \ n`dscl. -read / Users / _ $ username_ RecordName PrimarygroupID RealName` \ n \ nĐể xem người dùng / id hiện có chạy: dscl. -readall / Users UniqueID | sắp xếp -nk 2 "
[$ {# check_urn} = 0] || chết "không thành công! \ nERROR: Người dùng không phải là duy nhất RecordName \ n \ n`dscl. sắp xếp -nk 2 "
[$ {# Check_grn} = 0] || chết "thất bại! \ nERROR: RecordName không duy nhất GroupName \ n \ n`dscl. -read / Groups / _ $ username_ RecordName PrimarygroupID RealName` \ n \ nĐể xem người dùng / id hiện có chạy: dscl. -readall / Users UniqueID | sắp xếp -nk 2 "

echo "chúng tôi tốt để đi!"

# echo "Tiếp tục (y / n)?"
# đọc đầu vào_
# ["$ input_" = "y"] || chết "như bạn muốn ..."

echo "Tạo người dùng: \ c"

dscl. -tạo / Nhóm / _ $ tên người dùng_
dscl. -tạo / Nhóm / _ $ tên người dùng_ Tiểu nhómID $ uid_
dscl. -tạo / Nhóm / _ $ username_ RecordName _ $ username_ $ username_
dscl. -tạo / Nhóm / _ $ username_ RealName "$ realname_"
dscl. -tạo / Nhóm / _ $ tên người dùng_ Mật khẩu \ *

dscl. -tạo / Người dùng / _ $ tên người dùng_
dscl. -tạo / Người dùng / _ $ tên người dùng_ NFSHomeDirectory $ nfs_homedir
dscl. -tạo / Người dùng / _ $ tên người dùng_ Mật khẩu \ *
dscl. -tạo / Người dùng / _ $ tên người dùng_ Tiểu nhómID $ uid_
dscl. -tạo / Người dùng / _ $ username_ RealName "$ realname_"
dscl. -tạo / Người dùng / _ $ username_ RecordName _ $ username_ $ username_
dscl. -tạo / Người dùng / _ $ tên người dùng_ UniqueID $ uid_
dscl. -tạo / Người dùng / _ $ tên người dùng_ UserShell $ user_shell
dscl. -delete / Người dùng / _ $ tên người dùng_ Mật khẩuPolicyOptions
dscl. -delete / Users / _ $ username_ Xác thựcAuthority

tiếng vang "xong!"

và một tập lệnh để xóa người dùng:

#! / thùng / sh
# xóa người dùng dịch vụ tương tự như lệnh userdel của Linux, nhưng vẫn giữ nguyên các tệp
# để xem người dùng và id hiện tại thử:
# dscl. -readall / Người dùng UniqueID | sắp xếp -nk 2

chết () {
    tiếng vang> & 2 "$ @"
    thoát 1
}

# Kiểm tra xem chúng tôi có phải là siêu người dùng không (ví dụ $ (id -u) bằng 0)
[`id -u` -eq 0] || chết "Kịch bản này cần chạy như root"
["$ #" -eq 1] || chết "Lỗi: yêu cầu đối số tên người dùng!"

tên người dùng _ = $ 1

dscl. -delete / Người dùng / $ tên người dùng_
dscl. -delete / Nhóm / $ tên người dùng_

tiếng vang "xong!"

Bạn là một pháp sư, cảm ơn rất nhiều! Hoạt động trong macOS 10.13.
Dmitry Verkhoturov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.