2012-01-21 2 views
13

Я хотел бы загрузить веб-страницы при отправке URL-адресов из stdin. По существу, один процесс непрерывно создает URL-адреса для stdout/file, и я хочу связать их с wget или curl. (Подумайте об этом как о простом веб-гусеничном устройстве, если хотите).wget или curl from stdin

Это, кажется, работает нормально:

tail 1.log | wget -i - -O - -q 

Но когда я использую 'хвост -f' и больше не работает (буферизация или Wget ждет EOF?):

tail -f 1.log | wget -i - -O - -q 

Может ли кто-нибудь предоставить решение с помощью wget, curl или любого другого стандартного инструмента Unix? В идеале я не хочу перезапускать wget в цикле, просто продолжайте загружать URL-адреса при их появлении.

ответ

6

Что вам нужно использовать - xargs. Например.

tail -f 1.log | xargs -n1 wget -O - -q 
+0

С 'xargs'' wget' получает URL-адрес в качестве параметра, так что вам больше не нужно '-i''. 'tail -f 1.log | xargs -n1 wget -O - -q' – pabouk

+0

это запустит новый процесс wget за URL-адрес –

+0

Если это работает на общей машине, вам может потребоваться узнать, что любой другой пользователь может прочитать ваши параметры с помощью команды «ps», поэтому не ставьте пароли и т. д. в свои URL-адреса. Используйте одно из решений, которое не включает в себя преобразование stdin в параметры, если это может быть проблемой (администраторы с корневым доступом к машине могут, конечно, по-прежнему проверять, какие URL-адреса вы извлекаете, но предположительно вы доверяете администраторам больше, чем доверяете случайным другие пользователи). –

0

Используйте xargs, который преобразует stdin в аргумент.

tail 1.log | xargs -L 1 wget 
+0

Поскольку я прокомментировал другой ответ: если это выполняется на общей машине, вам может быть интересно узнать, что любой другой пользователь может прочитать ваши параметры с помощью команды «ps», поэтому не ставьте пароли и т. Д. В свои URL-адреса , Используйте одно из решений, которое не включает в себя преобразование stdin в параметры, если это может быть проблемой (администраторы с корневым доступом к машине могут, конечно, по-прежнему проверять, какие URL-адреса вы извлекаете, но предположительно вы доверяете администраторам больше, чем доверяете случайным другие пользователи). –

3

Вы можете сделать это с помощью cURL, но ваш вход должен быть правильно отформатирован. Пример alfa.txt:

url example.com 
output example.htm 
url stackoverflow.com 
output stackoverflow.htm 

Альтернативный пример:

url stackoverflow.com/questions 
remote-name 
url stackoverflow.com/documentation 
remote-name 

Пример команды:

cat alfa.txt | curl -K- 
+0

Строки «output» или «remote-name» являются необязательными: опустите их, если вы хотите, чтобы выход шел на стандартный вывод.Таким образом, все, что вам нужно, это добавить «url» в начале каждой строки (например, pipe через sed -e/^/url/') –

+0

Проблема буферизации OP по-прежнему будет проблемой. curl -K- не загружает свой вход по одной строке за раз. –

0

Попробуйте конвейеру tail -f через python -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

Это становится завиток (ну, вероятно, означало завиток командной строки и я называю это библиотекой из однострочного Python, но все еще зависает), чтобы сразу извлекать каждый URL-адрес, сохраняя при этом доступ к сокету на сервере открытым, если вы запрашиваете несколько URL-адресов с одного и того же сервера в последовательности. Однако это не совсем безопасно: если один из ваших URL-адресов является duff, вся команда будет терпеть неудачу (возможно, вы захотите сделать его правильным скриптом Python и добавьте /except, чтобы справиться с этим), и есть также небольшая деталь, которую он будет бросать EOFError на EOF (но я предполагаю, что это неважно, если вы используете tail -f).

Смежные вопросы