0

我需要编写一个 bash 程序“getuserinfo”来确定登录到系统的用户并产生如下输出:

名称:Paul Beliveau 用户 ID:csi2300100 开始:2013-09-17 17:05
名称:Bob Dangelo 用户 ID:csi2300133 开始:09:12 2013-09-16
名称:David Pease 用户 ID:csi2300141 开始:11:34 2013-09- 17
姓名:Lee Patrick 用户 ID:csi2300148 开始时间:2013-09-17 14:29

目前我所拥有的只有以下内容:

#!/bin/bash

for person in $(who | cut -f1)
do
    ID=$person
    name=grep $ID /etc/passwd | cut -d':' -f5 #causes error
    start=      #Not sure what to do here

    echo "Name: $name userID: $ID start: $start"

done

exit 0

我知道这远非正确,但到目前为止,我能够成功地做的就是找到一种方法,通过他们的用户 ID 循环访问系统中的用户。我的计划是将值存储在变量名称、用户 ID 中,然后开始,然后在每次循环运行时打印它们。我当前的问题是将名称作为变量获取,并找到一种方法来减少 who 命令的开始时间。

4

1 回答 1

2

以下是我在您当前的方法中看到的一些问题:

  1. 如果要将变量分配给命令的输出,则需要使用$(..)或使用反引号``。例如:

    name="$(grep $ID /etc/passwd | cut -d: -f5)"
    
  2. 不过,在你的作业中要小心你的grepcut组合。name=如果用户的登录名是另一个用户登录名中的子字符串会怎样?如果一个用户的登录名包含在另一个用户的实际名称中怎么办。考虑使用正则表达式来缩小范围。也许是这样的(但我敢打赌你可以做得更好):

    name="$(grep "^${ID}:" /etc/passwd | cut -d: -f5)"
    
  3. 我建议使用getent命令而不是/etc/passwd. getent即使它不在本地文件中,也会为您提供您寻求的登录信息。例如,如果您使用的是 NIS 或 LDAP。

    name="$(getent passwd | grep "^${ID}:" | cut -d: -f5)"
    
  4. 考虑保留命令的整个输出who并逐行读取。然后,您可以提取他们的登录名和登录时间。就像是:

    who | while read whoent
    do
      ID="$(echo $whoent | cut -d' ' -f1)"
      start="$(echo $whoent | cut-d' ' -f3,4)"
    

祝你好运!

于 2013-09-23T21:51:23.260 回答