我正在尝试创建一个脚本,在运行时,将访问/ var / log / secure文件并报告当天发生的失败尝试次数,将输出附加到这种格式的名为failed的文件中:
日期:02/15/14时间:10:30失败尝试次数:8
并且输出应该在脚本内部使用文件重定向完成,因此标准输出进入failed.log并且标准错误进入error.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循环,认为我将是date命令,mdy将显示mm / dd / yy,tme将是HH:MM和md将用于grep var / log / secure for failed logins
一旦我得到了我想要的输出,我就可以通过重定向来完成重定向 sh test.sh> failed.log 2> error.log中
答案 0 :(得分:0)
也许你正在寻找这样的东西?我真的不知道你希望它如何被解析,但使用这些变量你可以按照你的意愿去做。但是,我认为你的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"
答案 1 :(得分:0)
如果问题是关于重定向,我这样做:
#!/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
答案 2 :(得分:0)
只需移除不必要的部分并修复剩下的部分,您的脚本就会如下所示。如果您只想处理单个日期,则无需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
,但这不会成为此处的性能瓶颈。