Многопоточность в bash-скриптах - PullRequest
0 голосов
/ 29 июня 2019

Я запускаю скрипт bash и зацикливаю столько строк в текстовом файле. взломать сайт, указанный в текстовом файле.

вот мой сценарий:

SECRET_KEY='zuhahaha'
FILE_NAME=""

case "$1" in
        "sma")     
            FILE_NAME="sma.txt"
        ;;
        "smk")      
            FILE_NAME="smk.txt"
        ;;
        "smp")      
            FILE_NAME="smp.txt"
        ;;
        "sd")      
            FILE_NAME="sd.txt"
        ;;
     *)
        echo "not in case !"
        ;;
esac

function save_log()
{
    printf '%s\n' \
    "Header Code    : $1" \
    "Executed at    : $(date)" \
    "Response Body  : $2" \
    "====================================================================================================="$'\r\n\n'  >> output.log
}

while IFS= read -r line; 
    do 
        HTTP_RESPONSE=$(curl -L -s -w "HTTPSTATUS:%{http_code}\\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1) &
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') &
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') &

        save_log "$HTTP_STATUS" "$HTTP_BODY" &
done < $FILE_NAME

как я могу запустить многопоточность или сделать цикл быстрым в bash?

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы должны быть в состоянии сделать это относительно легко.Не пытайтесь создать фон для каждой команды, вместо этого поместите тело цикла while в подоболочку и создайте фон для этого.Таким образом, ваши команды (которые явно зависят друг от друга) выполняются последовательно, но все строки в файле могут обрабатываться параллельно.

while IFS= read -r line; 
    do
       (
        HTTP_RESPONSE=$(curl -L -s -w "HTTPSTATUS:%{http_code}\\n" -H "X-Gitlab-Event: Push Hook" -H 'X-Gitlab-Token: '$SECRET_KEY --insecure $line 2>&1)
        HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
        HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')

        save_log "$HTTP_STATUS" "$HTTP_BODY" ) &
done < $FILE_NAME
0 голосов
/ 29 июня 2019

Мой любимый вариант - создать файл со списком всех команд, которые вы хотите выполнить. Если у вас есть скрипт, который выполняет ваши операции, создайте файл наподобие:

$ cat commands.txt
echo 1
echo 2
echo $[12+3]
....

Например, это могут быть сотни команд.

Чтобы выполнить каждую строку параллельно, используйте команду parallel с, скажем, не более чем 3 заданиями, работающими параллельно в любое время.

$ cat commands.txt | parallel -j
1
2
15

Для вашего примера curl вы можете сгенерировать тысячи команд curl, выполняя их, скажем, 30 параллельно в любой момент времени.

...