无法连接时错过带有cURL的项目

时间:2018-10-10 18:32:24

标签: bash shell curl scripting

我用curl发送发帖请求,并用while循环

这是我的代码:

send() {
count=1
while read id; do
printf "\e[1;77m[\e[0m\e[1;92m+\e[0m\e[1;77m] Sending message:\e[0m\e[1;93m %s\e[0m\e[1;77m/\e[0m\e[1;93m%s ... \e[0m" $count $counter
IFS=$'\n'
comment=$(curl  -i -s -k  -X $'POST'     -H $'Host: localhost' -H $'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' -H $'Accept: */*' -H $'Accept-Language: en-US,en;q=0.5' -H $'Accept-Encoding: gzip, deflate' -H $'Content-Type: application/x-www-form-urlencoded' -H $'X-Requested-With: XMLHttpRequest' -H $'Connection: close'         --data-binary $'comment_text='$message'&replied_to_comment_id='     $'https://localhost/comments/'$media_id'/add/' -w "\n%{http_code}\n" | grep -a "HTTP/2 200"); if [[ "$comment" == *'HTTP/2 200'* ]]; then printf "\e[1;92mOK!\e[0m\n"; else printf "\e[1;93mFAIL!\e[0m \e[1;77mSleeping 120 secs...\e[0m\n"; sleep 60;  fi; 
sleep 1
let count++
done < id
}

输出为:

[+] Sending message: 1/10 ... OK!
[+] Sending message: 2/10 ... OK!
[+] Sending message: 3/10 ... OK!
[+] Sending message: 4/10 ... OK!
[+] Sending message: 5/10 ... OK!
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 7/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 8/10 ... OK!
[+] Sending message: 9/10 ... OK!
[+] Sending message: 10/10 ... FAIL! Sleeping 120 secs...

在这里我错过了6,7,10

我的输出预期:

[+] Sending message: 1/10 ... OK!
[+] Sending message: 2/10 ... OK!
[+] Sending message: 3/10 ... OK!
[+] Sending message: 4/10 ... OK!
[+] Sending message: 5/10 ... OK!
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 6/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 6/10 ... OK!
[+] Sending message: 7/10 ... OK!
[+] Sending message: 8/10 ... FAIL! Sleeping 120 secs...
[+] Sending message: 8/10 ... OK!
[+] Sending message: 9/10 ... OK!
[+] Sending message: 10/10 ... OK!

1 个答案:

答案 0 :(得分:1)

这是带有一些注释的重构。

send() {
    # indent your code for legibility
    count=1
    while read id; do
        # ditto
        # also double quotes around arguments
        # also FIXME: don't hardcode screen codes
        printf "\e[1;77m[\e[0m\e[1;92m+\e[0m\e[1;77m] Sending message:\e[0m\e[1;93m %s\e[0m\e[1;77m/\e[0m\e[1;93m%s ... \e[0m" \
            "$count" "$counter"
        # ACTUAL FIX: add an inner loop
        while true; do
            IFS=$'\n'
            # Don't gratuitously use $'...' quoting for static strings
            # Wrap for legibility
            comment=$(curl  -i -s -k  -X 'POST' -H 'Host: localhost' \
                    -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0' \
                    -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' \
                    -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: application/x-www-form-urlencoded' \
                    -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: close' \
                    --data-binary "comment_text=$message&replied_to_comment_id=" \
                    "https://localhost/comments/$media_id/add/" \
                    -w "%{http_code}\n" |
                #       ^ remove the silly newline before the HTTP code which you immediately discard with the grep
                grep -a "HTTP/2 200")
            if [[ "$comment" == *'HTTP/2 200'* ]]; then
                printf "\e[1;92mOK!\e[0m\n"
                # On success, break out of while true loop
                break
            else
                printf "\e[1;93mFAIL!\e[0m \e[1;77mSleeping 120 secs...\e[0m\n"
                # Actually sleep 120 secs like it says
                sleep 120  # not 60
            fi
            # Don't sleep again
            #sleep 1
            let count++
        done
    done < id
}

要突出显示实际的修复方法,我们从

while read id; do
    if curl then;
       printf OK\n
    else
       printf FAIL\n
       sleep
    fi
done

进入内循环

while read id; do
    while true; do # <- inner loop starts
        if curl then;
           printf OK\n
           break   # <- break out of inner loop on success
        else
           printf FAIL\n
           sleep
        fi
    done           # <- inner loop ends
done

您可能希望将while true更改为在重试特定次数后或其他情况下中止的内容。