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

فایل /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

نمونه خروجی

نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو

نمونه لیست کاربران Centos / RHEL، فدورا، دبیان و اوبونتو

تمام فیلدها با علامت نقل‌قول (:) از هم جدا می‌شوند. در مجموع ۷ فیلد برای هر کاربر وجود دارد. اولین فیلد، نام کاربری است. این نام در هنگام ورود کاربر مورداستفاده قرار می‌گیرد و باید بین یک تا ۳۲ کاراکتر باشد. البته امکان محدودسازی خروجی با استفاده از فرمان‌های 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 و فرمان‌های دیگر می‌توانند برای دریافت لیست کاربران در لینوکس به کار آیند.