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.