คำสั่งที่ใช้งานง่ายเพื่อแสดงรายชื่อผู้ใช้ทั้งหมดในระบบ Ubuntu?


22

มีคำสั่งที่ใช้งานง่ายที่ฉันสามารถใช้เพื่อแสดงรายการผู้ใช้ในคอนโซลบนระบบ Ubuntu หรือไม่?

เมื่อฉันcat /etc/passwdได้รับรายชื่อผู้ใช้ที่อ่านยาก มันจะเป็นการดีถ้าได้เห็นรายการที่มีตัวอักษรโดยมีรายการที่จัดเรียงไว้ในคอลัมน์และมีชื่อกลุ่มในวงเล็บข้างรหัสประจำกลุ่ม


2
ดี / etc / passwd ถูกจัดลงในคอลัมน์ ... ถ้าคุณต้องการที่จะเห็นเพียงไม่กี่ colums cutบางทีการใช้งาน sortสำหรับตามตัวอักษรมี หากคุณต้องการชื่อกลุ่มให้เล่นด้วยการเข้าร่วม (ซึ่งจริงๆแล้วสามารถแสดงได้เพียงชุดย่อยของคอลัมน์ btw)
njsg

คำตอบ:


27

วิธีที่ดีสำหรับเอาต์พุตที่ดีของไฟล์ / etc / passwd:

$ column -nts: /etc/passwd

ตอนนี้คุณสามารถจัดเรียง:

$ column -nts: /etc/passwd | sort

ด้วยชื่อกลุ่มในคอลัมน์สุดท้าย (ไม่มีวงเล็บ):

$ paste -d: /etc/passwd <(groups $(cut -d: -f1 /etc/passwd) | sed 's/.*: //') | column -nts: | sort

ขอบคุณคำสั่งเหล่านี้ทำในสิ่งที่ฉันต้องการ สำหรับมือใหม่นี่น่ากลัวมาก ... ฉันคิดว่าฉันจะต้องเรียนรู้วิธีสร้างนามแฝงสำหรับพวกเขา
M. Dudley

ในคอลัมน์ Centos ไม่ชอบnตัวเลือก column -ts: /etc/passwdทำงานได้ดี
user1014251

9

หากคุณมีสิทธิ์เข้าถึงรูทบนเครื่องคุณสามารถทำสิ่งต่อไปนี้:

sudo grep -vE '^[^*!]+:[*!]:' /etc/shadow | sort | cut -d: -f1 | while read user; do id $user; done | column -ts' ,' | vi '+set nowrap' -

มันทำงานอย่างไร

รูทเพื่ออ่านไฟล์เงา คุณต้องมีสิทธิ์ใช้งานรูตหากคุณต้องการตรวจสอบว่าผู้ใช้มีรหัสผ่าน (ผู้ใช้ที่เป็นมนุษย์) หรือไม่คุณสามารถทำสิ่งต่อไปนี้cat /etc/passwdแทนsudo grep ...:

sudo 

แสดงเฉพาะผู้ใช้ที่มีรหัสผ่านตั้งไว้:

grep -vE '^[^*!]+:[*!]:' /etc/shadow

เรียงตามชื่อผู้ใช้:

sort 

ละทิ้งข้อมูลทั้งหมดยกเว้นชื่อผู้ใช้:

cut -d: -f1

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

while read user; do id $user; done

จัดรูปแบบอินพุตให้เป็นคอลัมน์:

column -ts' ,'

ใช้ vi เพื่อดูผลลัพธ์:

vi '+set nowrap' - 

หากคุณไม่มีสิทธิ์เข้าถึงรูต

ลองอะไรเช่นนี้:

cut -d: -f1 /etc/passwd | sort | while read user; do id $user; done | sed 's/\(\()\|^\)[^(]*(\|)\)/ /g' | column -t

เอาท์พุทของมันแตกต่างกันเล็กน้อย แต่ฉันปล่อยให้มันเป็นแบบฝึกหัดให้ผู้อ่านเพื่อรวมสองส่วนในคำตอบนี้เป็นสิ่งที่เหมาะกับงานอย่างเต็มที่ (คุณแค่รักsedไม่ได้)


"ฉันปล่อยให้มันเป็นแบบฝึกหัดให้กับผู้อ่าน ... " :)
Emanuel Berg

1

ใน Ubuntu มันสามารถเป็นดังนี้:

เจ็ดช่องจาก / etc / passwd เก็บไว้ใน $ f1, f2 ... , $ f7

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
 echo "User $f1 use $f7 shell and stores files in $f6 directory."
done < /etc/passwd

1

สิ่งที่ฉันทำและใช้งานได้ตามวัตถุประสงค์ของฉันคือ

ls /home

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


ฉันชอบสิ่งนี้. มันทำให้งานเสร็จในระดับพื้นฐาน
aalaap

0

ผมคิดว่าเรื่องนี้จะเป็นเรื่องง่ายด้วยjoinแต่joinต้องใช้ไฟล์ที่จะเรียงบนฟิลด์เข้าร่วม ดังนั้นจึงจำเป็นต้องใช้วิธีแก้ปัญหา (?) กับไฟล์ชั่วคราว เอาต์พุตถูกเรียงลำดับตามผู้ใช้และแสดงผู้ใช้กลุ่มและ ID กลุ่ม

uag () {
  TEMP_GROUPS=/var/tmp/sorted_groups
  TEMP_USERS=/var/tmp/sorted_users
  cat /etc/group  | tr ":" " " | sort -k 3 -o $TEMP_GROUPS
  cat /etc/passwd | tr ":" " " | sort -k 4 -o $TEMP_USERS
  join -1 4 -2 3 -o 1.1,2.1,2.3 $TEMP_USERS $TEMP_GROUPS | sort
  rm $TEMP_GROUPS $TEMP_USERS
}

แปลตัวละครเข้าไปอีกด้วยtr; sortตามฟิลด์สำคัญด้วย-k, เอาท์พุทเป็นไฟล์ด้วย-o; เข้าร่วมโดยคำนึงถึงฟิลด์ต่างๆในไฟล์แรก ( -1) และ-2ไฟล์ที่สอง ( ) ออกบางฟิลด์ในไฟล์แรก ( ) และฟิลด์-o 1.1ที่สอง ( ,2.1,2.3)


โปรดทราบว่า/tmpจะดีกว่าเนื่องจาก FHS ระบุว่า/var/tmpจะไม่ถูกลบล้างการเริ่มต้นใหม่ซึ่งเราไม่ต้องการจริงๆ
strugee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.