需要 Linux 重定向帮助



>我正在尝试创建一个脚本,该脚本在运行时将访问/var/log/secure 文件并报告当天发生的失败尝试次数,将输出附加到名为 fail 的文件中,格式如下:

日期: 02/15/14 时间: 10:30 失败尝试次数: 8

输出

应使用文件重定向在脚本内部完成,以便标准输出进入失败.log标准错误进入错误.log文件。

我的代码(test.sh)是这样的:

#!/bin/bash
 for i in $(date)
 do
 mdy=$($i "+%m/%d/%Y)
 md=$($i "+%m %d")
 tme=$($i "+ H:%M)
 fail=$(grep Failed /var/log/secure | grep $md | wc -l
 echo "Date: $mdy Time: $tme Number of failed attempts: $fail"
 done

我做错了什么?

我做了 for 循环,认为 i 将是日期命令,mdy 将显示 mm/dd/yy,tme 将是 HH:MM,md 将用于 grep 失败登录的 var/log/secure。

一旦我得到我想要的输出,我将能够通过以下方式进行重定向sh test.sh>失败.log 2> 错误.log

如果问题是关于重定向的,我是这样做的:

#!/bin/bash
THIS_SCRIPT_NAME=$( basename $0 )
LOG_DIR='/var/log'
DATE_POSTFIX=$( date '+_%Y_%m_%d_%H_%M_%S' )
LOG_FILE="${LOG_DIR}/${THIS_SCRIPT_NAME}${DATE_POSTFIX}.log"
if [ ! -d "$LOG_DIR" ]; then
        mkdir -p "$LOG_DIR"
fi
exec 1>>"$LOG_FILE" 2>&1

只需删除不必要的部分并修复剩余的部分,您的脚本可能如下所示。 如果您只想处理单个日期,则不需要for循环。

#!/bin/bash
mdy=$(date "+%m/%d/%Y")
md=$(date "+%m %d")
tme=$(date "+%H:%M")
# Assuming the date stamp always precedes the message
fail=$(grep -c "$md.*Failed" /var/log/secure)
echo "Date: $mdy Time: $tme Number of failed attempts: $fail"
实际上

没有太多可能出错的地方;主要是,如果您没有对/var/log/secure的读取访问权限或它不存在,则标准错误将包含一条消息。

有一些方法可以避免多次调用date,但这几乎不会成为这里的性能瓶颈。

也许你正在寻找这样的东西? 我真的不知道您希望它看起来如何解析,但是使用这些变量您可以随心所欲地进行操作。 但是,我相信您的 for 循环并没有做您想要做的事情。

#!/bin/bash
set -- $(date)
DAYNAME=$1; MONTH=$2; DAY=$3; TIME=$4; YEAR=$6
ATTEMPTS=$(grep -iw 'Failed|$2|$3' /var/log/secure | wc -l)
echo "Date: $MONTH $DAY $YEAR Time: $TIME Number of failed attempts: $ATTEMPTS"

最新更新