بلاگ/تهیه لیست کلی از کاربران سیستم لینوکس
به‌روز شده

تهیه لیست کلی از کاربران سیستم لینوکس

در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیست‌کردن کاربران سیستم‌عامل لینوکس به کار گرفته می‌شود و کاربردش چیست. در ادامه با ما همراه باشید. فایل /etc/passwd حاوی یک خط برای هر کدام از حساب‌های کاربری لینوکس است. در این خطوط...

1400/04/193303 بازدید
تهیه لیست کلی از کاربران سیستم لینوکس
در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیست‌کردن کاربران سیستم‌عامل لینوکس به کار گرفته می‌شود و کاربردش چیست. در ادامه با ما همراه باشید. فایل /etc/passwd حاوی یک خط برای هر کدام از حساب‌های کاربری لینوکس است. در این خطوط تعداد ۷ فیلد وجود دارند که  به وسیله علامت نقل‌قول از هم جدا می‌شوند. از آنجایی که این یک فایل متنی است، به راحتی می‌توانید در لینوکس با فرمان cat یا سایر فرمان‌ها مانند grep یا egrep به تهیه لیست کلی کاربران بپردازید.

تهیه لیست کلی کاربران لینوکس با استفاده از فایل /etc/passwd

برای تهیه لیست کلی کاربران در این لینوکس، از فرمان cat به صورت زیر استفاده کنید.
php
$ cat /etc/passwd
در نتیجه، خروجی‌ای مشابه زیر مشاهده می‌شود.
php
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/sh.........vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
هر کدام از خطوط این فایل دارای ۷ فیلد به صورت زیر است. به عنوان مثال اگر این خط را در نظر بگیرید:
php
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
در اینجا:
  • 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
نمونه خروجی
نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو
نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو
تمام فیلدها با علامت نقل‌قول (:) از هم جدا می‌شوند. در مجموع ۷ فیلد برای هر کاربر وجود دارد. اولین فیلد، نام کاربری است. این نام در هنگام ورود کاربر مورداستفاده قرار می‌گیرد و باید بین یک تا ۳۲ کاراکتر باشد. البته امکان محدودسازی خروجی با استفاده از فرمان‌های head و tail به صورت زیر وجود دارد:
php
tail -5 /etc/passwdhead -5 /etc/passwd

تهیه لیست تنها از نام‌های کاربری لینوکس

برای تهیه لیست صرفاً از نام‌های کاربری لینوکس می‌توان از فرمان awk به صورت زیر استفاده کرد.
php
$ awk -F':' '{ print $1}' /etc/passwd
نمونه خروجی
php
rootdaemonbinsyssyncgamesmanlpmailnews........hplipvivekbindhaldaemonsshdmysqlradvd
گزینه دیگر استفاده از فرمان cut است.
php
$ cut -d: -f1 /etc/passwd

تهیه لیست کلی کاربران لینوکس با استفاده از فرمان 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
البته امکان استفاده از فرمان compgen در لینوکس برای تهیه لیست کاربران و سایر منابع وجود دارد.
php
$ compgen -u

تشخیص وجود یک حساب کاربری در لینوکس

می‌توانیم با کمک فرمان grep و فرمان‌های بالا از وجود یک کاربر خاص در سیستم لینوکس مطمئن شویم.
php
compgen -u | grep vivekgetent 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
getent passwd {username}getent passwd vivek

نحوه شمارش حساب‌های کاربری در سرور لینوکس

اگر می‌خواهید تعداد کاربران سیستم خود را بدانید، می‌‌توانید از فرمان wc به صورت زیر استفاده کنید.
php
$ compgen -u | wc -l$ getent passwd | wc -l
تعداد حساب‌های کاربری در لینوکس
تعداد حساب‌های کاربری در لینوکس

نکته‌ای در مورد سیستم و کاربران جنرال

هر کاربر دارای یک شناسه با عنوان UID است. UID در فایل /etc/passwd تعریف می‌شود. UID هر کدام از کاربران به صورت خودکار با استفاده از فایل /etc/login.defs در هنگام کاربرد فرمان useradd اختصاص می یابد. برای مشاهده مقادیر کنونی، فرمان زیر را تایپ کنید.
php
$ grep "^UID_MIN" /etc/login.defs$ grep UID_MIN /etc/login.defs
نمونه خروجی
php
UID_MIN                                             1000#SYS_UID_MIN                                  100
عدد 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
UID_MAX                                            60000
به عبارت دیگر، حداقل 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
vivek:x:500:500::/home/vivek:/bin/bashraj:x:501:501::/home/raj:/bin/kshash:x:502:502::/home/ash:/bin/zshjadmin:x:503:503::/home/jadmin:/bin/shjwww:x:504:504::/htdocs/html:/sbin/nologinwwwcorp:x:505:505::/htdocs/corp:/sbin/nologinwwwint:x:506:506::/htdocs/intranet:/bin/bashscpftp:x:507:507::/htdocs/ftpjail:/bin/bashrsynftp:x:508:508::/htdocs/projets:/bin/bashmirror:x:509:509::/htdocs:/bin/bashjony:x:510:510::/home/jony:/bin/kshamyk:x:511:511::/home/amyk:/bin/ksh
/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
vivek:x:500:500::/home/vivek:/bin/bashraj:x:501:501::/home/raj:/bin/kshash:x:502:502::/home/ash:/bin/zshjadmin:x:503:503::/home/jadmin:/bin/shwwwint:x:506:506::/htdocs/intranet:/bin/bashscpftp:x:507:507::/htdocs/ftpjail:/bin/bashrsynftp:x:508:508::/htdocs/projets:/bin/bashmirror:x:509:509::/htdocs:/bin/bashjony:x:510:510::/home/jony:/bin/kshamyk:x:511:511::/home/amyk:/bin/ksh
نهایتاً، این اسکریپت، لیستی کلی از سیستم و حساب‌های کاربری را ارائه می‌دهد.
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
----------[ Normal User Accounts ]---------------vivek:x:500:500::/home/vivek:/bin/bashraj:x:501:501::/home/raj:/bin/kshash:x:502:502::/home/ash:/bin/zshjadmin:x:503:503::/home/jadmin:/bin/shwwwint:x:506:506::/htdocs/intranet:/bin/bashscpftp:x:507:507::/htdocs/ftpjail:/bin/bashrsynftp:x:508:508::/htdocs/projets:/bin/bashmirror:x:509:509::/htdocs:/bin/bashjony:x:510:510::/home/jony:/bin/kshamyk:x:511:511::/home/amyk:/bin/ksh----------[ Linux List All Users (System User Accounts) ]---------------root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinabrt:x:173:173::/etc/abrt:/sbin/nologinhaldaemon:x:68:68:HAL daemon:/:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologinsaslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinapache:x:48:48:Apache:/var/www:/sbin/nologinwebalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinmysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bashmemcached:x:498:496:Memcached daemon:/var/run/memcached:/sbin/nologinsquid:x:23:23::/var/spool/squid:/sbin/nologinrpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologinrpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologinnfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

جمع‌بندی

در این مطلب با نحوه تهیه لیست کلی کاربران در سیستم لینوکس آشنا شدیم. فرمان‌های getent، cat، more، cut و فرمان‌های دیگر می‌توانند برای دریافت لیست کاربران در لینوکس به کار آیند.