jika pernyataan permintaan id pengguna di etc / passwd?

8

Menggunakan bash, saya mencoba untuk meminta /etc/passwdpengguna dengan id lebih dari 1000. Jika ada, lakukan sesuatu, atau lakukan yang lain. Saya bingung. Bantuan apa pun dihargai.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
pengguna3239222
sumber
1
Apakah ini harus dalam bash (shell)?
Stephen Rauch
ya maaf. menggunakan bash
user3239222

Jawaban:

8

Coba ini:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

grepPencarian pertama passwduntuk baris dengan jumlah empat atau lebih digit. grepFilter kedua menyaring baris dengan uid 1000. Status keluar akan menjadi 0 jika ada garis yang tersisa, 1 jika tidak.

Tom Zych
sumber
saya mendapatkan kesalahan sintaks: akhir file tak terduga
user3239222
Anda harus mengikutinya dengan sebuah thengaris, dll.
Tom Zych
1
Saya lupa; buat grep kedua -Evquntuk menekan outputnya.
Tom Zych
4
Dari tampilan itu, ini mencari bidang UID yang setidaknya 4 karakter, yang bekerja di sini tetapi tidak terlalu berguna jika nilai cutoff adalah sesuatu selain kekuatan sepuluh. Juga hasilnya mungkin membingungkan jika beberapa angka mendapatkan angka nol di depan karena alasan tertentu.
ilkkachu
1
Jika Anda menggunakan YP / NIS atau LDAP, maka parsing output getent passwdbukan /etc/passwdfile.
Kusalananda
16

Untuk melakukannya dalam satu bashlingkaran, saya sarankan menggunakan readdan IFSmenyukai:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd
Stephen Rauch
sumber
mencobanya tetapi mengeluarkan semua pengguna LT dan GT
user3239222
1
Ini menghasilkan beberapa pengguna sebagai LT, dan sisanya sebagai GT. Itulah yang saya pikir Anda butuhkan.
Stephen Rauch
saya hanya ingin memeriksa dll / kata sandi untuk melihat apakah ada UID lebih besar dari 1000 ada dan melakukan sesuatu jika benar, lakukan sesuatu yang lain jika salah ..
user3239222
4
Kata-kata kunci dalam komentar Anda adalah jika ada , pertanyaan untuk dan mereka . Bentuk jamak yang mereka tunjukkan kepada saya bahwa Anda bermaksud memproses setiap pengguna. Tetapi tiga jawaban lain di sini tidak membacanya, jadi ....
Stephen Rauch
14

Alih-alih membaca /etc/passwdsecara langsung, Anda harus menggunakan getent passwd, yang juga akan berfungsi jika beberapa pengguna Anda disimpan dalam sesuatu seperti LDAP atau semacamnya. awkharus cocok untuk format output yang dipisahkan oleh titik dua.

Ini akan mencetak nama pengguna semua pengguna dengan UID> 1000:

getent passwd | awk -F: '$3 > 1000 {print $1}'

Dan ini hanya akan mencetak foundjika setidaknya ada yang ditemukan:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'
ilkkachu
sumber
bagaimana saya menggunakan ini dengan pernyataan if? jika $ 3> 1000, lakukan sesuatu
user3239222
Saya memodifikasi ini sedikit, karena pengguna desktop pertama sama dengan 1000, dan ada jenis pengguna lain seperti "tidak ada", jadi kami juga memerlukan batas atas (yang baru saja saya setel ke 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming
@ Benjaoming, err, ya, >= 1000sepertinya memang masuk akal. Tapi pertanyaannya ada > 1000karena beberapa alasan. nobodytampaknya biasa 6553xatau 3276x, jadi Anda mungkin bisa menaikkan batas atas itu sedikit.
ilkkachu
4

Konstruk ini tidak masuk akal:

"$(id -u)" -gt "1000" </etc/passwd

The idperintah bekerja terlepas dari pengalihan masukan. Pengalihan tidak masuk akal di sini.

Anda dapat menggunakan pipa ini dalam perbandingan pengujian Anda. Ini akan menunjukkan kepada Anda id pengguna tertinggi pada mesin:

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

Anda mungkin ingin men-tweak untuk beberapa sistem karena mungkin ada nobodypengguna dengan 65534hadiah UID .


sumber
1

Menggunakan kode Tom ini berhasil bagi saya ..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi
pengguna3239222
sumber
saya membuat pengguna mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. ketika saya menjalankan kode katanya ada, ketika saya menghapus pengguna, katanya tidak ada. L)
user3239222