if语句在etc / passwd中查询用户ID?


8

我正在尝试使用bash查询/etc/passwdID超过1000的所有用户。如果存在,请执行某些操作,否则执行其他操作。我很沮丧 任何帮助表示赞赏。

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

1
这必须在bash(shell)中吗?
斯蒂芬·劳赫

是的,对不起。使用bash
user3239222

Answers:


8

尝试这个:

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

第一个grep搜索passwd的uid为四位或更多位的行。第二个grep过滤器用uid 1000过滤掉该行。如果剩余任何行,则退出状态将为0,否则为1。


我收到语法错误:文件意外结束
user3239222

你有一个遵循它then线等
汤姆·齐赫

1
我忘了; 使第二个grep -Evq抑制其输出。
Tom Zych

4
从它的外观来看,这将查找至少4个字符长的UID字段,该字段在这里可以工作,但是如果截止值不是10的幂,则不是很有用。同样,如果某些数字由于某种原因而导致前导零,结果可能会造成混淆。
ilkkachu

1
如果使用YP / NIS或LDAP,则解析输出getent passwd而不是/etc/passwd文件。
库沙兰丹

16

为此bash,我建议使用readIFS喜欢:

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

尝试过,但是它输出所有用户LT和GT
user3239222

1
它输出一些用户为LT,其余用户为GT。这就是我认为您需要的。
斯蒂芬·劳赫

我只想检查etc / password以查看是否存在大于1000的UID,如果为true,则执行某些操作,如果为false,则执行其他操作
。–

4
在您的评论的关键词是如果有的话,这个问题说他们他们向我表明您打算处理每个用户的复数形式。但是这里的其他三个答案没有那样读,所以……
Stephen Rauch

14

/etc/passwd您应该使用而不是直接阅读,getent passwd如果您的某些用户保存在LDAP之类的文件中也可以使用。awk应该非常适合冒号分隔的输出格式。

这将打印所有UID> 1000的用户的用户名:

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

found如果找到至少一个这样的文件,它将打印:

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

我如何将其与if语句一起使用?如果$ 3> 1000,请执行某操作
user3239222

我对此做了一些修改,因为第一个桌面用户等于1000,并且还有其他类型的用户,例如“ nobody”,因此我们还需要一个上限(我刚刚将其设置为2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'

@benjaoming,嗯,是的,>= 1000确实确实有意义。这个问题> 1000出于某种原因。nobody似乎通常是6553x3276x,因此您可以稍微提高该上限。
ilkkachu

4

这种构造没有多大意义:

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

id命令不管输入重定向如何都有效。重定向在这里毫无意义。

您可以在测试比较中使用此管道。它会向您显示机器上的最高用户ID:

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

您可能需要对某些系统进行调整,因为可能存在nobody带有UID 的用户65534


1

使用汤姆的代码对我有用。

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

我创建了一个用户mrBlonde:x:1001:1001 :: / home / mrBlonde:/ bin / bash。当我运行代码时,它说存在,当我删除用户时,它说不存在。L)
user3239222
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.