lập trình clone / etc / skel cho người dùng mới


11

/etc/skellà một thư mục sẽ được nhân bản cho người dùng mới. Có cách nào khả thi để chúng ta có thể xác định quy tắc cần sao chép từ /etc/skelthư mục không?

Ví dụ: tôi đang tìm cách nếu người dùng được tạo và thuộc nhóm có tên A, /etc/skelthư mục bản sao ngoại trừ /etc/skel/not_for_a.txt. Khả thi?

Câu trả lời:


11

Lưu ý rằng useraddlệnh cho phép bạn chỉ định thư mục SKEL tùy chỉnh bằng -ktùy chọn. Bạn có thể tạo thư mục / etc / skel-for-group-A mà không cần not-for-a.txt, sau đó thêm người dùng mới với nhóm mặc định của họ là A và chỉ định thư mục SKEL của họ bằng lệnh:

useradd username -g groupA -k /etc/skel-for-group-A -m

Tham khảo: http://manpages.ubfox.com/manpages/trusty/man8/useradd.8.html


1
useraddkhông khuyến khích các hệ thống dựa trên debian trong trang man trên hệ thống 16.04 của tôi. Nếu lý do cho sự thận trọng này đã thay đổi, bạn có thể thêm nó vào câu trả lời của mình. Cũng trong ngày 16.04 useraddadduserlà các chương trình khác nhau với các tùy chọn khác nhau, có lẽ bạn có thể chỉnh sửa câu trả lời của mình cho rõ ràng.
J. Starnes

8
@ J.Starnes Để chỉ định thư mục SKEL tùy chỉnh là không thể trong adduserlệnh, vì vậy chúng tôi sử dụng useradd. Nó không hoàn toàn không được khuyến khích: " useraddlà một tiện ích cấp thấp để thêm người dùng. Trên Debian, quản trị viên thường nên sử dụng adduserthay thế." Bạn có thể sử dụng lệnh này trong những trường hợp bất thường như thế này.
Mukesh Sai Kumar

8
  1. Tạo các skelthư mục bổ sung .

    sudo mkdir /etc/skel{A,B}
    
  2. Sao chép nội dung của /etc/skelđể /etc/skelA.

    sudo cp /etc/skel/* /etc/skelA/
    
  3. Tùy chỉnh nội dung thư mục skel thay thế.

  4. adduserkhông có homedir, nhưng với các thiết lập bình thường khác. Thay thế dấu chấm lửng bằng các cài đặt thích hợp.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper để tạo người dùng homedir dựa trên dir skel thay thế.

    sudo mkhomedir_helper bob /etc/skelA
    
#!/bin/bash
### a bare bones dumb script to create a user with a homedir based on an alternitive skeldir
adduseropt="--no-create-home --ingroup"
# assumes $1 will be user TODO add sanity check
# Assumes $2 will be alternitive skeldir TODO add sanity check
# assumes $3 will be a group TODO add sanity check
sudo adduser --no-create-home $adduseropt $3 $1
sudo mkhomedir_helper $1 $2

3

adduserkhông hỗ trợ một cách giới hạn để loại trừ các tệp khỏi thư mục skeleton. Từ man adduser.conf:

SKEL_IGNORE_REGEX
    Files  in  /etc/skel/  are  checked  against this regex, and not
    copied to the newly created home directory if they match.   This
    is  by default set to the regular expression matching files left
    over from unmerged config files (dpkg-(old|new|dist)).

Trong khi bạn không thể đặt regex này từ dòng lệnh, bạn có thể đặt tệp cấu hình được sử dụng bằng --conftùy chọn. Vì vậy, bạn có thể tạo các bản sao bổ sung /etc/adduser.confchỉ khác nhau trên SKEL_IGNORE_REGEXvà sử dụng các bản sao đó:

(grep -v '^SKEL_IGNORE_REGEX' /etc/adduser.conf; printf "%s\n" 'SKEL_IGNORE_REGEX="not_for_a.txt"') > /etc/adduser_A.txt
sudo adduser --conf /etc/adduser_A.txt ...

3

Các adduserlệnh có thể chạy một kịch bản trang web cụ thể để làm bất kỳ thiết lập giống như loại bỏ tập tin. Miễn là bắt đầu với một bản sao đầy đủ và sau đó xóa một số tệp sau đó, thì phương pháp này có thể phù hợp với bạn.

Từ trang người dùng (8) :

Nếu tệp /usr/local/sbin/adduser.local tồn tại, nó sẽ được thực thi sau khi tài khoản người dùng đã được thiết lập để thực hiện bất kỳ thiết lập cục bộ nào. Các đối số được truyền tới adduser.locallà:

Tên người dùng uid gid thư mục nhà

Vì vậy, tất cả những gì bạn cần làm là viết một tập lệnh có bốn tham số và sử dụng nó để loại bỏ bất kỳ tập tin nào bạn cần. Lưu nó dưới dạng /usr/local/sbin/adduser.localvà đảm bảo rằng nó được đánh dấu thực thi ( chmod a+x).

Đây là một cái gì đó để giúp bạn bắt đầu:

#!/bin/bash
## Site-specific setup for newly-created users.
## adduser(8) will call this script after setting up a new user.

set -euo pipefail
if [[ "$#" != 4 ]]; then
  echo "usage: $0 username uid gid home" > /dev/stderr
fi
NEW_USERNAME="${1:?}"
NEW_UID="${2:?}"
NEW_GID="${3:?}"
NEW_HOME="${4:?}"

# The groups command outputs a space-separated list of group names
IFS=' '
for group in $(groups "${NEW_USERNAME}"); do
   case "${group}" in
     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;
     b)
       [[ "${VERBOSE}" > 0 ]] && echo Removing dir for b
       rm -r "${NEW_HOME}/not_for_b/"
       ;;
     *)
       [[ "${VERBOSE}" > 1 ]] && echo No special setup required for $group
       ;;
   esac
done

Phần thú vị mà bạn muốn chỉnh sửa là những dòng giống như thế này:

     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;

Bạn có thể điền tên nhóm thực tế và hành vi bạn muốn xem thay vì a)rm not_for_a.txt.

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.