Tương đương với lệnh adduser trên Mac OS X là gì?


20

Tôi muốn có thể tạo người dùng mới từ dòng lệnh khi tôi đăng nhập với tư cách quản trị viên. Cụ thể, tôi đang tìm kiếm một adduserlệnh tương đương trên Linux.

Câu trả lời:


12

Có một kịch bản tốt có sẵn tại http://wiki.freegeek.org/index.php/Mac_OSX_adduser_script Tuy nhiên, nó có một số lỗi chính tả và đôi khi không đủ linh hoạt, vì vậy đây là phiên bản sửa đổi của tôi với một số cải tiến:

#!/bin/bash
# =========================
# Add User OS X Interactive Command Line
# =========================

getHiddenUserUid()
{
    local __UIDS=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ugr)

    #echo $__UIDS
    local __NewUID
    for __NewUID in $__UIDS
    do
        if [[ $__NewUID -lt 499 ]] ; then
            break;
        fi
    done

    echo $((__NewUID+1))
}

getInteractiveUserUid()
{
    # Find out the next available user ID
    local __MAXID=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ug | tail -1)
    echo $((__MAXID+1))
}

if  [ $UID -ne 0 ] ; then echo "Please run $0 as root." && exit 1; fi

read -p "Enter your desired user name: " USERNAME

read -p "Enter a full name for this user: " FULLNAME

read -s -p "Enter a password for this user: " PASSWORD
echo
read -s -p "Validate a password: " PASSWORD_VALIDATE
echo

if [[ $PASSWORD != $PASSWORD_VALIDATE ]] ; then
    echo "Passwords do not match!"
    exit 1;
fi

# ====

# A list of (secondary) groups the user should belong to
# This makes the difference between admin and non-admin users.

read -p "Is this an administrative user? [y/n] (n): " GROUP_ADD
GROUP_ADD=${GROUP_ADD:-n}

if [ "$GROUP_ADD" = n ] ; then
    SECONDARY_GROUPS="staff"  # for a non-admin user
elif [ "$GROUP_ADD" = y ] ; then
    SECONDARY_GROUPS="admin _lpadmin _appserveradm _appserverusr" # for an admin user
else
    echo "You did not make a valid selection!"
    exit 1;
fi

# ====

# Create a UID that is not currently in use

read -p "Should this user have interactive access?  [y/n] (y): " IS_INTERACTIVE
IS_INTERACTIVE=${IS_INTERACTIVE:-y}

if [ "$IS_INTERACTIVE" = y ] ; then
    USERID=$(getInteractiveUserUid)
elif [ "$IS_INTERACTIVE" = n ] ; then
    USERID=$(getHiddenUserUid)
else
    echo "You did not make a valid selection!"
    exit 1;
fi

echo "Going to create user as:"
echo "User name: " $USERNAME
echo "Full name: " $FULLNAME
echo "Secondary groups: " $SECONDARY_GROUPS
echo "UniqueID: " $USERID

read -p "Is this information correct?  [y/n] (y): " IS_INFO_CORRECT
IS_INFO_CORRECT=${IS_INFO_CORRECT:-y}

if [ "$IS_INFO_CORRECT" = y ] ; then
    echo "Configuring Open Directory..."
elif [ "$IS_INFO_CORRECT" = n ] ; then
    echo "User creation cancelled!"
    exit 1;
else
    echo "You did not make a valid selection!"
    exit 1;
fi


# Create the user account by running dscl (normally you would have to do each of these commands one
# by one in an obnoxious and time consuming way.

dscl . -create /Users/$USERNAME
dscl . -create /Users/$USERNAME UserShell /bin/bash
dscl . -create /Users/$USERNAME RealName "$FULLNAME"
dscl . -create /Users/$USERNAME UniqueID "$USERID"
dscl . -create /Users/$USERNAME PrimaryGroupID 20
dscl . -create /Users/$USERNAME NFSHomeDirectory /Users/$USERNAME
dscl . -passwd /Users/$USERNAME $PASSWORD


# Add user to any specified groups
echo "Adding user to specified groups..."

for GROUP in $SECONDARY_GROUPS ; do
    dseditgroup -o edit -t user -a $USERNAME $GROUP
done

# Create the home directory
echo "Creating home directory..."
createhomedir -c 2>&1 | grep -v "shell-init"

echo "Created user #$USERID: $USERNAME ($FULLNAME)"

Ít nhất là vào ngày 10.12 / Sierra, điều này có thể có vấn đề. Khi tôi thử nó, nó đang tạo thư mục cho mọi người dùng trên mạng. Cụ thể, sử dụng 'createhomedir' mà không chỉ định '-u tên người dùng' có lẽ không được khuyến khích.
Jan Kyu Peblik

17

Tôi nghĩ rằng bạn đang tìm kiếm lệnh dscl. Âm thanh Niutil giống như NetInfo không được dùng trong OS X có lợi cho Thư mục mở hay còn gọi là LDAP.

Dscl, hoặc Dòng lệnh dịch vụ thư mục, có thể được sử dụng để chỉnh sửa Thư mục mở cho cả kho lưu trữ dữ liệu người dùng cục bộ hoặc từ xa. Nó có thể được thực hiện với các lệnh sudo nhưng nó dễ sử dụng hơn như root.

Đây là một hướng dẫn ngắn và rất không đầy đủ: Trong thiết bị đầu cuối, sudo -s để chuyển người dùng của bạn sang root. Để tạo một tài khoản người dùng chức năng có tên dscl2, bạn cần làm như sau:

dscl . -create /Users/dscl2

dscl . -create /Users/dscl2 UserShell /bin/bash

dscl . -create /Users/dscl2 RealName "DSCL 2"

dscl . -create /Users/dscl2 UniqueID 8005

dscl . -create /Users/dscl2 PrimaryGroupID 20

dscl . -create /Users/dscl2 NFSHomeDirectory /Users/dscl2

dscl . -passwd /Users/dscl2 password

UUID thường khoảng 501 hoặc lớn hơn. 501 là UID mặc định cho tài khoản đầu tiên được tạo. Các UID dưới 500 không hiển thị trong ngăn Tài khoản theo mặc định. Chọn bất cứ số nào bạn muốn, nhưng hãy chắc chắn rằng nó là duy nhất trên hệ thống cục bộ. Đừng ghi đè lên một UID hiện có nếu không bạn sẽ gặp vấn đề lớn.

Dscl có một chế độ tương tác cũng hoạt động hơi khác một chút. Chỉ nhập "dscl" tại dấu nhắc để vào chế độ tương tác.

Nếu bạn đang ở chế độ Tương tác, hãy nhập ls vào danh sách thư mục nào khả dụng. Bạn sẽ thấy BSD, LDAP và Local. Bạn điều hướng qua các thư mục với cd. Xem bạn của bạn trang nam để biết thêm.


2
Tôi biết bạn đã cảnh báo chúng tôi rằng điều này là không thỏa đáng, nhưng thật tuyệt khi thấy toàn bộ các bước cần thiết để tạo một tài khoản, ngay cả sau khi dscl được thực hiện. Ví dụ: thư mục / Users / dscl2 có cần được tạo không? Làm thế nào để áp dụng ACL?
Nathan Garabedian

1
Câu trả lời này là chính xác, nhưng kịch bản trong câu trả lời @ anton-matosov là tuyệt vời. Chạy các lệnh tương tự.
bmucklow
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.