내 임무는 mysql 로그인을 감사할 수 있는 bash 스크립트를 작성하는 것입니다. 에서 옵션을
활성화하면 mysql이 수행하는 모든 활동을 등록하고 작성할 수 있다(저의 경우) . 이렇게 하면 다음 줄이 표시됩니다.general_log
/etc/my.cnf
/var/lib/mysql/localhost.log
cat
2018-11-18T12:39:46.622298Z 5 Connect Access denied for user 'root'@'localhost' (using password: YES)
그래서 이를 염두에 두고 다음 grep 구문을 만들었습니다(변수를 실제 숫자로 변경하면 작동했습니다!).
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -v denied
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep denied
또한 이러한 로그인 수를 계산하기 위해 grep 명령을 만들었습니다.
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -cv denied
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -c denied
모두 작동하며 제가 아는 한 기술적으로 정확합니다(철자 검사를 거쳤습니다!).
하지만 사용자로부터 변수를 가져와 올바른 스크립트에 넣을 수 있도록 이를 스크립트로 구워야 하지만 지금까지는 작동하도록 할 수 없습니다. bash
읽으려고 할 때 오류가 발생했습니다 . 아래의 첫 번째 변수를 참조하세요.
지금까지의 코드:
#!/bin/bash
echo "Year input: "
read -r year
if [[ $year -gt 2020 ]];
then
echo "Incorrect year input."
exit 1
else
echo "Month input: "
read -r month
if [[ $month -gt 12 ]];
then
echo "Incorrect month input."
exit 1
else
echo "Day input: "
read -r day
if [[ $day -gt 31 ]];
then
echo "Incorrect day input."
exit 1
else
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -v denied
logbien=$(grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -cv denied)
echo "Correct logins: "echo "$logbien" | wc -1 " times."
echo ''
grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep denied
logmal=$(grep "$year"-"$month"-"$day" /var/lib/mysql/localhost.log | grep Connect | grep -c denied)
echo "Incorrect logins: "echo "$logmal" | wc -1 " times."
fi
fi
fi
exit 0
발생한 오류(원본: 아래 그림 1):
[root@localhost ~]# sh /medla/sf_compartida/two.sh
Year input:
2018
': not a valid identifiersh: line 3: read: `year
/media/sf_compartida/two.s: line 34: syntax error: unexpected end of file
[root@localhost ~]#
편집하다
새 코드:
#!/bin/bash
read -r -p "Enter the date (YYYY-mm-dd): " date
if ! date=$(date -d "$date" "+%Y-%m-%d")
then
echo "Error: invalid date" >&2
exit 1
fi
year=${date%%-*}
if [[ $year -gt 2020 ]]
then
echo "invalid year" >&2
exit 1
else
grep "$date" /var/lib/mysql/localhost.log | grep Connect | grep -v denied
logbien=$(grep "$date" /var/lib/mysql/localhost.log | grep Connect | grep -cv denied)
echo "Correct logins: "echo "$logbien" | wc -1" times."
echo ''
grep "$date" /var/lib/mysql/localhost.log | grep Connect | grep denied
logmal=$(grep "$date" /var/lib/mysql/localhost.log | grep Connect | grep -c denied)
echo "Incorrect logins: "echo "$logmal" | wc -1" times."
fi
발생한 오류(원본: 아래 그림 2):
[root@localhost ~]# sh /media/sf_compartida/two2.sh
Enter the date (YYYY-mm-dd): 2018-11-20
': not a valid identifier.sh: line 2: read: `date
/media/sf compartida/two2.sh: line 9: syntax error in conditional expression
'media/sf_compartida/two2.sh: line 9: syntax error near `]]
'media/sf_compartida/two2.sh: line 9: `if [[ $year -gt 2020 ]]
[root@localhost ~]#
답변1
이것은 대답은 아니지만 일부 코드 검토입니다. 날짜 입력을 개선하기 위해 이것을 제안합니다. 사용자가 즉시 날짜를 입력하고 명령을 사용하여 date
사용자 입력을 검증하고 정규화합니다.
read -r -p "Enter the date (YYYY-mm-dd): " date
if ! date=$(date -d "$date" "+%Y-%m-%d"); then
echo "Error: invalid date" >&2
exit 1
fi
year=${date%%-*}
if [[ $year -gt 2020 ]]; then echo "invalid year" >&2; exit 1; fi
# then: grep "$date" logfile ...