در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیستکردن کاربران سیستمعامل لینوکس به کار گرفته میشود و کاربردش چیست. در ادامه با ما همراه باشید. فایل /etc/passwd حاوی یک خط برای هر کدام از حسابهای کاربری لینوکس است. در این خطوط...
1400/04/193303 بازدید
در این مطلب از وبلاگ آریانت به دنبال راهی برای تهیه لیست کلی کاربران سرور لینوکس هستیم. اینکه چه فرمانی برای لیستکردن کاربران سیستمعامل لینوکس به کار گرفته میشود و کاربردش چیست. در ادامه با ما همراه باشید.
فایل /etc/passwd حاوی یک خط برای هر کدام از حسابهای کاربری لینوکس است. در این خطوط تعداد ۷ فیلد وجود دارند که به وسیله علامت نقلقول از هم جدا میشوند. از آنجایی که این یک فایل متنی است، به راحتی میتوانید در لینوکس با فرمان cat یا سایر فرمانها مانند grep یا egrep به تهیه لیست کلی کاربران بپردازید.
تهیه لیست کلی کاربران لینوکس با استفاده از فایل /etc/passwd
برای تهیه لیست کلی کاربران در این لینوکس، از فرمان cat به صورت زیر استفاده کنید.
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
1$ more /etc/passwd23$ less /etc/passwd
نمونه خروجی
نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو
تمام فیلدها با علامت نقلقول (:) از هم جدا میشوند. در مجموع ۷ فیلد برای هر کاربر وجود دارد. اولین فیلد، نام کاربری است. این نام در هنگام ورود کاربر مورداستفاده قرار میگیرد و باید بین یک تا ۳۲ کاراکتر باشد. البته امکان محدودسازی خروجی با استفاده از فرمانهای head و tail به صورت زیر وجود دارد:
php
1tail -5 /etc/passwd23head -5 /etc/passwd
تهیه لیست تنها از نامهای کاربری لینوکس
برای تهیه لیست صرفاً از نامهای کاربری لینوکس میتوان از فرمان awk به صورت زیر استفاده کرد.
تهیه لیست کلی کاربران لینوکس با استفاده از فرمان getent
برای تهیه لیست از تمام کاربران لینوکس با کمک فرمان getent داریم:
php
1$ getent passwd23$ getent passwd | grep tom45## get a list all users ##67$ getent passwd | cut -d: -f189## count all user accounts using the wc ##1011$ getent passwd | wc -l
البته امکان استفاده از فرمان compgen در لینوکس برای تهیه لیست کاربران و سایر منابع وجود دارد.
php
1$ compgen -u
تشخیص وجود یک حساب کاربری در لینوکس
میتوانیم با کمک فرمان grep و فرمانهای بالا از وجود یک کاربر خاص در سیستم لینوکس مطمئن شویم.
php
1compgen -u | grep vivek23getent passwd | grep -q sai && echo "User sai found" || echo "User sai not found"45compgen -u | grep -q ram && echo "User ram found" || echo "User ram not found"
نسخه سادهسازی شده این فرمان به صورت زیر خواهد بود.
php
1getent passwd {username}23getent passwd vivek
نحوه شمارش حسابهای کاربری در سرور لینوکس
اگر میخواهید تعداد کاربران سیستم خود را بدانید، میتوانید از فرمان wc به صورت زیر استفاده کنید.
php
1$ compgen -u | wc -l23$ getent passwd | wc -l
تعداد حسابهای کاربری در لینوکس
نکتهای در مورد سیستم و کاربران جنرال
هر کاربر دارای یک شناسه با عنوان UID است. UID در فایل /etc/passwd تعریف میشود. UID هر کدام از کاربران به صورت خودکار با استفاده از فایل /etc/login.defs در هنگام کاربرد فرمان useradd اختصاص می یابد. برای مشاهده مقادیر کنونی، فرمان زیر را تایپ کنید.
عدد 1000 کمترین مقدار برای انتخاب UID در فرمان useradd است. به عبارت دیگر، تمام کاربران عادی سیستم میبایست شناسهای بزرگتر یا مساوی 1000 داشته باشند. تنها این کاربران اجازه وورد به سیستم خواهند داشت. فرمان زیر را برای تهیه لیست کلی کاربران وارد شده تایپ کنید.
php
1## get UID limit ##23l=$(grep "^UID_MIN" /etc/login.defs)45## use awk to print if UID >= $UID_LIMIT ##67awk -F':' -v "limit=${l##UID_MIN}" '{ if ( $3 >= limit ) print $1}' /etc/passwd89برای مشاهده مقادیر حداکثر انتخاب اتوماتیک UID در فرمان useradd داریم:1011$ grep "^UID_MAX" /etc/login.defs
نمونه خروجی
php
1UID_MAX 60000
به عبارت دیگر، حداقل UID برای کاربران سیستم برابر 1000 و فایل UID /etc/shells است. در اینجا، کد بروز شده را برای دریافت جزئیات میبینید.
php
1## get mini UID limit ##23l=$(grep "^UID_MIN" /etc/login.defs)45## get max UID limit ##67l1=$(grep "^UID_MAX" /etc/login.defs)89## use awk to print if UID >= $MIN and UID <= $MAX ##1011awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max ) print $0}' /etc/passwd
/sbin/nologin برای رد مؤدبانه یک درخواست ورود به کار رفته است. به عنوان مثال، /sbin/nologin پیغامی را مبنی بر عدم وجود کاربر موردنظر نشان میدهد. این در واقع، جایگزینی برای پوسته حسابهایی است که مسدود شدهاند و یا اینکه شما نمیخواهید از طریق ssh به سیستم وارد شوند. برای فیلتر کردن /sbin/nologin، فرمان زیر را وارد کنید.
php
1#!/bin/bash23# Name: listusers.bash45# Purpose: List all normal user accounts in the system. Tested on RHEL / Debian Linux to List All Users on Linux67# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+89# -----------------------------------------------------------------------------------1011_l="/etc/login.defs"1213_p="/etc/passwd"1415## get mini UID limit ##1617l=$(grep "^UID_MIN" $_l)1819## get max UID limit ##2021l1=$(grep "^UID_MAX" $_l)2223## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ##2425awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) "$_p"
نهایتاً، این اسکریپت، لیستی کلی از سیستم و حسابهای کاربری را ارائه میدهد.
php
1#!/bin/bash23# Name: listusers.bash45# Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux67# Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+89# -----------------------------------------------------------------------------------1011_l="/etc/login.defs"1213_p="/etc/passwd"1415## get mini UID limit ##1617l=$(grep "^UID_MIN" $_l)1819## get max UID limit ##2021l1=$(grep "^UID_MAX" $_l)2223## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ##2425echo "----------[ Normal User Accounts ]---------------"2627awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p"2829echo ""3031echo "----------[ System User Accounts ]---------------"3233awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( !($3 >= min && $3 <= max && $7 != "/sbin/nologin")) print $0 }' "$_p"
نمونه خروجی
php
1----------[ Normal User Accounts ]---------------23vivek:x:500:500::/home/vivek:/bin/bash45raj:x:501:501::/home/raj:/bin/ksh67ash:x:502:502::/home/ash:/bin/zsh89jadmin:x:503:503::/home/jadmin:/bin/sh1011wwwint:x:506:506::/htdocs/intranet:/bin/bash1213scpftp:x:507:507::/htdocs/ftpjail:/bin/bash1415rsynftp:x:508:508::/htdocs/projets:/bin/bash1617mirror:x:509:509::/htdocs:/bin/bash1819jony:x:510:510::/home/jony:/bin/ksh2021amyk:x:511:511::/home/amyk:/bin/ksh2223----------[ Linux List All Users (System User Accounts) ]---------------2425root:x:0:0:root:/root:/bin/bash2627bin:x:1:1:bin:/bin:/sbin/nologin2829daemon:x:2:2:daemon:/sbin:/sbin/nologin3031adm:x:3:4:adm:/var/adm:/sbin/nologin3233lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin3435sync:x:5:0:sync:/sbin:/bin/sync3637shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown3839halt:x:7:0:halt:/sbin:/sbin/halt4041mail:x:8:12:mail:/var/spool/mail:/sbin/nologin4243uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin4445operator:x:11:0:operator:/root:/sbin/nologin4647games:x:12:100:games:/usr/games:/sbin/nologin4849gopher:x:13:30:gopher:/var/gopher:/sbin/nologin5051ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin5253nobody:x:99:99:Nobody:/:/sbin/nologin5455dbus:x:81:81:System message bus:/:/sbin/nologin5657vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin5859abrt:x:173:173::/etc/abrt:/sbin/nologin6061haldaemon:x:68:68:HAL daemon:/:/sbin/nologin6263ntp:x:38:38::/etc/ntp:/sbin/nologin6465saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin6667postfix:x:89:89::/var/spool/postfix:/sbin/nologin6869apache:x:48:48:Apache:/var/www:/sbin/nologin7071webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin7273sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin7475tcpdump:x:72:72::/:/sbin/nologin7677mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash7879memcached:x:498:496:Memcached daemon:/var/run/memcached:/sbin/nologin8081squid:x:23:23::/var/spool/squid:/sbin/nologin8283rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin8485rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin8687nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
جمعبندی
در این مطلب با نحوه تهیه لیست کلی کاربران در سیستم لینوکس آشنا شدیم. فرمانهای getent، cat، more، cut و فرمانهای دیگر میتوانند برای دریافت لیست کاربران در لینوکس به کار آیند.