查看当前登录的用户并从/ etc / passwd获取其信息

时间:2014-05-03 22:47:16

标签: linux bash unix search etcpasswd

我希望能够看到当前登录到服务器的用户,然后根据用户名搜索/etc/passwd文件,找到他们的ID(第3列)和全名(第5列)并一起显示。< / p>

例如:

$ who    
USER         TTY
billyt     pts/2 
$ cat /etc/passwd
…
billyt:x:10:100:Tom Billy:/home/billyt:/bin/bash
…

我的输出应显示其用户名,ID和全名:

Username: billyt   ID: 10   FullName: Tom Billy

这是我到目前为止所尝试的:

#!/bin/bash
file="/etc/passwd"

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
        # display fields using f1, f2,..,f7
        echo "Username: $f1, UserID: $f3, FullName: $f5"
done <"$file"

我尝试显示我需要的字段(f1,f3和f5)。这是一个好方法吗?我是否可以从who命令进行搜索,将第一个who(用户名)字段保存到who.txt,然后从上面的文件中搜索?

2 个答案:

答案 0 :(得分:3)

您可以使用who命令将用户存储在数组中,然后在读取/etc/passwd文件时,循环访问数组以查看用户是否在数组中,如果是,则打印来自/etc/passwd文件的条目,格式为您所需的格式。

类似的东西:

#!/bin/bash

while read -r user throw_away; do 
    users+=( "$user" )
done < <(who)

while IFS=: read -r f1 f2 f3 f4 f5 f6; do
    for name in "${users[@]}"; do
        if [[ "$name" == "$f1" ]]; then
            echo "Username: $f1, UserID: $f3, FullName: $f5"
        fi
    done
done < /etc/passwd 

我们使用process substitution <(..)who的输出传递给第一个while loop并创建一个数组users。由于我们只需要名称,因此我们使用虚拟变量throwaway来捕获其他所有内容。

在第二个while loop中(我重新使用了大部分现有代码),我们检查`/ etc / passwd / file中的第一个字段是否存在于我们的数组中。如果是这样,我们将以您想要的格式打印该行。

您还可以使用关联数组(bash v4.0或更高版本)将用户存储为键。我会留给你练习。

答案 1 :(得分:1)

当然,有很多方法可以做到这一点。

echo "Username     UserID  Full Name"
while read name therest; do
  g=$(grep "$name" /etc/passwd)
  [[ "$g" =~ ([^:]+):[^:]+:([^:]+):[^:]+:([^:]+) ]]
  printf "%-12s %6d  %s\n" \
         "${BASH_REMATCH[1]}" \
         "${BASH_REMATCH[2]}" \
         "${BASH_REMATCH[3]}"
done < <(who)