GNU/Linux >> Belajar Linux >  >> Linux

Cara mendapatkan nama pengguna dari uid

Dengan GNU id , Anda dapat melakukan:

id -un -- "$cheruid"

Itu akan menanyakan basis data akun (apakah itu disimpan di /etc/passwd , LDAP, NIS+, sebuah RDBMS...) untuk nama pengguna pertama dengan uid tersebut.

Umumnya, hanya ada satu nama pengguna per uid, tetapi itu tidak dijamin, kunci dalam basis data akun pengguna adalah nama pengguna, bukan id pengguna.

Jika Anda ingin mengetahui semua nama pengguna untuk uid tertentu, Anda dapat melakukan:

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'

Tapi itu mungkin tidak bekerja untuk beberapa database akun yang tidak enumerable (seperti yang terkadang terjadi pada yang berbasis LDAP besar).


$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself

(ada myself pengguna dengan UID 1001 di sistem saya)

Ini akan menanyakan passwd database untuk UID yang diberikan, hapus nama pengguna dari respons tersebut dan gunakan hasilnya sebagai argumen untuk printf . Ini tidak akan berfungsi di macOS.

Untuk menangkap UID yang tidak dikenal:

$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER

Sebagai skrip yang mengambil sejumlah UID pada baris perintah (dengan keluaran yang sedikit diubah):

#!/bin/sh

for uid do
    printf 'User with UID %d is %s\n' "$uid" \
        "$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done

Pengujian (ini akan melalui beberapa UID akun layanan di sistem OpenBSD saya):

$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd

Bantuan dengan skrip shell asli

Tes dalam pernyataan if yang menyebabkan masalah. Saya menyarankan shellscript berikut,

#!/bin/bash

read -p "donner l UID " cheruid

 if [ "$(grep -w "^$cheruid" /etc/passwd)" != "" ]
 then
    grep -w "$cheruid" /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"
fi

Sunting1:Saya menambahkan ^ dalam pengujian untuk hanya mencari kecocokan di awal baris.

Sunting2:sejak : adalah pemisah, Anda dapat menghapusnya dan semuanya setelahnya, dan menggunakan hasilnya langsung di echo baris, jika diterima dalam pengujian, dan sederhanakan skrip shell menjadi

#!/bin/bash

read -p "donner l UID " cheruid

cheruid=${cheruid%%:*}
user=$(grep -wo "^$cheruid" /etc/passwd)

if [ "$user" != "" ]
then
    echo "user is : $user"
else
    echo "user not found"
fi

Ini membantu Anda membuat bash shellscript yang bagus.

Metode yang efisien dan lebih umum untuk menemukan ID pengguna dengan id

Jika Anda menginginkan cara yang efisien untuk memeriksa apakah ada nama pengguna tertentu, <test-name> , Anda dapat menggunakan id , sebagaimana ditunjukkan dalam jawaban lain atas pertanyaan Anda oleh Stéphane Chazelas:

id -un -- <test-name>

misalnya

id -un -- mehdi

id tidak hanya akan menemukan ID pengguna yang disimpan di /etc/passwd tetapi juga yang dikelola dan disimpan dengan cara lain, misalnya LDAP, yang umum dalam sistem server profesional seperti yang dikomentari oleh Matteo Italia.

Jika Anda ingin memindai semua pengguna

  • pengguna sistem, di banyak sistem linux dengan jumlah pengguna <1000

  • pengguna 'manusia', di banyak sistem linux dengan jumlah pengguna>=1000

  • dan dengan asumsi bahwa semua pengguna memiliki nomor <2000 (modifikasi jika perlu)

Anda dapat menggunakan bash berikut one-liner, yang menggunakan loop dengan id ,

for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Jika Anda hanya ingin melihat pengguna 'manusia' dan menganggap tidak ada nomor ID pengguna yang dilewati (tidak ada pengguna yang dihapus), berikut bash oneliner sangat cepat,

i=1000;while true;do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$name" ;else break;fi;i=$((i+1));done

tetapi lebih dapat diandalkan untuk mengasumsikan bahwa beberapa nomor ID mungkin dilewati (pengguna yang dihapus),

for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Ada juga users dan who yang mencetak nama pengguna dari pengguna yang saat ini masuk ke host saat ini.


Linux
  1. Bagaimana cara mendapatkan output dari gdb.execute di PythonGDB (GDB 7.1)?

  2. Bagaimana saya mendapatkan sed untuk membaca dari input standar?

  3. Cara mendapatkan proses anak dari proses induk

  1. bagaimana cara mendapatkan elemen dari daftar di bash?

  2. Bagaimana cara menghapus atau menghapus fungsi bash?

  3. Bagaimana saya bisa mendapatkan biner dari file .py

  1. Cara Menambah atau Menghapus Pengguna dari Grup di Linux

  2. Bagaimana cara mendapatkan nama pengguna di Makefile?

  3. Bagaimana cara mendapatkan nama host dari IP (Linux)?