Я создаю инструмент, который выполняет поиск безопасности. Мой сценарий обнаружения принтера получает строки в другом файле .txt, например «Версия прошивки принтера», и использует инструмент grep, чтобы проверить, существует ли он на целевом веб-сайте хоста. Но мой скрипт разбивает эти строки и использует их как разные переменные, такие как Принтер, прошивка, версия. Как я могу получить эти строки, не разделяя их?
found=(`cat temp.txt`) # <- This line for target
httarr=(`cat httpport.txt`)
printer_array=(`cd ..; cat keywords/printerwords.txt`)
for lo in ${httarr[*]}
do
ifacelook=`curl -sSL http://$found:$lo`
for pr in ${printer_array[*]}
do
echo $pr # <-This line is to see incoming variables
echo $found | grep -o '${pr}' &>/dev/null
if [ $? -eq 0 ];then
echo -en "$cyan>$green|${red}printer$green|$cyan>$default This device is a printer check: http://$found:$lo \n"
fi
done
done
Incoming variables:
Printer
Firmware
Version
.
.
.
Variables I want:
Printer Firmware Version
.
.
.





Ваше разделение слов происходит с:
found=(`cat temp.txt`) # <- This line for target
httarr=(`cat httpport.txt`)
(которые оба включают UUOC (ненужное использование cat))
Вместо этого используйте:
mapfile -t found < temp.txt
mapfile -t httarr < httpport.txt
mapfile (синоним readarray) будет читать каждую строку файла из stdin в индексированные массивы.
Не рекомендуется, но вы также можете установить IFS (внутренний разделитель полей), чтобы он разбивался только на новые строки:
set -o noglob ## disable globbing to protect from * in line
oldifs = "$IFS" ## save current IFS
IFS=$'\n' ## set IFS to newline only
found=( $(< temp.txt) ) ## fill arrays
httarr=( $(< httpport.txt) )
IFS = "$oldifs" ## restore original IFS
set +o noglob ## restore globbing (thanks to Charles)
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.
Кроме того, все остальные подстановки переменных и команд должны быть заключены в двойные кавычки (например, echo "$found" | grep -o "${pr}" вместо echo $found | grep -o '${pr}'). Чтобы получить элементы массива, используйте "${httarr[@]}" instead of ${httarr[*]}`. shellcheck.net хорошо указывает на такие вещи.
В версии, где вы меняете IFS, вам также необходимо отключить подстановку. В противном случае строка, содержащая только *, все равно будет заменена списком имен файлов.
@CharlesDuffy - спасибо, Чарльз, обновлено. Спасибо и Гордон.
mapfile -t found < temp.txtиmapfile -t httarr < httpport.txt. Избавьтесь отfound=(cat temp.txt)иhttarr=(cat httpport.txt)(или установитеIFS=$'\n', а затем восстановите значение по умолчанию).