Tambahkan akun daemon di OS X

9

Saya mencoba menginstal daemon (Oracle Grid Engine) secara manual di mesin saya, dan saya ingin menjalankannya di bawah akun yang terisolasi. Apa cara yang disukai, menggunakan Layanan Direktori, untuk menambahkan akun "sistem" ke mesin lokal di OS X? Banyak dari mereka ada di / etc / passwd ( _www,, _dovecotdll), tetapi komentar di bagian atas file mengatakan bahwa itu tidak digunakan kecuali dalam mode pengguna tunggal.

Saya menjalankan pada 10.6, dan tidak memerlukan manajemen akun jaringan khusus. Saya berharap untuk sesuatu yang sederhana - setara useradddengan hampir semua OS mirip Unix lainnya.

Tim Yates
sumber

Jawaban:

3

dscl adalah perintah yang Anda cari.

Sven
sumber
+1 karena ini adalah jawaban yang pasti. Jika Anda menginginkan GUI, Anda dapat mengunduh Server Tools dan menunjuk Workgroup Manager di mesin Anda sendiri untuk melakukan hal yang sama pada dasarnya ..
Johnnie Odom
12

Saya mencoba skrip dari par , dan menemukan beberapa masalah. Jadi saya memodifikasinya untuk satu userid spesifik dan untuk OS X Mavericks (10.9).

Saya menemukan bahwa ada beberapa catatan asing yang ditambahkan ke akun Pengguna di bawah Mavericks - PasswordPolicyOptions dan catatan AuthenticationAuthority - yang perlu dihapus untuk dengan benar meniru akun pengguna layanan builtin lainnya (seperti _www).

Saya juga menambahkan catatan Kata Sandi dan RealName ke akun Grup.

Saya membuat skrip khusus, khusus, hanya untuk akun layanan WSGI. Berikut skrip yang diperbarui.

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

Perhatikan bahwa setelah menjalankan skrip ini, file / etc / passwd dan / etc / groups tidak diperbarui. Saya percaya mereka diperbarui saat reboot.

Dave Hein
sumber
1
Terimakasih Dave. Saya memperbarui skrip saya (di bawah) untuk menggunakan penemuan Mavericks Anda dan mengambil parameter nama asli opsional.
par
11

EDIT: Diperbarui 9 Jan 2014 untuk OS X Mavericks (saran dari Dave, terima kasih!)

Saya menulis skrip bash untuk melakukan ini. Ini akan menggunakan uid pertama yang tidak digunakan yang kurang dari atau sama dengan 500 (uids akun daemon pada Mac OS X) yang juga memiliki gid yang tidak digunakan yang identik.

Simpan skrip ke file bernama add_system_user.shdan atur agar dapat dieksekusi chmod 755 add_system_user.sh.

Lalu katakanlah Anda ingin menambahkan daemon / sistem yang disebut pengguna par . Anda akan menjalankan skrip ini seperti:

sudo add_system_user.sh par

Dan Anda akan mendapatkan pengguna sistem yang dipanggil _paralias par(nama yang Anda minta) dan memiliki uid dan gid yang cocok (misalnya 499 atau apa pun yang ditemukan).

Ini skripnya:

#!/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"
par
sumber
Ini bekerja dengan baik untuk saya pada 10.9. Terima kasih!
jbyler
2

Inilah artikel yang menjelaskan cara menggunakan dscl untuk membuat akun pengguna.

artikel osxdaily.com

Joe Block
sumber
Terima kasih. Halaman manual memberi tahu Anda perintah apa yang dapat Anda gunakan, tetapi tidak memberi Anda bantuan tentang bidang apa yang harus digunakan dan untuk apa mengaturnya. Saya hanya akan menyalin konfigurasi dari akun lain, tetapi ini memberikan contoh yang baik.
Tim Yates
Untuk akun sistem tersembunyi, lihat beberapa akun sistem yang ada untuk contoh yang lebih baik. Misalnya dscl /Local/Default -read /Users/_sshd ( dscl /Local/Default -ls /Usersakan memberi Anda daftar akun lokal). Perhatikan bahwa Anda tidak perlu mengatur semua atribut; GeneratedUID dibuat secara acak, dan RecordType adalah metadata otomatis. Juga, sebagian besar akun sistem OS X memiliki nama akun utama yang dimulai dengan garis bawah, dan alias tanpa itu untuk kompatibilitas mundur; Saya sarankan menggunakan konvensi garis bawah, tetapi jangan repot-repot dengan alias polos kecuali jika Anda perlu.
Gordon Davisson
2

Berikut adalah versi skrip Dave, yang juga memeriksa apakah pengguna / grup ada sebelum membuatnya:

#! / bin / sh
# menciptakan pengguna akun layanan yang mirip dengan perintah adduser Linux
# untuk melihat pengguna dan id yang ada coba:
# dscl. -readall / Pengguna UniqueID | sort -nk 2

mati () {
    echo> & 2 "$ @"
    keluar 1
}

echo "Usage: sudo $ 0 username uid realname"
echo "CATATAN: nama pengguna tidak boleh dimulai dengan garis bawah (itu akan ditambahkan oleh skrip)"
echo "periksa bahwa pengguna tidak ada dan dapatkan nomor ID gratis dalam kisaran 1000"
echo "mis. dengan dscl. -readall / Users UniqueID | sort -nk 2"
gema ""

# Pastikan kita superuser (mis. $ (Id -u) nol)
[`id -u` -eq 0] || die "Script ini perlu dijalankan sebagai root"

["$ #" -eq 3] || die "Galat: 3 argumen diperlukan: nama pengguna, uid dan nama asli"

nama pengguna _ = $ 1
uid _ = $ 2
realname _ = $ 3
nfs_homedir = "/ var / tmp"
user_shell = "/ usr / bin / false"

echo "Memeriksa apakah pengguna / grup ada: \ c"

check_uuid = `dscl. -search / Users UniqueID $ uid_`
check_upgid = `dscl. -search / Users PrimaryGroupID $ uid_`
check_urn = `dscl. -search / Users RecordName _ $ username_`
check_grn = `dscl. -search / Groups RecordName _ $ username_`


[$ {# check_uuid} = 0] || die "gagal! \ nERROR: Non-unik User UniqueID: \ n \ n`dscl. -baca / Pengguna / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUntuk melihat pengguna yang ada jalankan: idcl. -readall / Users UniqueID | sort -nk 2 "
[$ {# check_upgid} = 0] || die "gagal! \ nERROR: Pengguna Non-unik PrimaryGroupID \ n \ n`dscl. -baca / Pengguna / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUntuk melihat pengguna yang ada menjalankan / id: idcl. -readall / Pengguna UniqueID | sort -nk 2 "
[$ {# check_urn} = 0] || die "gagal! \ nERROR: RecordName Pengguna Non-unik \ n \ n`dscl. -baca / Pengguna / _ $ username_ RecordName PrimaryGroupID RealName` \ n \ nUntuk melihat pengguna yang ada jalankan: idcl. -readall / Pengguna UniqueID | sort -nk 2 "
[$ {# check_grn} = 0] || die "gagal! \ nERROR: Non-unik Group RecordName \ n \ n`dscl. -baca / Grup / _ $ username_ RecordGame PrimaryGroupID RealName` \ n \ nUntuk melihat pengguna yang ada menjalankan / id: idcl. -readall / Pengguna UniqueID | sort -nk 2 "

gema "kami baik-baik saja!"

# echo "Lanjutkan (y / n)?"
# baca input_
# ["$ input_" = "y"] || mati "seperti yang kamu inginkan ..."

echo "Membuat Pengguna: \ c"

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 $ 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. -delete / Users / _ $ username_ PasswordPolicyOptions
dscl. -delete / Users / _ $ username_ AuthenticationAuthority

gema "selesai!"

dan skrip untuk menghapus pengguna:

#! / bin / sh
# hapus layanan pengguna yang mirip dengan perintah userdel Linux, tetapi biarkan file-file tersebut tetap utuh
# untuk melihat pengguna dan id yang ada coba:
# dscl. -readall / Pengguna UniqueID | sort -nk 2

mati () {
    echo> & 2 "$ @"
    keluar 1
}

# Pastikan kita superuser (mis. $ (Id -u) nol)
[`id -u` -eq 0] || die "Script ini perlu dijalankan sebagai root"
["$ #" -eq 1] || die "Galat: diperlukan argumen pengguna!"

nama pengguna _ = $ 1

dscl. -delete / Users / $ username_
dscl. -delete / Grup / $ username_

gema "selesai!"
Alex Popov
sumber
Anda seorang penyihir, terima kasih banyak! Bekerja di macOS 10.13.
Dmitry Verkhoturov