رفتن به محتوا
LoopX

کاربرها و گروه‌ها

توی این درس یاد می‌گیری لینوکس چند کاربره است: هر پروسه و هر فایل مالک دارد و مالک یک کاربر (user) و یک گروه (group) است. می‌فهمی «کاربر» در واقع یک عدد به اسم UID است، اطلاعات کاربرها در /etc/passwd و گروه‌ها در /etc/group نگه‌داری می‌شود، و هر کاربر یک گروه اصلی و چند گروه اضافی دارد. با id، whoami و groups می‌بینی چه کسی هستی، با useradd -m کاربر می‌سازی، با usermod -aG به گروه اضافه‌اش می‌کنی، با passwd رمز و قفل را مدیریت می‌کنی و با userdel پاکش می‌کنی.

مسئله: چه کسی چه کاری می‌تواند بکند؟

Section titled “مسئله: چه کسی چه کاری می‌تواند بکند؟”

یک سرور واقعی تنها یک نفر ندارد: برنامه‌نویس‌ها، سرویس‌هایی مثل nginx و دیتابیس، مدیران سیستم. اگر همه با یک حساب کار کنند، هیچ‌کس مسئول چیزی نیست و یک اشتباه همه‌چیز را می‌برد. لینوکس اجازه می‌دهد هر آدم (و هر سرویس) حساب جدا داشته باشد و دسترسی‌ها (درس بعد) روی «چه کسی» تعیین شود. پایه‌ی همه‌ی این‌ها: کاربر و گروه.

تشبیه: کارت شناسایی و گروه‌های کاری

Section titled “تشبیه: کارت شناسایی و گروه‌های کاری”

هر کاربر مثل یک کارمند با کارت شناسایی است: یک شماره‌ی کارمندی یکتا (UID) دارد (نه فقط اسم، چون سیستم با عدد کار می‌کند). هر کارمند یک بخش اصلی (گروه اصلی) دارد و می‌تواند عضو چند کمیته (گروه‌های اضافی) هم باشد. دسترسی به اتاق‌ها (فایل‌ها) را بر اساس «تو کی هستی» یا «عضو کدام گروه هستی» می‌دهند.

کاربر ← UID؛ هر کاربر یک گروه اصلی (GID) و چند گروه اضافی دارد. فایل‌ها به یک کاربر و یک گروه تعلق دارند. اطلاعات در /etc/passwd و /etc/group (و رمزها در /etc/shadow) است.

مثال ۱: من کی هستم؟ id، whoami، groups

Section titled “مثال ۱: من کی هستم؟ id، whoami، groups”
Terminal window
whoami
id
echo "--- جدا:"
echo "UID=$(id -u) GID=$(id -g) نام=$(id -un) گروه اصلی=$(id -gn)"
echo "گروه‌ها: $(groups)"
echo "--- کاربر دیگر (root):"
id root
خروجی
ali
uid=1001(ali) gid=1001(ali) groups=1001(ali)
--- جدا:
UID=1001 GID=1001 نام=ali گروه اصلی=ali
گروه‌ها: ali
--- کاربر دیگر (root):
uid=0(root) gid=0(root) groups=0(root)

خروجی id: uid=1001(ali) شماره‌ی کاربر و اسمش، gid=1001(ali) گروه اصلی، و groups=... همه‌ی گروه‌هایم. root همیشه UID 0 است: «مدیر» بودن به عدد ۰ وابسته است، نه به اسم. (در درس root و sudo بیشتر.)

مثال ۲: /etc/passwd، فهرست کاربرها

Section titled “مثال ۲: /etc/passwd، فهرست کاربرها”

اطلاعات کاربرها در یک فایل متنی ساده است. هر خط ۷ فیلد با ::

Terminal window
grep '^ali:' /etc/passwd
echo "--- فیلدها:"
grep '^ali:' /etc/passwd | awk -F: '{print "1) نام:", $1; print "2) رمز (x یعنی در shadow):", $2; print "3) UID:", $3; print "4) GID گروه اصلی:", $4; print "5) توضیح (GECOS):", ($5==""?"(خالی)":$5); print "6) پوشه‌ی خانه:", $6; print "7) shell:", $7}'
خروجی
ali:x:1001:1001::/home/ali:/bin/bash
--- فیلدها:
1) نام: ali
2) رمز (x یعنی در shadow): x
3) UID: 1001
4) GID گروه اصلی: 1001
5) توضیح (GECOS): (خالی)
6) پوشه‌ی خانه: /home/ali
7) shell: /bin/bash

فیلد دوم x یعنی رمز واقعاً اینجا نیست و در /etc/shadow است (فقط root می‌خواند). برای پرسیدن امن‌تر از پایگاه کاربرها (که ممکن است از LDAP هم بیاید) از getent استفاده کن:

Terminal window
getent passwd ali
echo "--- کاربرهای عادی (UID از 1000 به بالا):"
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3}' /etc/passwd
echo "--- چند کاربر سیستمی (UID < 1000) و shell شان:"
awk -F: '$3 < 1000 {print $1, $3, $7}' /etc/passwd | head -4
خروجی
ali:x:1001:1001::/home/ali:/bin/bash
--- کاربرهای عادی (UID از 1000 به بالا):
ubuntu 1000
ali 1001
--- چند کاربر سیستمی (UID < 1000) و shell شان:
root 0 /bin/bash
daemon 1 /usr/sbin/nologin
bin 2 /usr/sbin/nologin
sys 3 /usr/sbin/nologin

کاربرهای عادی UID ≥ ۱۰۰۰ دارند؛ کاربرهای سیستمی (برای سرویس‌ها) UID کمتر و معمولاً shell ‌شان nologin است (یعنی نمی‌توان با آن‌ها وارد شد).

مثال ۳: /etc/group و رمزها در /etc/shadow

Section titled “مثال ۳: /etc/group و رمزها در /etc/shadow”
Terminal window
head -3 /etc/group
echo "--- گروه sudo (چه کسانی عضوند):"
getent group sudo
echo "--- shadow برای کاربر عادی خوانا نیست:"
ls -l /etc/shadow
cat /etc/shadow 2>&1 | head -1
خروجی
root:x:0:
daemon:x:1:
bin:x:2:
--- گروه sudo (چه کسانی عضوند):
sudo:x:27:ubuntu
--- shadow برای کاربر عادی خوانا نیست:
-rw-r----- 1 root shadow 665 Oct 3 20:24 /etc/shadow
cat: /etc/shadow: Permission denied

هر خط /etc/group: نام:رمز:GID:اعضای‌اضافی. گروه sudo همان است که اجازه‌ی استفاده از sudo را می‌دهد. و /etc/shadow (رمزهای هش‌شده) فقط برای root قابل خواندن است (-rw-r----- و مالک root:shadow). هیچ‌وقت رمز خام ذخیره نمی‌شود.

⚡ بررسی سریع

فیلد دوم /etc/passwd (x) یعنی چه؟

مثال ۴: ساختن کاربر، useradd

Section titled “مثال ۴: ساختن کاربر، useradd”

برای ساختن کاربر به دسترسی مدیر نیاز داری (sudo، درس‌های بعد). useradd با flag های مهم:

Terminal window
sudo useradd -m -s /bin/bash -c "Demo User" demo
getent passwd demo
echo "--- پوشه‌ی خانه‌ی ساخته‌شده و محتوایش (از /etc/skel):"
sudo ls -la /home/demo | awk 'NR>1 {print $1, $3, $4, $9}'
echo "--- گروه اصلی خودکار ساخته شد:"
getent group demo
id demo
خروجی
demo:x:1002:1002:Demo User:/home/demo:/bin/bash
--- پوشه‌ی خانه‌ی ساخته‌شده و محتوایش (از /etc/skel):
drwxr-x--- demo demo .
drwxr-xr-x root root ..
-rw-r--r-- demo demo .bash_logout
-rw-r--r-- demo demo .bashrc
-rw-r--r-- demo demo .profile
--- گروه اصلی خودکار ساخته شد:
demo:x:1002:
uid=1002(demo) gid=1002(demo) groups=1002(demo)

flag ها: -m (create home: پوشه‌ی خانه را بساز و فایل‌های پایه‌ی /etc/skel را در آن کپی کن؛ بدون -m پوشه ساخته نمی‌شود)، -s shell، -c توضیح (نام کامل). به‌طور پیش‌فرض یک گروه هم‌نام با کاربر (گروه اصلی) و یک UID بعدی (≥ ۱۰۰۰) ساخته می‌شود. (برای دیدن پوشه‌ی خانه‌ی demo از sudo استفاده کردم: در Ubuntu جدید پوشه‌ی خانه‌ی کاربرها با دسترسی drwxr-x--- ساخته می‌شود و دیگران نمی‌توانند داخلش را ببینند.)

مثال ۵: useradd در برابر adduser

Section titled “مثال ۵: useradd در برابر adduser”

روی Debian/Ubuntu دو دستور هست. useradd سطح پایین است و پیش‌فرض‌های کم دارد؛ adduser یک اسکریپت دوستانه‌تر است:

Terminal window
echo "--- پیش‌فرض‌های useradd (shell پیش‌فرض را ببین):"
useradd -D | grep -E "SHELL|HOME|SKEL"
sudo useradd -m reza
getent passwd reza | cut -d: -f1,6,7
echo "--- با adduser (غیرتعاملی):"
sudo adduser --disabled-password --gecos "" svcuser 2>&1 | tail -2
getent passwd svcuser | cut -d: -f1,6,7
sudo userdel -r reza; sudo deluser --remove-home svcuser >/dev/null 2>&1
خروجی
--- پیش‌فرض‌های useradd (shell پیش‌فرض را ببین):
HOME=/home
SHELL=/bin/sh
SKEL=/etc/skel
reza:/home/reza:/bin/sh
--- با adduser (غیرتعاملی):
info: Adding new user `svcuser' to supplemental / extra groups `users' ...
info: Adding user `svcuser' to group `users' ...
svcuser:/home/svcuser:/bin/bash
userdel: reza mail spool (/var/mail/reza) not found

دقت کن: useradd -m reza بدون -s به کاربر /bin/sh داد (یک shell ساده، بدون Tab و تاریخچه)، ولی adduser خودش /bin/bash گذاشت و پوشه‌ی خانه ساخت. برای همین در درس‌ها و کار تیمی useradd -m -s /bin/bash را کامل می‌نویسیم یا از adduser در سرورهای Ubuntu استفاده می‌کنیم (که برای ما تعاملی رمز و نام می‌پرسد).

برای رمز گذاشتن: sudo passwd demo (دوبار رمز را می‌پرسد؛ تایپ نمایش داده نمی‌شود). چون اینجا تعاملی نیست، وضعیت رمز را می‌خوانیم و قفل/بازکردن را می‌بینیم:

Terminal window
echo "--- وضعیت رمز demo (L = قفل، NP = بدون رمز، P = رمز دارد):"
sudo passwd -S demo | cut -d' ' -f1,2
sudo passwd -l demo
sudo passwd -S demo | cut -d' ' -f1,2
echo "--- در shadow فیلد رمز demo (فقط ساختار):"
sudo getent shadow demo | cut -d: -f1,2
خروجی
--- وضعیت رمز demo (L = قفل، NP = بدون رمز، P = رمز دارد):
demo L
passwd: password changed.
demo L
--- در shadow فیلد رمز demo (فقط ساختار):
demo:!

کاربر تازه‌ساخته‌شده با useradd رمز ندارد و قفل است (! در shadow): تا رمز نگذاری نمی‌تواند با رمز وارد شود. passwd -l قفل می‌کند (یک ! به ابتدای هش اضافه می‌کند)، passwd -u بازمی‌کند و passwd -S وضعیت را می‌گوید (ستون دوم: L قفل، P رمز دارد، NP بدون رمز). برای کارمندی که رفته: قفل کردن (و نه فوراً حذف) راهی امن است تا فایل‌هایش و تاریخچه بماند. (در کار خودکار، رمز را با chpasswd از ورودی می‌دهند؛ رمز واقعی را هرگز در اسکریپت یا تاریخچه نگه ندار.)

مثال ۷: گروه‌ها، groupadd و usermod -aG

Section titled “مثال ۷: گروه‌ها، groupadd و usermod -aG”
Terminal window
sudo groupadd developers
getent group developers
echo "--- افزودن demo به گروه developers (-aG):"
sudo usermod -aG developers demo
id demo
echo "--- groups:"
groups demo
خروجی
developers:x:1003:
--- افزودن demo به گروه developers (-aG):
uid=1002(demo) gid=1002(demo) groups=1002(demo),1003(developers)
--- groups:
demo : demo developers

-a (append) و -G (گروه‌های اضافی): کاربر به گروه اضافه می‌شود. اگر -a را فراموش کنی، -G فهرست گروه‌های اضافی کاربر را با فهرست جدید جایگزین می‌کند و از بقیه‌ی گروه‌ها (حتی sudo) خارجش می‌کند:

Terminal window
sudo usermod -aG sudo demo
echo "قبل: $(id -Gn demo)"
sudo usermod -G developers demo # بدون -a!
echo "بعد از usermod -G بدون -a: $(id -Gn demo)"
sudo usermod -aG developers demo
خروجی
قبل: demo sudo developers
بعد از usermod -G بدون -a: demo developers

گروه sudo از بین رفت. این از اشتباهات بسیار رایج (و گاهی خطرناک روی سرور واقعی: ممکن است خودت را از sudo بیرون بیندازی) است.

مثال ۸: گروه‌ها فوراً اعمال نمی‌شوند

Section titled “مثال ۸: گروه‌ها فوراً اعمال نمی‌شوند”

وقتی کاربری را به گروه اضافه می‌کنی، session های فعلی او گروه جدید را نمی‌بینند؛ باید دوباره وارد شود:

Terminal window
sudo usermod -aG developers ali
echo "پایگاه داده: $(id -Gn ali)"
echo "shell فعلی من هنوز: $(id -Gn)"
echo "--- یک session تازه (sudo -u ali id):"
sudo -u ali id -Gn
echo "--- یا فعال‌سازی موقت گروه در همین shell: newgrp"
sudo gpasswd -d ali developers >/dev/null
خروجی
پایگاه داده: ali developers
shell فعلی من هنوز: ali
--- یک session تازه (sudo -u ali id):
ali developers
--- یا فعال‌سازی موقت گروه در همین shell: newgrp

id ali (از پایگاه کاربرها) گروه را دارد ولی id در shell جاری هنوز قدیمی است، چون گروه‌ها هنگام ورود (login) خوانده می‌شوند. راه‌حل: خروج و ورود دوباره، یا newgrp developers، یا یک session تازه (مثل sudo -u ali ... که اینجا نشان داد). مشکل رایج: «او را به گروه اضافه کردم ولی هنوز دسترسی ندارد»؛ بگو دوباره وارد شود.

مثال ۹: کاربر سیستمی برای سرویس

Section titled “مثال ۹: کاربر سیستمی برای سرویس”

سرویس‌ها نباید با حساب شخصی یا root اجرا شوند؛ یک کاربر سیستمی بدون shell و بدون پوشه‌ی خانه برایشان می‌سازی:

Terminal window
sudo useradd -r -s /usr/sbin/nologin -c "App Service" svc-app
getent passwd svc-app
echo "UID سیستمی (< 1000): $(id -u svc-app)"
echo "--- ورود با آن ممکن نیست:"
sudo su - svc-app 2>&1 | head -2
echo "--- ولی می‌توان یک دستور را با هویت او اجرا کرد:"
sudo -u svc-app id -un
خروجی
svc-app:x:999:994:App Service:/home/svc-app:/usr/sbin/nologin
UID سیستمی (< 1000): 999
--- ورود با آن ممکن نیست:
su: warning: cannot change directory to /home/svc-app: No such file or directory
This account is currently not available.
--- ولی می‌توان یک دستور را با هویت او اجرا کرد:
svc-app

-r (system) یعنی UID از بازه‌ی سیستمی و پوشه‌ی خانه ساخته نشود؛ nologin ورود را رد می‌کند. اصل کمترین دسترسی: اگر سرویس هک شود، مهاجم فقط همین حساب بی‌اختیار را دارد. (مثل www-data برای nginx یا postgres.)

مثال ۱۰: تغییر و حذف کاربر

Section titled “مثال ۱۰: تغییر و حذف کاربر”
Terminal window
echo "--- تغییر shell و توضیح:"
sudo usermod -s /bin/zsh -c "Demo Changed" demo
getent passwd demo | cut -d: -f1,5,7
echo "--- قفل کردن حساب (usermod -L) و باز کردن (-U):"
sudo usermod -L demo; sudo passwd -S demo | cut -d' ' -f1,2
sudo usermod -U demo; sudo passwd -S demo | cut -d' ' -f1,2
echo "--- تغییر نام ورود (usermod -l):"
sudo usermod -l demo2 demo
getent passwd demo2 | cut -d: -f1,3
sudo usermod -l demo demo2
echo "--- حذف با userdel -r (پوشه‌ی خانه را هم می‌برد):"
ls -d /home/demo
sudo userdel -r demo 2>&1 | head -1
ls -d /home/demo 2>&1 | head -1
sudo userdel svc-app
sudo groupdel developers
getent passwd demo svc-app | wc -l
خروجی
--- تغییر shell و توضیح:
demo:Demo Changed:/bin/zsh
--- قفل کردن حساب (usermod -L) و باز کردن (-U):
demo L
usermod: unlocking the user's password would result in a passwordless account.
You should set a password with usermod -p to unlock this user's password.
demo L
--- تغییر نام ورود (usermod -l):
demo2:1002
--- حذف با userdel -r (پوشه‌ی خانه را هم می‌برد):
/home/demo
userdel: demo mail spool (/var/mail/demo) not found
ls: cannot access '/home/demo': No such file or directory
0

دقت کن که usermod -U برای حسابی که اصلاً رمز ندارد خطا داد (unlocking ... would result in a passwordless account): سیستم اجازه نمی‌دهد با باز کردن قفل یک حساب بدون رمز بسازی؛ اول رمز بگذار. userdel -r کاربر و پوشه‌ی خانه (و صف ایمیلش) را حذف می‌کند (پیام «mail spool not found» فقط یک هشدار بی‌اهمیت است چون این سیستم صف ایمیل ندارد)؛ بدون -r فایل‌هایش می‌مانند و مالک شان یک UID یتیم می‌شود. قبل از حذف، فایل‌های مهم او را بررسی کن (find / -user demo در درس پیدا کردن فایل‌ها). groupdel گروهی را که گروه اصلی هیچ کاربری نیست حذف می‌کند.

پشت پرده: سیستم کاربر و گروه چگونه کار می‌کند؟

Section titled “پشت پرده: سیستم کاربر و گروه چگونه کار می‌کند؟”

هسته فقط عدد می‌شناسد: هر پروسه یک UID و یک یا چند GID دارد و هر فایل یک UID مالک و یک GID گروه. اسم‌ها فقط برای انسان‌اند و هنگام نمایش از پایگاه‌های متنی (/etc/passwd و /etc/group، یا سرویس‌های دیگر مثل LDAP، از راه NSS) ترجمه می‌شوند. برای همین اگر کاربری حذف شود ولی فایل‌هایش بماند، ls -l به‌جای اسم یک عدد نشان می‌دهد (مالک «یتیم»).

وقتی وارد می‌شوی (login)، سیستم UID و GID اصلی و همه‌ی گروه‌های اضافی تو را به پروسه‌ی shell تو می‌دهد و همه‌ی پروسه‌هایی که از آن می‌سازی این هویت را به ارث می‌برند. کنترل دسترسی (درس بعد) فقط این اعداد را با مالک و گروه فایل مقایسه می‌کند. و بازه‌ی UID ها (از /etc/login.defs): ۰ root، ۱–۹۹۹ سیستمی، ۱۰۰۰ به بالا کاربر عادی؛ 65534 کاربر nobody.

دو فایل مهم دیگر: /etc/shadow (رمزهای هش‌شده + قفل و انقضا)، و /etc/gshadow. فرمت هش رمز ($y$... یعنی yescrypt یا $6$... یعنی SHA-512) شامل الگوریتم، نمک (salt) و هش است؛ نمک باعث می‌شود دو کاربر با یک رمز، هش متفاوت داشته باشند. فقط خود شخص یا root رمز را عوض می‌کند.

دستور کار
id [کاربر] UID، GID و گروه‌ها
whoami نام کاربر فعلی
groups [کاربر] گروه‌های کاربر
getent passwd نام اطلاعات کاربر
sudo useradd -m -s /bin/bash -c "نام" user ساخت کاربر با پوشه‌ی خانه
sudo useradd -r -s /usr/sbin/nologin svc کاربر سیستمی
sudo adduser user ساخت کاربر (تعاملی، Debian/Ubuntu)
sudo passwd user تعیین رمز
sudo passwd -l/-u user قفل / بازکردن
sudo usermod -aG grp user افزودن به گروه
sudo usermod -s SHELL user تغییر shell
sudo userdel -r user حذف کاربر با پوشه‌ی خانه
sudo groupadd / groupdel ساخت / حذف گروه
sudo gpasswd -d user grp حذف کاربر از گروه
فایل محتوا
/etc/passwd نام:x:UID:GID:توضیح:خانه:shell
/etc/group نام:x:GID:اعضا
/etc/shadow رمز هش‌شده و انقضا (فقط root)
/etc/skel فایل‌های اولیه‌ی پوشه‌ی کاربر جدید
/etc/login.defs بازه‌ی UID و پیش‌فرض‌ها

مثال ۷: گروه‌های قبلی (از جمله sudo) پاک شد. راه‌حل: همیشه usermod -aG.

Terminal window
sudo useradd nohome
getent passwd nohome | cut -d: -f1,6,7
ls -d /home/nohome 2>&1 | head -1
sudo userdel nohome
خروجی
nohome:/home/nohome:/bin/sh
ls: cannot access '/home/nohome': No such file or directory

کاربر ساخته شد ولی پوشه‌ی خانه‌اش (/home/nohome) وجود ندارد و shell اش هم /bin/sh است. راه‌حل: useradd -m -s /bin/bash.

۳) انتظار فوری بودن گروه جدید

Section titled “۳) انتظار فوری بودن گروه جدید”

مثال ۸. راه‌حل: logout/login یا newgrp.

۴) حذف کاربر بدون بررسی فایل‌ها و سرویس‌های او

Section titled “۴) حذف کاربر بدون بررسی فایل‌ها و سرویس‌های او”
Terminal window
sudo useradd -m temp1
sudo -u temp1 touch /tmp/temp1-file
sudo userdel temp1
ls -ln /tmp/temp1-file | awk '{print "مالک (عدد):", $3}'
ls -l /tmp/temp1-file | awk '{print "مالک (نام):", $3}'
sudo rm /tmp/temp1-file
خروجی
useradd: warning: the home directory /home/temp1 already exists.
useradd: Not copying any file from skel directory into it.
مالک (عدد): 1002
مالک (نام): 1002

بعد از حذف، مالک فایل فقط یک عدد است (فایل یتیم). راه‌حل: قبل از حذف find / -user نام را بررسی و فایل‌ها را منتقل یا پاک کن.

۵) اجرای سرویس با root یا کاربر شخصی

Section titled “۵) اجرای سرویس با root یا کاربر شخصی”

اگر nginx یا دیتابیس با root اجرا شود، هک شدن آن یعنی دسترسی کامل. راه‌حل: کاربر سیستمی اختصاصی (useradd -r) و nologin.

✎ تمرینآسان

اسم، UID و گروه اصلی خودت را با سه دستور جدا چاپ کن و فهرست همه‌ی گروه‌هایت را بنویس.

دیدن جواب
Terminal window
echo "نام: $(id -un) UID: $(id -u) گروه اصلی: $(id -gn)"
echo "همه‌ی گروه‌ها: $(id -Gn)"
خروجی
نام: ali UID: 1001 گروه اصلی: ali
همه‌ی گروه‌ها: ali
✎ تمرینمتوسط

تمرین اصلی: یک کاربر جدید بساز و به گروه دلخواه اضافه کن. کاربر demo را با پوشه‌ی خانه و shell bash بساز، گروه developers را بساز، demo را (با -aG) عضو آن کن و ثابت کن (id، groups). در پایان همه‌چیز را پاک کن.

دیدن جواب
Terminal window
sudo useradd -m -s /bin/bash demo
sudo groupadd developers
sudo usermod -aG developers demo
id demo
groups demo
getent group developers
sudo userdel -r demo; sudo groupdel developers
echo "پاک شد: $(getent passwd demo | wc -l) کاربر demo باقی مانده"
خروجی
uid=1002(demo) gid=1002(demo) groups=1002(demo),1003(developers)
demo : demo developers
developers:x:1003:demo
userdel: demo mail spool (/var/mail/demo) not found
پاک شد: 0 کاربر demo باقی مانده
✎ تمرینسخت

یک اسکریپت adduser-safe بنویس که نام کاربر و گروه را بگیرد، اگر کاربر از قبل وجود داشت خطا بدهد، وگرنه کاربر را با -m -s /bin/bash بسازد، گروه را (اگر نبود) بسازد، کاربر را عضوش کند و خلاصه‌ی id را چاپ کند. دوبار اجرا کن (بار دوم باید خطا بدهد) و در پایان پاکسازی کن.

دیدن جواب
Terminal window
adduser_safe() {
local u="$1" g="$2"
if getent passwd "$u" >/dev/null; then echo "خطا: کاربر $u از قبل هست"; return 1; fi
getent group "$g" >/dev/null || sudo groupadd "$g"
sudo useradd -m -s /bin/bash "$u" && sudo usermod -aG "$g" "$u" && id "$u"
}
adduser_safe reza developers
adduser_safe reza developers
sudo userdel -r reza; sudo groupdel developers
خروجی
uid=1002(reza) gid=1003(reza) groups=1003(reza),1002(developers)
خطا: کاربر reza از قبل هست
userdel: reza mail spool (/var/mail/reza) not found
؟ آزمونک
  1. UID کاربر root چند است؟

  2. در /etc/passwd فیلد دوم x یعنی…

  3. کدام دستور کاربر را با پوشه‌ی خانه و shell bash می‌سازد؟

  4. برای افزودن کاربر به گروه بدون پاک شدن بقیه‌ی گروه‌هایش؟

  5. چرا بعد از usermod -aG کاربر هنوز دسترسی گروه جدید را ندارد؟

  6. کاربر سیستمی برای سرویس‌ها چه ویژگی‌ای دارد؟

  • هسته فقط UID/GID (عدد) می‌شناسد؛ اسم‌ها از /etc/passwd و /etc/group (و رمزها از /etc/shadow) می‌آیند. id، whoami، groups هویت را نشان می‌دهند.
  • هر کاربر یک گروه اصلی و چند گروه اضافی دارد؛ کاربران عادی UID ≥ ۱۰۰۰، سیستمی کمتر.
  • ساخت: sudo useradd -m -s /bin/bash -c "نام" user (یا adduser)؛ رمز: sudo passwd user؛ قفل: passwd -l.
  • گروه: groupadd، usermod -aG (همیشه با -a)، gpasswd -d؛ تغییر گروه پس از login جدید اعمال می‌شود.
  • سرویس‌ها: useradd -r -s /usr/sbin/nologin؛ حذف: userdel -r (بعد از بررسی فایل‌ها).
  • بدون -m پوشه‌ی خانه ساخته نمی‌شود و بدون -s shell پیش‌فرض ممکن است /bin/sh باشد.
برگه‌ی تقلب این درس
دستورکاری که می‌کند
id / id userUID، GID و گروه‌ها
whoami / groupsنام کاربر / گروه‌ها
getent passwd userاطلاعات کاربر
sudo useradd -m -s /bin/bash userساخت کاربر
sudo adduser userساخت کاربر (تعاملی)
sudo passwd userتعیین رمز
sudo passwd -l user / -uقفل / باز کردن
sudo groupadd grpساخت گروه
sudo usermod -aG grp userافزودن به گروه (بدون پاک شدن بقیه)
sudo gpasswd -d user grpحذف از گروه
sudo useradd -r -s /usr/sbin/nologin svcکاربر سیستمی سرویس
sudo userdel -r userحذف کاربر با پوشه‌ی خانه