Shell脚本 - 每个唯一用户

时间:2011-01-10 18:42:39

标签: linux bash shell

我有一个家庭作业:“为每个独特的用户,报告他们所属的群组以及他们上次登录的时间”

到目前为止,我有:

#!/bin/sh

echo "Your initial login:"
who | cut -d' ' -f1 | sort | uniq

echo "Now is logged:"
whoami

echo "Group ID:"
id -G $whoami

case $1 in
   "-l") last -Fn 10 | tr -s " " ;;
   *)    last -Fn 10 | tr -s " " | egrep -v '(^reboot)|(^$)|(^wtmp a)|(^ftp)' | cut -d" " -f1,5,7 | sort -uM | uniq -c
esac

我的问题是:我如何展示每个独特的用户?上面的脚本仅显示登录系统的最新用户,但我需要所有唯一用户。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

以下链接提供了一些列出用户的替代方法。它们涉及阅读/etc/passwd

http://www.linuxquestions.org/linux/answers/Networking/How_to_list_all_your_USERs

答案 1 :(得分:0)

似乎除了阅读/etc/passwd之外别无他法,例如:

$ for u in `cat /etc/passwd | cut -d: -f1`; do echo $u `id -Gn $u`; done

答案 2 :(得分:0)

要遍历任何唯一身份用户,您可以获取passwd文件的内容并获取每行的第一个标记。

我建议使用getent passwd来阅读passwd,因为/etc/passwd仅包含来自本地计算机文件的用户(例如:没有来自LDAP或其他PAM插件的用户)。

getent passwd | cut -d':' -f1

此命令将每行返回一个用户。

然后lastid将告诉您他们上次登录及其群组:

for user in `getent passwd | cut -d':' -f1`
do
    id ...
    last ...
done

答案 3 :(得分:0)

使用last

的脚本
#!/bin/bash
while read user; do
  echo "User '$user':"
  echo -e "\t Last login: $(last -1R "$user" | awk 'NR==1{if($0 ~ /^$/){print "Never"}else{$1=$2="";print}}')"
  echo -e "\t Groups: $(getent group | awk -F: -v user="$user" '$0 ~ user{a[i++]=$1} END{for(item in a)printf("%s ", a[item])}')"
done < <(getent passwd | awk -F: '{print $1}')

输出

名称已更改为保护无辜者

User 'foo':
         Last login:  Oct 19 15:07:19 -0700 2010
         Groups: foo groupA groupB
User 'bar':
         Last login:  Nov 16 11:40:23 -0800 2008
         Groups: bar groupA groupC groupD
User 'baz':
         Last login: Never
         Groups: baz groupA groupD