0

システムにログインしているユーザーを判別し、次のような出力を生成する bash プログラム「getuserinfo」を作成する必要があります。

名前: Paul Beliveau ユーザー ID: csi2300100 開始: 17:05 2013-09-17
名前: Bob Dangelo ユーザー ID: csi2300133 開始: 09:12 2013-09-16
名前: David Pease ユーザー ID: csi2300141 開始: 11:34 2013-09- 17
名前: リー パトリック ユーザーID: csi2300148 開始: 14:29 2013-09-17

現在、私が持っているのは次のとおりです。

#!/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 でループする方法を見つけることができました。私の計画は、変数 name、userID、および start に値を格納し、ループを実行するたびにそれらを出力することでした。私の現在の問題は、名前を変数として取得し、who コマンドから開始時間を短縮する方法を見つけることです。

4

1 に答える 1

2

現在のアプローチで見られるいくつかの問題を次に示します。

  1. コマンドの出力に変数を割り当てたい場合は、$(..)or else backticksを使用する必要があります``。例えば:

    name="$(grep $ID /etc/passwd | cut -d: -f5)"
    
  2. ただし、割り当てでのgrepandcutコンボには注意してください。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 に答える