در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیستکردن کاربران سیستمعامل لینوکس به کار گرفته میشود و کاربردش چیست. در ادامه با ما همراه باشید.
فایل /etc/passwd حاوی یک خط برای هر کدام از حسابهای کاربری لینوکس است. در این خطوط تعداد ۷ فیلد وجود دارند که به وسیله علامت نقلقول از هم جدا میشوند. از آنجایی که این یک فایل متنی است، به راحتی میتوانید در لینوکس با فرمان cat یا سایر فرمانها مانند grep یا egrep به تهیه لیست کلی کاربران بپردازید.
تهیه لیست کلی کاربران لینوکس با استفاده از فایل /etc/passwd
برای تهیه لیست کلی کاربران در این لینوکس، از فرمان cat به صورت زیر استفاده کنید.
$ cat /etc/passwd
در نتیجه، خروجیای مشابه زیر مشاهده میشود.
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
هر کدام از خطوط این فایل دارای ۷ فیلد به صورت زیر است. به عنوان مثال اگر این خط را در نظر بگیرید:
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 وجود دارد.
$ more /etc/passwd $ less /etc/passwd
نمونه خروجی
تمام فیلدها با علامت نقلقول (:) از هم جدا میشوند. در مجموع ۷ فیلد برای هر کاربر وجود دارد. اولین فیلد، نام کاربری است. این نام در هنگام ورود کاربر مورداستفاده قرار میگیرد و باید بین یک تا ۳۲ کاراکتر باشد. البته امکان محدودسازی خروجی با استفاده از فرمانهای head و tail به صورت زیر وجود دارد:
tail -5 /etc/passwd head -5 /etc/passwd
تهیه لیست تنها از نامهای کاربری لینوکس
برای تهیه لیست صرفاً از نامهای کاربری لینوکس میتوان از فرمان awk به صورت زیر استفاده کرد.
$ awk -F':' '{ print $1}' /etc/passwd
نمونه خروجی
root daemon bin sys sync games man lp mail news .... .. ..hplip vivek bind haldaemon sshd mysql radvd
گزینه دیگر استفاده از فرمان cut است.
$ cut -d: -f1 /etc/passwd
تهیه لیست کلی کاربران لینوکس با استفاده از فرمان getent
برای تهیه لیست از تمام کاربران لینوکس با کمک فرمان getent داریم:
$ 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 در لینوکس برای تهیه لیست کاربران و سایر منابع وجود دارد.
$ compgen -u
تشخیص وجود یک حساب کاربری در لینوکس
میتوانیم با کمک فرمان grep و فرمانهای بالا از وجود یک کاربر خاص در سیستم لینوکس مطمئن شویم.
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"
نسخه سادهسازی شده این فرمان به صورت زیر خواهد بود.
getent passwd {username} getent passwd vivek
نحوه شمارش حسابهای کاربری در سرور لینوکس
اگر میخواهید تعداد کاربران سیستم خود را بدانید، میتوانید از فرمان wc به صورت زیر استفاده کنید.
$ compgen -u | wc -l $ getent passwd | wc -l
نکتهای در مورد سیستم و کاربران جنرال
هر کاربر دارای یک شناسه با عنوان UID است. UID در فایل /etc/passwd تعریف میشود. UID هر کدام از کاربران به صورت خودکار با استفاده از فایل /etc/login.defs در هنگام کاربرد فرمان useradd اختصاص می یابد. برای مشاهده مقادیر کنونی، فرمان زیر را تایپ کنید.
$ grep "^UID_MIN" /etc/login.defs $ grep UID_MIN /etc/login.defs
نمونه خروجی
UID_MIN 1000 #SYS_UID_MIN 100
عدد 1000 کمترین مقدار برای انتخاب UID در فرمان useradd است. به عبارت دیگر، تمام کاربران عادی سیستم میبایست شناسهای بزرگتر یا مساوی 1000 داشته باشند. تنها این کاربران اجازه وورد به سیستم خواهند داشت. فرمان زیر را برای تهیه لیست کلی کاربران وارد شده تایپ کنید.
## 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
نمونه خروجی
UID_MAX 60000
به عبارت دیگر، حداقل UID برای کاربران سیستم برابر 1000 و فایل UID /etc/shells است. در اینجا، کد بروز شده را برای دریافت جزئیات میبینید.
## 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
نمونه خروجی
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
/sbin/nologin برای رد مؤدبانه یک درخواست ورود به کار رفته است. به عنوان مثال، /sbin/nologin پیغامی را مبنی بر عدم وجود کاربر موردنظر نشان میدهد. این در واقع، جایگزینی برای پوسته حسابهایی است که مسدود شدهاند و یا اینکه شما نمیخواهید از طریق ssh به سیستم وارد شوند. برای فیلتر کردن /sbin/nologin، فرمان زیر را وارد کنید.
#!/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"
نمونه خروجی
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
نهایتاً، این اسکریپت، لیستی کلی از سیستم و حسابهای کاربری را ارائه میدهد.
#!/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"
نمونه خروجی
----------[ 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
جمعبندی
در این مطلب با نحوه تهیه لیست کلی کاربران در سیستم لینوکس آشنا شدیم. فرمانهای getent، cat، more، cut و فرمانهای دیگر میتوانند برای دریافت لیست کاربران در لینوکس به کار آیند.