0

しばらくサーバーに接続していないユーザーを検出するスクリプトを作成しています。

これまでのところすべて問題ありませんが、スクリプトから生成されたリストから不要なエントリを削除しようとしています。使用されていない引数で lastlog が呼び出されたときに、出力が画面に出力されないように、スクリプトに例外を追加したいと思います。

私は次のようなことを試しました:

if [ $? -gt 0 ]; then
    echo "ERROR!"
fi

しかし、問題は lastog が成功時に 0 を返すことですが、単純に:

lastlog: Unknown user or range: infolog

エラーで。したがって、例外をキャッチできません。

これが私のコードです(これは非常に単純です)

#!/bin/bash
FILES=../*

for year in 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
do
    for f in $FILES
    do
        tempUser=${f:3:20}
        userCommand=`lastlog -u $tempUser | grep $year`

        if [ ${#userCommand} != 0 ]   
        then
          echo "$userCommand"
        fi

    done
done
4

1 に答える 1

1

これは非常に簡単にテストできますが、私の便利な Linux ボックスでlastlogは、実際に不正なユーザー名に対してゼロ以外のステータスが設定されます。

$ if lastlog -u nosuchuser; then echo no error; else echo error; fi
lastlog: Unknown user or range: nosuchuser
error

これをパイプで実行している場合、問題は、パイプ シーケンスの「ステータス」がパイプラインの最後の要素のステータスになることです。

$ progA | progB | progC
$ echo $?

progC のステータスを出力します。

bash を使用している場合は、bash のPIPESTATUS配列変数を介してすべてのステータスを取得できます。

bash$ progA | progB | wc
bash: progB: command not found
bash: progA: command not found
      0       0       0
bash$ echo ${PIPESTATUS[@]}
127 127 0
bash$

これで残りの道が開けます。


編集:あなたは気にしないかもしれません.stderr出力を捨てる方法を探しているだけですlastlog.その場合、以下を検討してください:

$ lastlog 2>/dev/null | grep ...
于 2012-04-29T22:22:26.187 に答える