Мой python скрипт останавливается ... без ошибок, просто останавливается - PullRequest
0 голосов
/ 08 мая 2020

Я запускаю сценарий, который просматривает текстовый файл. В каждой строке текстового файла указан IP-адрес. Скрипт захватывает баннер, затем записывает ip + banner в другой файл. Проблема в том, что он просто останавливает около 500 строк, более или менее, без ошибок. Еще одна странность: если я запустил его с python3, он сделает то, что я сказал выше. Если я запустил его с python, он перебирает эти 500 строк, а затем начинает с самого начала. Я заметил это, когда увидел повторы в моем выходном файле. В любом случае, вот код, может быть, вы, ребята, скажете мне, что я делаю не так:

import os
import subprocess
import concurrent.futures
#import time, random
import threading
import multiprocessing


with open("ipuri666.txt") as f:



    def multiprocessing_func(): 
        try:
            line2 = line.rstrip('\r\n')
            a = subprocess.Popen(["curl", "-I", line2, "--connect-timeout", "1", "--max-time", "1"], stdout=subprocess.PIPE)
            b = subprocess.Popen(["grep", "Server"], stdin=a.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            #a.stdout.close()
            out, err = b.communicate()
            g = open("IP_BANNER2","a")
            print( "out: {0}".format(out))
            g.write(line2 + " " + "out: {0}\n".format(out))
            print("err: {0}".format(err))

        except IOError:
            print("Connection timed out")


    if __name__ == '__main__': 
        #starttime = time.time()
        processes = []
    for line in f:
        p = multiprocessing.Process(target=multiprocessing_func, args=()) 
        processes.append(p)
        p.start()

    for process in processes:
        process.join()

1 Ответ

0 голосов
/ 08 мая 2020

Если ваш вариант использования позволяет, я бы рекомендовал просто переписать это как сценарий оболочки, нет необходимости использовать Python. (Вероятно, это решит вашу проблему косвенно.)

#!/usr/bin/env bash
readarray -t ips < ipuri666.txt
for ip in ${ips[@]}; do
    output=$(curl -I "$ip" --connect-timeout 1 --max-time 1 | grep "Server")
    echo "$ip $output" >> fisier.txt
done

Сценарий немного проще, чем то, что вы пытаетесь сделать, например, я не фиксирую ошибку. Это должно быть довольно близко к тому, что вы пытаетесь выполнить sh. При необходимости обновлю еще раз.

...