BASH - проблема пинга из строк текстового файла - PullRequest
0 голосов
/ 22 августа 2011

Текстовый файл содержит около 3 миллионов URL-адресов сайтов, которые я хочу заблокировать. Попытка пинговать их один за другим (да, я знаю, что это займет некоторое время). Есть сценарий (да, я немного медленный в BASH), который читает строки по одной из текстового файла. Очевидно, не может распечатать текстовый файл здесь. Текстовый файл был создан >> с Python некоторое время назад. Проблема в том, что ping возвращает «неизвестный хост» с каждой записью. Если я создаю меньший файл вручную, используя те же записи, скрипт работает. Я подумал, что это может быть проблема с пробелом или концом строки, поэтому попытался решить это в скрипте. В чем может быть проблема?

  #!/bin/bash
  while read line
  do
    li=$(echo $line|tr -d '\n')
    li2=$(echo $li|tr -d ' ')
    if [ ${#line} -lt 2 ]
    then
      continue
    fi
    ping -c 2 -- $li2>>/dev/null
    if [ $? -gt 0 ]
    then 
       echo 'bad'
    else
       echo 'good'
    fi
    done<'temp_file.txt'

Ответы [ 4 ]

1 голос
/ 22 августа 2011

Ping используется для проверки связи с хостами. Если у вас есть URL-адреса веб-сайтов, то это не будет работать. Убедитесь, что в вашем файле есть хосты, например www.google.com или IP-адрес, а не фактические полные URL-адреса веб-сайтов. Если вы хотите проверить фактические URL-адреса, используйте инструмент, такой как wget, и другой инструмент, такой как grep/awk, чтобы получить ошибки, такие как 404 или другие. И последнее, но не менее важное: люди, которые заботятся о безопасности, иногда блокируют пинг извне, поэтому примите к сведению.

1 голос
/ 22 августа 2011

Содержит ли файл URL-адреса или имена хостов?

Если он содержит URL-адреса, вы должны извлечь имя хоста из URL-адресов перед проверкой:

hostname=$(echo "$li2"|cut -d/ -f3);
ping -c 2 -- "$hostname"
0 голосов
/ 22 августа 2011

Я бы не использовал ping для этого. Его легко заблокировать, и это не лучший способ проверить IP-адреса или если сервер представляет веб-страницы.

Если вы просто хотите найти соответствующий IP, используйте host:

$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 209.85.149.106
www.l.google.com has address 209.85.149.147
www.l.google.com has address 209.85.149.99
www.l.google.com has address 209.85.149.103
www.l.google.com has address 209.85.149.104
www.l.google.com has address 209.85.149.105

Как видите, вы получаете все IP-адреса, зарегистрированные на хосте. (Обратите внимание, что для этого необходимо проанализировать имя хоста из ваших URL!)

Если вы хотите увидеть, указывает ли URL-адрес на веб-сервер, введите wget:

wget --spider $url

Флаг --spider заставляет wget не сохранять страницу, просто убедитесь, что она существует. Вы можете посмотреть код возврата или добавить флаг -S (который печатает возвращенные заголовки HTTP)

0 голосов
/ 22 августа 2011

C чёрт, если файл содержит оконный стиль \r\n окончания строк: head file | od -c

Если это так, чтобы исправить это: dos2unix filename filename

...