Difference between revisions of "Curl"
Jump to navigation
Jump to search
| Line 171: | Line 171: | ||
echo "Usage: $0 <action> <entry-host> <url> <count> <tcount> <env> <text>" | echo "Usage: $0 <action> <entry-host> <url> <count> <tcount> <env> <text>" | ||
echo "Example: $0 load1 appservice.azurewebsites.net https://www.example.com/path/health 1 5 dev Healthy" | echo "Example: $0 load1 appservice.azurewebsites.net https://www.example.com/path/health 1 5 dev Healthy" | ||
| + | exit | ||
fi | fi | ||
action=$1 | action=$1 | ||
Revision as of 07:04, 23 February 2022
SNI header
curl -k -I
curl --connect-to www.example.com:443:example.a:443 https://www.example.com
curl -sv --resolve $host:443:$ip https://$host
curl --resolve example.com:443:127.0.0.1 https://example.com/
curl -vik --resolve example.com:443:198.18.110.10 https://example.com/
curl.exe --connect-to api.example.com:443:myapp.azurewebsites.net https://api.example.com/mypath/health
curl.exe -w "%{time_total}" --connect-to api.example.com:443:myapp.azurewebsites.net https://api.example.com/mypath/health
tshark -l -i F5_Internal -f 'dst port ( 443 )' -Y 'ssl.handshake.extension.type == "server_name" || http.host' -T fields -e ip.src -e ip.dst -e tcp.dstport -e ssl.handshake.extensions_server_name -e http.host | grep example
Non sni header (port 80 unencrypted header)
curl --header "Host: example.com" http://127.0.0.1/
https://daniel.haxx.se/blog/2018/04/05/curl-another-host/
Testing ciphers
# curl https://www.example.com -k -v --location-trusted --sslv2 curl https://www.example.com -k -v --location-trusted --tlsv1.1 curl https://www.example.com -k -v --location-trusted --tlsv1.2 curl https://www.example.com -k -v --location-trusted --tlsv1.3
for host in 10.1.1.10 10.1.1.52 10.1.1.16 10.1.1.16; do echo $host; curl --header "Host: www.example.org" http://$host/downloads/myfile.png --output /dev/null; done
SNI Spoofing for HTTPS
https://everything.curl.dev/usingcurl/connections/name
https://daniel.haxx.se/blog/2018/04/05/curl-another-host/
BASH Wrapper
#!/usr/bin/env bash
if [[ "$#" -lt 3 ]]; then
echo "Usage: $0 <type> <curl metric> <url>"
echo "Example: $0 url time_connect https://google.com"
echo "
====URL Type Metrics====
time_namelookup
time_connect
time_appconnec
time_pretransfer
time_redirect
time_starttransfer
time_total
"
exit
fi
curltype=$1
metric=$2
url=$3
if [[ "$curltype" == "url" ]]; then
cmd="/usr/bin/curl -w \" %{$metric}\" -o /dev/null -s \"$url\""
metric_value=$(eval "$cmd")
elif [[ "$curltype" == "resolve" ]]; then
if [[ "$#" -lt 4 ]]; then
echo "Usage: $0 <type> <curl metric> <url> <spoof ipaddr>"
echo "Example: $0 resolve time_total https://example.org 127.0.0.1"
exit
fi
ipaddr=$4
host=$(echo "$url" | awk -F/ '{print $3}')
cmd="/usr/bin/curl -w \"%{time_total}\" -o /dev/null -s --resolve $host:443:$ipaddr \"$url\""
metric_value=$(eval "$cmd")
elif [[ "$curltype" == "connect-to" ]]; then
if [[ "$#" -lt 4 ]]; then
echo "Usage: $0 <type> <curl metric> <url> <fqdn>"
echo "Example: $0 connect-to time_total https://example.org myapp-svc.azurewebsites.net"
exit
fi
dstadc_fqdn=$4
host=$(echo "$url" | awk -F/ '{print $3}')
cmd="/usr/bin/curl -w \"%{time_total}\" -o /dev/null -s --resolve $host:443:$dstadc_fqdn \"$url\""
metric_value=$(eval "$cmd")
else
echo "E: Unsupported type of check."
fi
code=$?
if [[ "$code" != 0 ]]; then
# echo error
echo "$metric_value"
else
echo "$metric_value"
fi
load generator using curl
#!/usr/bin/env bash
set -eu
# max_time=.1
max_time=2
# --connect-timeout
# connection_timeout=1
load_url(){
url=$1
adc=$2
text=$3
count=$4
host=$(echo "$url" | awk -F/ '{print $3}')
a=()
for i in $(seq $count); do
curl -m $max_time -s --resolve $host:443:$adc $url | grep -i $text > /dev/null
if [[ $? == 0 ]]; then
a+=(0)
else
a+=(1)
fi
echo $a
done
}
count=5
url="https://example.com/path/health"
adc="myapp.azurewebsites.net"
text="Healthy"
r=$(load_url $url $adc $text $count)
echo $r
adc="lb.example.com"
r=$(load_url $url $adc $text $count)
echo $r
# for value in "${a[@]}"; do
# echo $value
# done
Parallel
xargs -I % -P 5 curl -I "https://linuxways.net" < <(printf '%s\n' {1..10})
seq 1 10 | xargs -I % -P 5 curl -I "https://linuxways.net"
xargs -P 5 -n 1 curl -O < download.txt
xargs -I % -P 8 curl -X POST --header "http://localhost:5000/example" \
< <(printf '%s\n' {1..400})
This will run give curl command 400 times with max 8 jobs in parallel.
https://linuxhint.com/execute-multiple-curl-requests-parallel/ https://stackoverflow.com/questions/46362284/run-multiple-curl-commands-in-parallel
#!/bin/bash
set -eu
if [[ "$#" -lt 7 ]]; then
echo "Usage: $0 <action> <entry-host> <url> <count> <tcount> <env> <text>"
echo "Example: $0 load1 appservice.azurewebsites.net https://www.example.com/path/health 1 5 dev Healthy"
exit
fi
action=$1
entry_host=$2
url=$3
count=$4
tcount=$5
env=$6
text=$7
host=$(echo "$url" | awk -F/ '{print $3}')
# echo $env
a=()
get_url(){
action=$1
entry_host=$2
url=$3
count=$4
tcount=$5
env=$6
text=$7
host=$8
if [[ "$env" == "dev" ]]; then
env_abrv="d"; append=".dev" #dev
elif [[ $env == "prod" ]]; then
env_abrv="p"; append="" # prod
else
echo E: invalid env!
fi
r=$(curl -s --resolve $host:443:$entry_host $url | grep $text > /dev/null || echo 1)
echo -n "$r "
}
load1(){
export -f get_url
start_time=$(date +%s%N)
# seq $tcount | xargs -n 1 -P $count -I {} bash -c "get_url $1"
seq $tcount | xargs -n 1 -P $count -I {} bash -c "get_url $action $entry_host $url $count $tcount $env $text $host"
end_time=$(date +%s%N)
diff_nanoseconds=$((end_time-start_time))
# diff_seconds=$(($diff_nanoseconds / 1000000000))
diff_seconds=$(bc <<< "scale=3; $diff_nanoseconds / 1000000000")
echo ""
echo seconds:$diff_seconds
}
load1