2012-01-21 23 views
13

Deseo descargar una página web mientras proporciono las URL de stdin. Esencialmente, un proceso produce continuamente URL para stdout/file y quiero canalizarlos a wget o curl. (Piénselo como un simple rastreador web si lo desea).wget o curl de stdin

Esto parece funcionar bien:

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

Pero cuando se utiliza 'tail-f' y que ya no funciona (buffering o wget está esperando EOF?):

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

¿Alguien podría proporcionar una solución usando wget, curl o cualquier otra herramienta estándar de Unix? Lo ideal es que no quiera reiniciar wget en el bucle, simplemente manténgalo funcionando descargando URLs tal como vienen.

Respuesta

6

Lo que necesita para usar es xargs. P.ej.

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

Con 'xargs'' wget' recibe la URL como parámetro para que ya no necesite '-i -'. 'tail -f 1.log | xargs -n1 wget -O - -q' – pabouk

+0

esto iniciará un nuevo proceso de wget por URL –

+0

Si esto se está ejecutando en una máquina compartida, puede que desee saber que cualquier otro usuario puede leer sus parámetros usando el comando "ps", así que no pongas contraseñas, etc. en tus URL. Utilice una de las soluciones que no implique convertir stdin en parámetros si esto pudiera ser un problema (los administradores con acceso de root a la máquina podrían, por supuesto, verificar qué URL están buscando, pero presumiblemente confían en los administradores más de lo que confían al azar otros usuarios). –

0

Usa xargs que convierte stdin en argumento.

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

Como he comentado en la otra respuesta: si esto se está ejecutando en una máquina compartida, es posible que desee saber que cualquier otro usuario puede leer sus parámetros con el comando "ps", así que no coloque contraseñas, etc. en sus URL . Utilice una de las soluciones que no implique convertir stdin en parámetros si esto pudiera ser un problema (los administradores con acceso de root a la máquina podrían, por supuesto, verificar qué URL están buscando, pero presumiblemente confían en los administradores más de lo que confían al azar otros usuarios). –

3

Puede hacerlo con cURL, pero su entrada debe estar formateada correctamente. Ejemplo alfa.txt:

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

ejemplo alternativo:

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

Comando de ejemplo:

cat alfa.txt | curl -K- 
+0

Las líneas de "salida" o "nombre remoto" son opcionales: omítelas si desea que la salida pase a la salida estándar.Entonces, todo lo que necesita es agregar "url" al inicio de cada línea (por ejemplo, pipe through sed -e 's/^/url /') –

+0

El problema de almacenamiento en búfer de OP seguirá siendo un problema aquí. curl's -K- no carga su entrada una línea a la vez. –

0

Pruebe una tubería de la tail -f través python -c $'import pycurl;c=pycurl.Curl()\nwhile True: c.setopt(pycurl.URL,raw_input().strip()),c.perform()'

Esto consigue rizo (bueno, ya probablemente significó el curl de línea de comando y lo estoy llamando como una biblioteca desde un Python de una sola línea, pero sigue siendo curl) para obtener cada URL de forma inmediata, al tiempo que aprovecho para mantener el socket abierto al servidor si está solicitando varias URL del mismo servidor en secuencia. Sin embargo, no es del todo robusto: si una de sus URLs es duff, el comando completo fallará (es posible que desee hacer una secuencia de comandos de Python adecuada y agregar try/except para manejar esto), y también está el pequeño detalle que arrojará EOFError en EOF (pero asumo que eso no es importante si está usando tail -f).