nếu câu lệnh id người dùng truy vấn trong etc / passwd?


8

Sử dụng bash Tôi đang cố gắng truy vấn /etc/passwdbất kỳ người dùng nào có id trên 1000. Nếu họ tồn tại làm điều gì đó, người khác sẽ làm điều gì đó khác. Tôi bối rối. Bất kỳ trợ giúp được đánh giá cao.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi

1
Điều này có phải là trong bash (vỏ)?
Stephen Rauch

Vâng xin lôi. sử dụng bash
user3239222

Câu trả lời:


8

Thử cái này:

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

Các greptìm kiếm đầu tiên passwdcho các dòng có uid gồm bốn chữ số trở lên. Bộ greplọc thứ hai lọc ra dòng có uid 1000. Trạng thái thoát sẽ là 0 nếu có bất kỳ dòng nào còn lại, 1 nếu không.


tôi gặp lỗi cú pháp: kết thúc tập tin không mong muốn
user3239222

Bạn phải theo dõi nó bằng một thendòng, v.v.
Tom Zych

1
Tôi quên mất; làm cho grep thứ hai -Evqđể triệt tiêu đầu ra của nó.
Tom Zych

4
Từ cái nhìn của nó, cái này tìm các trường UID dài ít nhất 4 ký tự, hoạt động ở đây nhưng không hữu ích nếu giá trị ngưỡng là thứ gì đó không phải là mười. Ngoài ra, kết quả có thể gây nhầm lẫn nếu một số con số có được số 0 hàng đầu vì một số lý do.
ilkkachu

1
Nếu bạn sử dụng YP / NIS hoặc LDAP, thì phân tích đầu ra getent passwdthay vì /etc/passwdtệp.
Kusalananda

16

Để làm điều đó trong một bashvòng lặp, tôi đề nghị sử dụng readIFSthích:

#!/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

đã thử nhưng nó cho ra tất cả người dùng LT và GT
user3239222

1
Nó xuất ra một số người dùng là LT và phần còn lại là GT. Đó là những gì tôi nghĩ bạn cần.
Stephen Rauch

tôi chỉ muốn kiểm tra vv / mật khẩu để xem liệu có bất kỳ UID nào lớn hơn 1000 tồn tại không và làm điều gì đó nếu đúng, làm điều gì đó khác nếu sai ..
user3239222

4
Các từ khóa trong bình luận của bạn là nếu có , câu hỏi chohọ . Số nhiều họ chỉ cho tôi rằng bạn dự định xử lý mỗi người dùng. Nhưng ba câu trả lời khác ở đây đã không đọc theo cách đó, vì vậy ....
Stephen Rauch

14

Thay vì đọc /etc/passwdtrực tiếp, bạn nên sử dụng getent passwd, điều đó cũng sẽ hoạt động nếu một số người dùng của bạn được lưu trong một cái gì đó như LDAP hoặc như vậy. awkphải phù hợp với định dạng đầu ra được phân tách bằng dấu hai chấm.

Điều này sẽ in tên người dùng của tất cả người dùng với UID> 1000:

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

Và điều này sẽ chỉ in foundnếu tìm thấy ít nhất một cái như vậy:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'

Làm thế nào tôi sẽ sử dụng điều này với một câu lệnh if mặc dù? nếu $ 3> 1000, hãy làm gì đó
user3239222

Tôi đã sửa đổi điều này một chút, bởi vì người dùng máy tính để bàn đầu tiên bằng 1000 và có những loại người dùng khác như "không ai", vì vậy chúng tôi cũng cần một giới hạn trên (mà tôi đã tự ý đặt thành 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
benjaoming

@benjaoming, err, yes, >= 1000thực sự sẽ có ý nghĩa. Câu hỏi đã > 1000cho một số lý do mặc dù. nobodydường như là phổ biến 6553xhoặc 3276x, vì vậy bạn có thể có thể tăng giới hạn trên một chút.
ilkkachu

4

Cấu trúc này không có nhiều ý nghĩa:

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

Các idlệnh làm việc không phụ thuộc vào chuyển hướng đầu vào. Dù sao thì việc chuyển hướng không có ý nghĩa gì.

Bạn có thể sử dụng đường ống này trong so sánh thử nghiệm của bạn. Nó sẽ hiển thị cho bạn id người dùng cao nhất trên máy:

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

Bạn có thể muốn điều chỉnh nó cho một số hệ thống vì có thể có nobodyngười dùng có UID 65534.


1

Sử dụng mã của Tom, điều này làm việc cho tôi ..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi

tôi đã tạo một người dùng mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. Khi tôi chạy mã nó tồn tại, khi tôi xóa người dùng, nó nói không tồn tại. L)
dùng3239222
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.