tạo thư mục nhà sau khi tạo người dùng


68

Tôi đã tạo một số người dùng với:

$ useradd john

và tôi quên chỉ định tham số -mđể tạo thư mục chính và sao chép các tệp bộ xương cho mỗi người dùng. bây giờ tôi muốn làm điều đó và tôi không muốn tạo lại tất cả người dùng (phải có một cách dễ dàng hơn). Vì vậy, có cách nào để tạo các thư mục người dùng và sao chép các tập tin bộ xương?

Tôi nghĩ về việc tạo các thư mục, điều khiển chúng cho người dùng tương ứng, sao chép tất cả các tập tin bộ xương và điều khiển chúng cho người dùng tương ứng. Nhưng nếu có một lệnh như thế useradd -mkhông tạo lại người dùng, nhưng tạo các thư mục, nó sẽ tốt hơn.


Điều này đã xảy ra với một danh sách lớn người dùng?
David Rickman

Tôi đã có khoảng 10 người dùng với vấn đề này.
cd1

Tôi không thể giúp nhưng cảm thấy Rahul có câu trả lời tốt nhất cho câu hỏi của bạn. Có lẽ bạn nên xem lại câu trả lời được chấp nhận của bạn?

Câu trả lời:


17

Điều này nghe có vẻ như là một ý tưởng ngớ ngẩn, nhưng nếu người dùng thực sự không làm gì cả, bạn có thể làm:

cat /etc/passwd | cut -f 1 -d : >/tmp/users.list

Sau đó chỉnh sửa /tmp/users.list để chỉ chứa người dùng bạn muốn. Sau đó làm:


for i in `cat /tmp/users.list`
do
    userdel $i
    useradd -m $i
done

Tuy nhiên, nhiều bản phân phối dựa trên Redhat sẽ tạo cho bạn một thư mục chính mới khi bạn đăng nhập lần đầu, với điều kiện nó được chỉ định trong / etc / passwd nơi thư mục sẽ nằm.

Để kiểm tra điều đó, hãy thực hiện "su -" và xem liệu nó có "đúng không". Nếu không, kịch bản trên sẽ hoạt động khá độc đáo, tôi nghĩ vậy.


1
vâng, nó đã hoạt động, mặc dù nó đã tạo ra UID và GID mới (nhưng đó không phải là vấn đề). nhưng tôi quên sao lưu mật khẩu từ / etc / bóng, bây giờ người dùng sẽ phải đặt lại mật khẩu của họ = /
cd1

Nếu anh ấy tạo ra chúng gần đây, anh ấy có thể làm được: cat / etc / passwd | egrep '^ \: [0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list Chỉ nên lấy UID của người dùng hợp lệ chứ không phải người dùng hệ thống.
David Rickman

Còn mật khẩu thì sao? Tôi không sợ!
toán

for i in $(awk -F: '{print $1 }' /etc/passwd)
Rahul Patil

Tại sao sử dụng grep hoặc cắt bằng mèo và với đường ống, tại sao không trực tiếp theo cách này? cắt -f 1 -d: </ etc / passwd> passwtmp
c4f4t0r

97

Ngoài ra bạn có thể sử dụng mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]

13
Đây là câu trả lời duy nhất thực sự trả lời câu hỏi mà không có kịch bản 10 dòng.
Brendan vào

Điều này và câu trả lời pam là tốt nhất ở đây, cảm ơn. Không bao giờ lộn xộn với các tập tin bằng tay nếu bạn có thể tránh nó.
h4unt3r

1
DKA @ dev-04: / $ / sbin / mkhomedir_helper DKA DKA @ dev-04: / $ cd bash: cd: / home / DKA: Không có tập tin hoặc thư mục
Dimitri Kopriwa

@DimitriKopriwa bạn đã thử nó như root sudo /sbin/mkhomedir_helper dkachưa? các /homethư mục thuộc về rootngười sử dụng, và vì vậy tôi sẽ tưởng tượng người ta sẽ có được root để tạo ra một thư mục con của nó.
Jonathan

15

Bạn sẽ cần phải tạo thư mục người dùng bằng tay. Điều này đòi hỏi ba bước:

  1. Tạo thư mục tuân thủ /etc/passwd, thường sẽ có mục / home / đăng nhập.
  2. Sao chép các tập tin ban đầu từ / etc / skel
  3. Và cuối cùng đặt quyền:

    • mkdir /home/YOU
    • cd /home/YOU
    • cp -r /etc/skel/. .
    • chown -R YOU.YOURGROUP .
    • chmod -R go=u,go-w .
    • chmod go= .

BTW: Tôi luôn bỏ lỡ -mtùy chọn cho useradd. Ít nhất các hệ thống dựa trên Debian nên có một adduserlệnh mà tôi khuyên dùng trên useradd. Nếu bạn bỏ lỡ -mtùy chọn, nó cũng có thể đáng xem xét deluservà sau đó tạo lại người dùng với các tùy chọn phù hợp.

Chỉnh sửa: Đã thêm -rđể sao chép thư mục.


Đã làm điều đó: usernameh = myusername; mkdir / nhà / $ tên người dùng; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh: $ usernameh / home / $ usernameh; chmod -R 755 / nhà / $ usernameh;
Aki

Cá nhân tôi không thích 755 chmod, vì nó cho phép người dùng theo dõi nhà của người dùng khác. Tôi nghĩ rằng mỗi người dùng nên cấp quyền truy cập cho người khác. Khi public_htmlcần ít nhất xmột chút, tôi sẽ giới thiệu chmod 0711ở mỗi nhà public_htmlvà các thư mục tương tự như mặc định.
toán

đồng thời, sử dụng cp -r cho skel, vì nếu không nó sẽ không sao chép các thư mục (.ssh).
Aki

Trên hệ thống của tôi (Arch Linux trên ARM) cp -r /etc/skel/.*quay trở lại vào / etc / và sao chép tất cả dữ liệu từ đây (/etc/skel/.* khớp / etc / skel / .. Tôi mong đợi). Giải pháp từ superuser.com/a/61619/22153 dường như hoạt động: cp -r / etc / skel / home / user (/ home / user không được tồn tại trước khi chạy lệnh)
zpon 18/12/14

Tôi đoán bạn vỏ toàn cầu mở rộng *với .(dấu chấm). Thế ..là khớp. Tôi có đúng không Nhiều shell vô hiệu hóa điều này theo mặc định, vì hành vi như vậy. Bạn sử dụng vỏ nào?
toán

14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

Tôi nên làm điều đó


2
nó nói : usermod: no changes. và thư mục không được tạo. Nó không hoạt động với -mtùy chọn.
cd1

1
Ổn thỏa. Tôi đã tìm ra lý do tại sao điều đó không hoạt động, useradd thường chỉ đặt $ HOME_DIR vào / nhà trừ khi bạn chỉ định khác. Bây giờ nó dường như tự động đặt nó vào / home / $ USER thay thế. Một cách rẻ tiền có thể là usermod -d / home / john2 -m john sau đó chạy usermod -d / home / john -m.
David Rickman

Nevermind mà cũng không hoạt động.
David Rickman

1
Vâng ít nhất bạn đã học được một cái gì đó mới.
David Rickman

1
Bạn đã quên sao chép nội dung của / etc / skel / + chown đệ quy cho các tệp mới đó. usermod sẽ không hoạt động vì ở đây thư mục đã được đăng ký nhưng không được tạo, usermod sẽ không làm gì cả.
Aki

9

Bạn có thể sử dụng một cái gì đó như pam_mkhomedir để ngăn điều này trở thành một vấn đề với bất kỳ người dùng nào trong tương lai. pam_mkhomedir là mô-đun PAM tự động tạo thư mục chính của người dùng khi đăng nhập nếu nó không tồn tại và điền vào đó các tệp từ / etc / skel (hoặc bất kỳ thư mục skel nào bạn chỉ định).

Đây cũng là một cách tiếp cận có thể mở rộng độc đáo vì nó sẽ tiếp tục giải quyết vấn đề này nếu bạn chuyển đổi kho lưu trữ người dùng của mình sang một dịch vụ thư mục như LDAP trong tương lai.


4

Trong trường hợp của tôi, âm lượng nhà bị hỏng và tôi quyết định chỉ xây dựng lại từ đầu vì không có nhiều dữ liệu liên quan nhưng tôi muốn giữ thông tin đăng nhập của người dùng, vì vậy tôi đã tạo lại các thư mục gốc theo cách thủ công với tập lệnh này:

#!/bin/bash
cat /etc/passwd | while IFS=: read n x i g c d r
do
  # my system has uid started at 1000, but has nfsnobody at 65534:
  if [[ "$i" -ge 1000 && "$i" -le 65000 && ! -x "$d" ]]
  then
    cp -av /etc/skel "$d"
    chown -R "$i:$g" "$d"
    # may needed in SELinux system:
    restorecon -R "$d"
    # add your chmod as your need:
    chmod -R o-rw "$d"
  fi
done

2

Nếu bạn chỉnh sửa /etc/login.defsđể chứa

CREATE_HOME yes

sau đó các thư mục chính sẽ được tạo tự động cho bất kỳ người dùng nào trong tương lai, trừ khi bạn yêu cầu hệ thống không làm như vậy.

Một tùy chọn khác là sử dụng PAM để đăng nhập và sử dụng mô-đun pam_mkhomedir để tự động tạo homedir trong lần đăng nhập đầu tiên.


0

Bước đầu tiên của tôi sau khi làm một useraddsu - <user>.

Tạo các thư mục nhà, sao chép bộ xương, v.v. - ít nhất là trên hộp CentOS 4 tôi thường xuyên làm điều đó.


0

Đăng nhập với người dùng john và viết từ shell:

xdg-user-dirs-update

Đó là nó! Không sử dụng sudo hoặc su, bạn không cần quyền truy cập root để tạo một số thư mục. Từ tài khoản root, bạn có thể sử dụng:

sudo -u john xdg-user-dirs-update

Bằng cách đó, bạn sẽ thực thi lệnh dưới dạng john, điều đó có thể hữu ích nếu bạn mắc lỗi với nhiều hơn một người dùng.


-1

Đây chính xác là những gì mkhomedir_helper $USERNAMElệnh làm.


1
Không có giá trị nào được thêm vào bằng cách lặp lại những gì một câu trả lời khác đã được giải thích hai năm trước.
kasperd

-2

Bạn chỉ có thể chỉnh sửa / etc / passwd. Trường thứ hai đến trường cuối cùng là thư mục chính của người dùng.

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash

Họ đã được tạo. Các thư mục nhà không được tạo vì anh ta quên một công tắc.
David Rickman

Tôi không có ý định thay đổi thư mục chính của người dùng, tôi có nghĩa là tạo thư mục và sao chép các tập tin bộ xương vào đó với các quyền thích hợp sau khi người dùng đã được thêm.
cd1

-2
usermod -d /home/john john

hoặc là

usermod --home /home/john john

và đọc

man usermod

;)


2
Câu hỏi phức tạp hơn thế - và đã có câu trả lời tốt hơn.
Esa Jokinen
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.