در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیستکردن کاربران سیستمعامل لینوکس به کار گرفته میشود و کاربردش چیست. در ادامه با ما همراه باشید.
فایل /etc/passwd حاوی یک خط برای هر کدام از حسابهای کاربری لینوکس است. در این خطوط تعداد ۷ فیلد وجود دارند که به وسیله علامت نقلقول از هم جدا میشوند. از آنجایی که این یک فایل متنی است، به راحتی میتوانید در لینوکس با فرمان cat یا سایر فرمانها مانند grep یا egrep به تهیه لیست کلی کاربران بپردازید.
تهیه لیست کلی کاربران لینوکس با استفاده از فایل /etc/passwd
برای تهیه لیست کلی کاربران در این لینوکس، از فرمان cat به صورت زیر استفاده کنید.
[php]
$ cat /etc/passwd
[/php]
در نتیجه، خروجیای مشابه زیر مشاهده میشود.
[php]
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
….
..
…
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
[/php]
هر کدام از خطوط این فایل دارای ۷ فیلد به صورت زیر است. به عنوان مثال اگر این خط را در نظر بگیرید:
[php]
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
[/php]
در اینجا:
- vnstat – کلمه کاربری یا عنوان ورود
- x – پسورد رمزنگاری شده که در فایل the /etc/shadow ذخیره میشود.
- 131 – عدد شناسه کاربر یا UID
- 137 – عدد شناسه گروه اصلی یا GID
- vnstat daemon – GECOS. این فیلد میتواند شامل نام کامل کاربر (یا برنامه، در صورت اختصاص کاربر به برنامه)، شماره پلاک ساختمان یا اتاق یا تماس شخص، تلفن دفتر، تلفن منزل و هر گونه اطلاعات تماس دیگر باشد.
- /var/lib/vnstat – دایرکتوری خانگی برای کاربر.
- /usr/sbin/nologin – پوسته ورودی کاربرد. مسیرهای موردتأیید ورود کاربر از فایل /etc/shells گرفته میشوند.
لیستکردن کاربران لینوکس با استفاده از pager ها
امکان استفاده از pager ها مانند فرمانهای more/less به صورت زیر برای مشاهده فایل /etc/passwd وجود دارد.
[php]
$ more /etc/passwd
$ less /etc/passwd
[/php]
نمونه خروجی

نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو
تمام فیلدها با علامت نقلقول (:) از هم جدا میشوند. در مجموع ۷ فیلد برای هر کاربر وجود دارد. اولین فیلد، نام کاربری است. این نام در هنگام ورود کاربر مورداستفاده قرار میگیرد و باید بین یک تا ۳۲ کاراکتر باشد. البته امکان محدودسازی خروجی با استفاده از فرمانهای head و tail به صورت زیر وجود دارد:
[php]
tail -5 /etc/passwd
head -5 /etc/passwd
[/php]
تهیه لیست تنها از نامهای کاربری لینوکس
برای تهیه لیست صرفاً از نامهای کاربری لینوکس میتوان از فرمان awk به صورت زیر استفاده کرد.
[php]
$ awk -F’:’ ‘{ print $1}’ /etc/passwd
[/php]
نمونه خروجی
[php]
root
daemon
bin
sys
sync
games
man
lp
news
….
..
..hplip
vivek
bind
haldaemon
sshd
mysql
radvd
[/php]
گزینه دیگر استفاده از فرمان cut است.
[php]
$ cut -d: -f1 /etc/passwd
[/php]
تهیه لیست کلی کاربران لینوکس با استفاده از فرمان getent
برای تهیه لیست از تمام کاربران لینوکس با کمک فرمان getent داریم:
[php]
$ getent passwd
$ getent passwd | grep tom
## get a list all users ##
$ getent passwd | cut -d: -f1
## count all user accounts using the wc ##
$ getent passwd | wc -l
[/php]
البته امکان استفاده از فرمان compgen در لینوکس برای تهیه لیست کاربران و سایر منابع وجود دارد.
[php]
$ compgen -u
[/php]
تشخیص وجود یک حساب کاربری در لینوکس
میتوانیم با کمک فرمان grep و فرمانهای بالا از وجود یک کاربر خاص در سیستم لینوکس مطمئن شویم.
[php]
compgen -u | grep vivek
getent passwd | grep -q sai && echo "User sai found" || echo "User sai not found"
compgen -u | grep -q ram && echo "User ram found" || echo "User ram not found"
[/php]
نسخه سادهسازی شده این فرمان به صورت زیر خواهد بود.
[php]
getent passwd {username}
getent passwd vivek
[/php]
نحوه شمارش حسابهای کاربری در سرور لینوکس
اگر میخواهید تعداد کاربران سیستم خود را بدانید، میتوانید از فرمان wc به صورت زیر استفاده کنید.
[php]
$ compgen -u | wc -l
$ getent passwd | wc -l
[/php]

تعداد حسابهای کاربری در لینوکس
نکتهای در مورد سیستم و کاربران جنرال
هر کاربر دارای یک شناسه با عنوان UID است. UID در فایل /etc/passwd تعریف میشود. UID هر کدام از کاربران به صورت خودکار با استفاده از فایل /etc/login.defs در هنگام کاربرد فرمان useradd اختصاص می یابد. برای مشاهده مقادیر کنونی، فرمان زیر را تایپ کنید.
[php]
$ grep "^UID_MIN" /etc/login.defs
$ grep UID_MIN /etc/login.defs
[/php]
نمونه خروجی
[php]
UID_MIN 1000
#SYS_UID_MIN 100
[/php]
عدد 1000 کمترین مقدار برای انتخاب UID در فرمان useradd است. به عبارت دیگر، تمام کاربران عادی سیستم میبایست شناسهای بزرگتر یا مساوی 1000 داشته باشند. تنها این کاربران اجازه وورد به سیستم خواهند داشت. فرمان زیر را برای تهیه لیست کلی کاربران وارد شده تایپ کنید.
[php]
## get UID limit ##
l=$(grep "^UID_MIN" /etc/login.defs)
## use awk to print if UID >= $UID_LIMIT ##
awk -F’:’ -v "limit=${l##UID_MIN}" ‘{ if ( $3 >= limit ) print $1}’ /etc/passwd
برای مشاهده مقادیر حداکثر انتخاب اتوماتیک UID در فرمان useradd داریم:
$ grep "^UID_MAX" /etc/login.defs
[/php]
نمونه خروجی
[php]
UID_MAX 60000
[/php]
به عبارت دیگر، حداقل UID برای کاربران سیستم برابر 1000 و فایل UID /etc/shells است. در اینجا، کد بروز شده را برای دریافت جزئیات میبینید.
[php]
## get mini UID limit ##
l=$(grep "^UID_MIN" /etc/login.defs)
## get max UID limit ##
l1=$(grep "^UID_MAX" /etc/login.defs)
## use awk to print if UID >= $MIN and UID <= $MAX ##
awk -F’:’ -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" ‘{ if ( $3 >= min && $3 <= max ) print $0}’ /etc/passwd
[/php]
نمونه خروجی
[php]
vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
jwww:x:504:504::/htdocs/html:/sbin/nologin
wwwcorp:x:505:505::/htdocs/corp:/sbin/nologin
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh
[/php]
/sbin/nologin برای رد مؤدبانه یک درخواست ورود به کار رفته است. به عنوان مثال، /sbin/nologin پیغامی را مبنی بر عدم وجود کاربر موردنظر نشان میدهد. این در واقع، جایگزینی برای پوسته حسابهایی است که مسدود شدهاند و یا اینکه شما نمیخواهید از طریق ssh به سیستم وارد شوند. برای فیلتر کردن /sbin/nologin، فرمان زیر را وارد کنید.
[php]
#!/bin/bash
# Name: listusers.bash
# Purpose: List all normal user accounts in the system. Tested on RHEL / Debian Linux to List All Users on Linux
# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+
# ———————————————————————————–
_l="/etc/login.defs"
_p="/etc/passwd"
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ##
awk -F’:’ -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" ‘{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) "$_p"
[/php]
نمونه خروجی
[php]
vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh
[/php]
نهایتاً، این اسکریپت، لیستی کلی از سیستم و حسابهای کاربری را ارائه میدهد.
[php]
#!/bin/bash
# Name: listusers.bash
# Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux
# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+
# ———————————————————————————–
_l="/etc/login.defs"
_p="/etc/passwd"
## get mini UID limit ##
l=$(grep "^UID_MIN" $_l)
## get max UID limit ##
l1=$(grep "^UID_MAX" $_l)
## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ##
echo "———-[ Normal User Accounts ]—————"
awk -F’:’ -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" ‘{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }’ "$_p"
echo ""
echo "———-[ System User Accounts ]—————"
awk -F’:’ -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" ‘{ if ( !($3 >= min && $3 <= max && $7 != "/sbin/nologin")) print $0 }’ "$_p"
[/php]
نمونه خروجی
[php]
———-[ Normal User Accounts ]—————
vivek:x:500:500::/home/vivek:/bin/bash
raj:x:501:501::/home/raj:/bin/ksh
ash:x:502:502::/home/ash:/bin/zsh
jadmin:x:503:503::/home/jadmin:/bin/sh
wwwint:x:506:506::/htdocs/intranet:/bin/bash
scpftp:x:507:507::/htdocs/ftpjail:/bin/bash
rsynftp:x:508:508::/htdocs/projets:/bin/bash
mirror:x:509:509::/htdocs:/bin/bash
jony:x:510:510::/home/jony:/bin/ksh
amyk:x:511:511::/home/amyk:/bin/ksh
———-[ Linux List All Users (System User Accounts) ]—————
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
memcached:x:498:496:Memcached daemon:/var/run/memcached:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[/php]
جمعبندی
در این مطلب با نحوه تهیه لیست کلی کاربران در سیستم لینوکس آشنا شدیم. فرمانهای getent، cat، more، cut و فرمانهای دیگر میتوانند برای دریافت لیست کاربران در لینوکس به کار آیند.