#while-loop #ksh
Вопрос:
Я пытаюсь написать простой скрипт в Ksh, чтобы посмотреть на неудачные попытки и посмотреть ip-адреса. Я сбрасываю вывод lastb в файл и хочу получить только имя пользователя и IP-адрес, с которого он был получен.
вывод последней строки
user ssh:notty 143.244.175.142 Mon Jun 21 01:04 - 01:04 (00:00)
user ssh:notty 143.244.175.142 Mon Jun 21 00:57 - 00:57 (00:00)
мой сценарий выглядит так
#!/usr/bin/ksh
FailedLogins="$HOME/sshattempts.txt
if [ -e "$FailedLogins" ]
then
echo "yes file exists"
fi
# while loop
while IFS= read user tty ip
do
printf "$user $ip"
done <"$FailedLogins"
Комментарии:
1. Вы пропускаете
"
входFailedLogins="$HOME/sshattempts.txt
. Я бы назвал файлssh_attempts.txt
, теперь он выглядит такss_hat_tempts.txt
.
Ответ №1:
Вы могли бы использовать что-то вроде этого
#!/bin/ksh
if [[ -r $HOME/sshattempts.txt ]]; then
print "yes file $HOME/sshattempts.txt exists"
else
exit
fi
while read line; do
parts=( $line )
print "${parts[0]} ${parts[2]}"
done < $HOME/sshattempts.txt
Ответ №2:
Во время обработки каждая строка будет разбита на 10 отдельных полей (разделенных пробелами). Когда переменных недостаточно (в данном случае 3) read
, в последнюю переменную будет вставлена «остальная часть строки».
Обработка первой строки из sshattempts.txt
приведет к следующим назначениям переменных:
user='user'
tty='ssh:notty'
ip='143.244.175.142 Mon Jun 21 01:04 - 01:04 (00:00)'
Хотя вы можете отредактировать код, чтобы предоставить read
10 переменных, вы можете использовать правило «вставить остаток строки в последнюю переменную», добавив еще одну переменную для хранения всех полей, которые следуют за ip
полем, например:
while IFS= read user tty ip rest_of_line
Теперь при обработке первой строки от sshattempts.txt
вас должно появиться:
user='user'
tty='ssh:notty'
ip='143.244.175.142'
rest_of_line='Mon Jun 21 01:04 - 01:04 (00:00)'
Ответ №3:
Первая и третья запись строки:
awk '{print $1, $3}' "$FailedLogins"