2012-04-29 5 views
0

私はしばらくの間、どのユーザーがサーバーに接続していないかを検出するスクリプトを作成しています。lastlog(unix&bash)からのキャッチエラー

これまでのところすべてが良いですが、私のスクリプトから生成されたリストから不要なエントリを削除しようとしています。スクリプトに例外を追加して、使用されていない引数で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 

答えて

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$ 

あなたが道の残りの部分を取得する必要があります。


編集:あなたも気にしないかもしれない、とばかり lastlogからの標準エラー出力を捨てるための方法を探していること、考えるその場合には:

$ lastlog 2>/dev/null | grep ... 
+0

ありがとうございました!チャームのように働いた! – Erwald

関連する問題