ฉันจะค้นหาจำนวนผู้ใช้ออนไลน์ใน Linux ได้อย่างไร


10

ฉันจะดูได้อย่างไรว่ามีคนล็อกออนกี่เครื่องบนเครื่อง Linux? ฉันรู้ว่าคำสั่ง 'users' แสดงทุกคนที่ล็อกอิน แต่ฉันต้องการหมายเลข มีสวิตช์สำหรับผู้ใช้ที่ฉันหายไปในหน้า man หรือไม่? ฉันคิดถึงการใช้grep -cคำสั่ง แต่ต้องมีบางอย่างที่เหมือนกันในชื่อผู้ใช้แต่ละรายเพื่อให้ทำงานได้ มีวิธีที่ง่ายกว่านี้ไหม?

คำตอบ:


15

คุณกำลังมองหาwcคำสั่ง (จำนวนคำ)

ลองสิ่งนี้:

users | wc -w

โปรดทราบว่าวิธีการนี้ (โซลูชัน who / w) แสดงเฉพาะผู้ใช้ที่เข้าสู่ระบบไม่จำเป็นต้องเป็นผู้ใช้ที่ใช้งานอยู่ (เช่นผู้ใช้ที่เริ่มต้นกระบวนการแล้วออกจากระบบโดยออกจากกระบวนการที่ทำงานอยู่ด้านหลัง) เพียงแค่ให้หัวเกี่ยวกับความแตกต่าง
estani

18

คลาสสิกคำสั่งคือ 'ใคร' มากกว่า 'ผู้ใช้' แต่ 'ใคร' จะให้ข้อมูลเพิ่มเติมแก่คุณ มองย้อนกลับไปที่บทความ Unix ดั้งเดิม (กลางปี ​​70) ตัวอย่างจะเป็นดังนี้:

who | wc -l

การใช้ 'wc -l' นับจำนวนบรรทัดการส่งออก - มันทำงานได้กับทั้ง 'ผู้ใช้' และ 'ใคร' การใช้ '-w' จะทำงานได้อย่างน่าเชื่อถือเมื่อมีหนึ่งคำต่อผู้ใช้ (เช่นเดียวกับ 'users' แต่ไม่ใช่กับ 'who')

คุณสามารถใช้ 'grep -c' เพื่อนับบรรทัด เนื่องจากคุณสนใจเฉพาะชื่อผู้ใช้ที่ไม่ว่างเปล่าคุณสามารถทำได้:

who | grep -c .

แต่ละบรรทัดมีอักขระอย่างน้อยหนึ่งตัว


ตามที่ระบุไว้ในการแสดงความคิดเห็นโดยจอห์น Tที่usersคำสั่งแตกต่างจากwhoในหลายประการ สิ่งที่สำคัญที่สุดคือแทนที่จะให้ชื่อหนึ่งชื่อต่อบรรทัดมันจะกระจายชื่อออกมาหลายบรรทัดต่อบรรทัด - ฉันไม่มีเครื่องที่มีผู้ใช้ที่แตกต่างกันเพียงพอที่จะเข้าสู่ระบบเพื่อทดสอบว่าเกิดอะไรขึ้นเมื่อจำนวนผู้ใช้มีขนาดใหญ่ ข้อแตกต่างอื่น ๆ คือรายงาน 'who' เกี่ยวกับการเชื่อมต่อเทอร์มินัล เมื่อเปิดหน้าต่างเทอร์มินัลหลายหน้าต่างมันจะแสดงหลายบรรทัดสำหรับผู้ใช้คนเดียวในขณะที่ 'ผู้ใช้' ดูเหมือนจะแสดงรายการผู้ใช้ที่เข้าสู่ระบบเพียงครั้งเดียว

ผลที่ตามมาของความแตกต่างนี้การgrep -c .กำหนดสูตร '' จะไม่ทำงานกับคำสั่ง 'ผู้ใช้' ' wc -w' เป็นสิ่งที่จำเป็น


nitpick ขนาดเล็ก - คำสั่ง users ไม่พิมพ์ 1 บรรทัดต่อผู้ใช้เพียงพิมพ์ id ตามลำดับดังนั้น grep -c จะไม่ทำงานในกรณีนี้ คิดอย่างฉลาด
John T

นี่ก็หมายความว่า wc -l จะไม่ทำงานกับคำสั่งผู้ใช้ดังที่แสดงไว้ที่นี่: i26.tinypic.com/4pw0vd.png
John T

@John T: อืม - ดีแล้วภาพหน้าจอของคุณถูกต้องแล้ว ฉันทดสอบ 'ผู้ใช้' ใน MacOS X - แต่มีผู้ใช้เพียงรายเดียวที่ลงชื่อเข้าใช้เมื่อฉันตรวจสอบอีกครั้งด้วยผู้ใช้รายที่สองที่เข้าสู่ระบบฉันเห็นพฤติกรรม 'all on one line'
30918 Jonathan Leffler

1
เพื่อจำลองผู้ใช้มากขึ้นคุณสามารถ SSH ลงในช่องของคุณเอง :)
จอห์นที

ขอบคุณสำหรับข้อมูลที่มีค่านี้ถึงแม้ว่าฉันต้องการที่จะยึดคำสั่ง "users" ขอบคุณคุณเช่นกัน

7

เปิดเปลือกและพิมพ์:

who -q

บรรทัดสุดท้ายจะให้การนับกับคุณ

แก้ไข:

(ถอนหายใจ) ฉันเข้าใจผิดคำถาม นี่เป็นวิธีการที่ค่อนข้างดุร้าย:

วิธีดูชื่อผู้ใช้ที่ไม่ซ้ำ:

who | awk '{ print $1 }' | sort | uniq

วิธีดูจำนวนผู้ใช้ที่ไม่ซ้ำกัน:

who | awk '{ print $1 }' | sort | uniq | wc -l 

ที่นับการเข้าสู่ระบบทั้งหมดของผู้ใช้เดียวกันในผลรวม
hayalci

ตรวจสอบการแก้ไขฉันคิดว่าคุณจะพบว่าคำตอบใหม่ที่อยู่ที่
Avery Payne

สิ่งนี้ยังคงใช้งานไม่ได้ uniq จะลบบรรทัดต่อเนื่องที่ซ้ำกันออกไปเท่านั้นคุณต้องเรียงลำดับผลลัพธ์ของใครก่อน
theotherreceive

นั่นคือสิ่งที่ฉันได้รับสำหรับการโพสต์คำตอบตอนตี 1 แก้ไขแล้ว
Avery Payne

3

คุณต้องการดูจำนวนเซสชันหรือจำนวนผู้ใช้จริงหรือไม่

$ who
andrew   tty1         2009-07-26 15:31 (:0)
andrew   pts/0        2009-07-27 00:11 (:0.0)
andrew   pts/1        2009-07-27 01:58 (:0.0)

นั่นเป็นแล็ปท็อปของฉันดังนั้นฉันเป็นผู้ใช้คนเดียว แต่ฉันลงชื่อเข้าใช้สามครั้ง

$ who | wc -l
3
$ users | wc -w
3

ค่อนข้างง่ายที่จะกรองรายการที่ซ้ำกันเหล่านี้ออกไปเพื่อรับจำนวนผู้ใช้จริง

$ users | tr ' ' '\n' | sort -u 
andrew
$ users | tr ' ' '\n' | sort -u | wc -l
1

3

นี่คือโพสต์สุดยอดของawinkที่ยอดเยี่ยม

set $(users)
declare -A user
for u ; do ((user[$u]++)) ; done
for key in "${!user[@]}" ; do echo "$key: ${user[$key]}" ; done | column -t | sort -nk 2

ตกลงมันใช้เวลานานขึ้นเล็กน้อย แต่ก็คุ้มที่จะหาสิ่งนี้ ...

ขณะทำการทดสอบให้ทำก่อนพยายามครั้งต่อไป:

shift $#                # clear positional parameters
unset user              # remove associative array variable

2

จำนวนผู้ใช้ที่ล็อกอินในปัจจุบัน:

who |cut -c 1-9 |sort -u |wc -l

buta ด้านบนด้วยชื่อบัญชีของพวกเขา:

who |cut -c 1-9 |sort -u |tee /dev/tty |wc -l

1
who | cut --delimiter=' ' -f 1 | sort -u | wc -l

ใครจะพิมพ์รายการตัดลบทุกอย่างยกเว้นแถวแรกเรียงลำดับ -u จัดเรียงและลบรายการที่ซ้ำกันและ wc -l นับบรรทัด ทำงานได้ดีสำหรับฉันบน Ubuntu / bash :)


1

คุณสามารถใช้w( /usr/bin/wบนระบบ Red Hat ของฉัน) หรือuptimeพวกเขาแสดงจำนวนผู้ใช้ที่ล็อกอินจริง

w:

                              v
 22:40:38 up 3 days, 22 min,  1 user,  load average: 0.02, 0.01, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
manuel   pts/0    pc-manuel        09:35    0.00s  0.07s  0.00s /usr/bin/screen -xRR

สถานะการออนไลน์:

                              v
 22:39:18 up 3 days, 21 min,  1 user,  load average: 0.08, 0.02, 0.01

1

และวิธีการที่ใช้เพียงท่อเดียว ...

users | awk '{for(i=1;i<=NF;i++){a[$i]++}}END{for(i in a){print i"\t"a[i]}}'

:}



0

คุณสามารถดาวน์โหลดเครื่องมือฟรีสำหรับยูนิกซ์ที่ชื่อว่า TOP มันสร้างรายชื่อผู้ใช้และสิ่งที่พวกเขากำลังทำอยู่ในระบบในเวลานั้นและจะทำการปรับปรุงต่อไปตราบใดที่มันยังทำงานอยู่

ตั้งอยู่ที่http://www.unixtop.org/

มันมีสวิตช์บรรทัดคำสั่งจำนวนมากดังนั้นคุณควรจะสามารถดึงข้อมูลที่คุณต้องการได้


ฉันยังหาลินุกซ์ distro ที่ไม่รวมถึงด้านบนโดยค่าเริ่มต้นให้คนเดียวไม่มีตัวเลือกในการติดตั้งจากแพคเกจ
theotherreceive

0
who | cut -d ' ' -f1 | uniq | wc -l

2
ดูเหมือนว่าคำตอบของคิมจะแตกต่างกันเล็กน้อยและไม่มีคำอธิบายใด ๆ มันอาจจะเหมาะสมกว่าในฐานะความคิดเห็นในคำตอบนั้น (ซึ่งต้องใช้ตัวแทนอีกเล็กน้อย) ความตั้งใจคือคำตอบแต่ละข้อเสนอทางออกที่แตกต่างอย่างมากจากสิ่งที่มีส่วนร่วมแล้ว
fixer1234

-2

หากคุณกำลังมองหาจำนวนผู้ใช้ทั้งหมดที่เข้าสู่ระบบและออกจากระบบในลำดับที่เหมาะสมคำสั่งที่ดีที่สุดในการเรียกใช้คือ

cat -n /etc/passwd

2
ไม่นั่นไม่ใช่สิ่งที่คำสั่งนั้นทำ cat -nเพียงพิมพ์บรรทัดทั้งหมดในไฟล์โดยกำหนดหมายเลขแต่ละบรรทัด คุณจะได้รับรายชื่อผู้ใช้ที่มีอยู่ในระบบนั้น แต่คุณจะไม่ได้รับข้อมูลการเข้าสู่ระบบมากนัก
cpast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.